我个人的CRUD故事-或我如何来到CUBA平台

在此博客文章中,我想介绍一下我如何使用CUBA平台以及此工具的好处。 在我年轻的“业务应用程序开发”历史上,我将深入探讨不同的阶段,只为您提供一些背景知识。 因此,让我们从如何进入典型的CRUD应用程序开始,以帮助非技术人员提高生产力。

关于我的CRUD背景的简短历史

多年来,我偶然发现了公司完全不同领域中的同类问题。 从小商店到相当大的企业,人们通常都有一些基本的业务流程,应该加以实现。 这些业务流程通常与输入数据并驾齐驱。

我在租车世界中首先遇到了这类要求。 我工作过的一家公司开始在周末将小挖掘机出租给私人园丁。 显然,他们想安排他们所拥有的一些挖掘机的租赁。

所以基本上这是领域:

具有客户-订单关系的域示例

具有客户-订单关系的域示例

每两本软件工程书中都会发现一个典型示例。

我们从访问数据库之类的东西开始就可以实现我们的目标。 随着业务的增长,对软件的需求也随之增长。

从向用户显示在给定时间范围内租用了哪些产品的订单列表(我应该指出,这是一种非常糟糕的方式),我们想要实现某种更高级的计划视图。 由于用户的位置不只一个,因此基于Web的软件似乎更有意义。 因此,我开始了PHP之旅,那是当时的一个非常流行的选择。

但是真正让我感到奇怪的是这种情况,我不得不一遍又一遍地做同样的事情。 因为除了实际的重要视图(如上面提到的调度视图)外,还有大量的视图和CRUD东西也必须实现。 通常,没有人真正在乎这些屏幕,因为它不支持主要业务流程。 但是,产品,租用地点,用户,角色和所拥有的东西也都希望由用户创建和管理。

在停留在PHP世界中之前(这很早就出现在不同的Framework上,或者至少是“引起我的注意”)–因此,我真的要使用HTML,PHP, PEAR等“裸机”和其他疯狂的东西,例如script.aculo.us 。

脚手架救援

快进-几年,然后进行CRUD项目。 由于计算机科学的研究主要以Java形式进行,因此面向对象是我想到的所有方面。 看来我已经准备好迈出下一步。 正如我们大多数人所知道的那样,用Java做基于Web的软件比痛苦更不是痛苦。 因此,我环顾四周以摆脱过去几年中制作的旧PHP东西。

在此期间,博客上的新孩子是Rails。 诸如CoC , 数据库迁移等引入的Web应用程序概念对我来说非常令人惊讶。 但是有一件事是令人大开眼界的: 脚手架 。 要从定义业务对象的模型出发,从数据库定义到HTML表单以及“ RESTful API”生成完整的堆栈,这是非常必要的。 这让我改变了主意,“我必须以编程方式创建什么,软件/框架/生成器应该为我做什么”。

软件行业的普遍共识是,现在和现在仍然是,必须谨慎对待这些脚手架机制。 这种癫痫症的原因是多方面的。 一件事是,“它不适用于实际应用程序”。 另一个经常听到的消息是“结果UI不符合我们的要求”。

一个由Grails生成的作者和书籍的脚手架示例。

一个由Grails生成的作者和书籍的脚手架示例。

考虑时,这是绝对正确的。 因为有了(G)Rails之类的框架,您便拥有了通用工具。 这意味着它不直接与某些类型的应用程序绑定。 您可以创建具有高度优化的ui的在线商店,就像可以实现各种应用程序一样为基于Javascript的胖客户端创建RESTful HTTP后端。 您可以像企业应用程序一样执行CRUD,就像为公司的营销活动创建响应式网站一样。

Web应用程序世界中可实现的应用程序空间

Web应用程序世界中可实现的应用程序空间

因此,脚手架不能解决所有这些问题,因为范围太宽。 这就是为什么这些脚手架尝试的结果会以域类型的CRUD接口结束的原因,从UI的角度以及功能上来看,域类型都有一定的局限性。 完全可以,因为这些框架的重点从来没有放在支架的方面。

“特定于域”取决于角度

尽管我说过,Rails都是通用的 ,但Martin Fowler 告诉我们这不是通用的 ,而是特定于领域的 。 我是谁,他是最初的敏捷宣言的一部分 ,是重构的作者,是Refactoring的作者,还有很多其他好东西,这推动了软件行业的发展?

问题是, 特定领域是一个非常通用的术语。 从Java Servlets的角度来看,Rails绝对是特定于域的,该域是“带有关系数据库后端的Web应用程序”。 对于更通用的Spring MVC与基于Spring(MVC)的全栈Framework Grails,也是如此。 另一方面,Java Servlet比使用套接字更加具体,因为您受HTTP约束。

从通用到特定于Web开发领域的领域

从通用到特定于Web开发领域的领域

当我在图的第二层中的这些框架中创建大多数像CRUD的业务应用程序时,我认为如果存在一类框架/平台,该方案可以更好地满足业务应用程序的要求。 当我们将关注点进一步缩小到这部分应用程序时,脚手架可能会创造出真正可用的东西。

几个月前,我通过Java代码极客的一篇文章了解了CUBA平台 。 CUBA主要是一个商业“框架”,它的口号是:“一个用于加快企业软件开发速度的高级Java框架”。

乍一看,它看起来就像是另一个具有共同部分的Web框架。 OR-Mapper,依赖注入,脚手架,UI等。 与其单独创建所有子部分,不如使用Grails一样,它使用一种元框架方法。 OR-Mapper是JPA(EclipseLink),Spring for DI,Vaadin作为UI框架。

通用的新类别–特定领域的维度?

在深入研究之后,我意识到,这件事似乎与我之前在Web开发领域中看到的有些不同。

所不同的是,CUBA的作者走的是“特定领域”之路,正如我在上图中所想到的那样,确实专注于缩小“企业软件开发”的范围。 考虑到这一点,作者能够提出更多的意见。 固执己见的框架通常会提高生产力(如果您遵循生活方式)(就像Rails世界中的“ The Rails way ”一样)。

CUBA平台似乎也是如此。 自从我第一次使用Rails来支持PHP / Java以来​​,遵循他们对过滤,安全性,报告等内容的意见就极大地提高了生产率。

短语“快速应用程序开发”在这里确实具有另一个含义。 这是由于多种原因。

是什么让这

业务应用程序的域模型通常具有许多实体以及它们之间的连接。 这将导致一个UI,您必须在其中创建实际工作流程中的许多相关实体。

首先,他们完全正确地获得了业务应用程序所需的基本内容。 CUBA创建了一个可以完全满足这些需求的脚手架UI。 它基于他们为两个实体可以具有的不同样式的关联做出的不同选择。 一对多一对一关联通过PickerField表示,“ 多对多”关联关联创建一个添加/删除表,而“ 一对多”关联将在实体的详细视图中创建一个表,该表包含一个侧。

使用这些简单但令人难以置信的强大工具,您可以在数分钟内用相似的复杂UI创建一个非常复杂的域模型,这使通过UI创建相关实体的图变得很高兴。

第二部分是通用过滤器解决方案。 感觉有点像您可以从Excel的附加功能中了解到的过滤可能性,您可以过滤表所基于的实体的关联。 这真是太神奇了,并且不需要开发人员手动创建的大量自定义过滤器编程。

接下来,有一个完整的安全子系统。 它基于ACL方法,该方法允许您作为用户创建用户,组,角色,使您可以在视图,实体(+属性)以及实体实例级别上分割应用程序。 创建满足以下要求的应用程序(在这种情况下创建仅表示:使用软件)没有问题。

  1. 纽约的经理看到纽约的所有客户
  2. 纽约销售人员会看到他们在纽约创建的所有详细信息的客户。 SF客户仅显示属性“名称”和“城市”,其中只能编辑“名称”。
  3. TX(总部)的经理可以从所有位置查看所有客户,但无法对其进行编辑

使用全面的UI来管理这些事情,几乎不需要实现本地的安全解决方案。

此功能列表可能会持续很长时间。 我没有介绍报告部分,也没有介绍业务流程管理,计划的任务,HTTP-JSON API,Fat Client生成,不同的管理可能性等。 我可能会在以后的博客文章中进一步介绍。

这一发现的实质

当看到所有这些不同的部分时,CUBA与编程框架的不同之处在于在这些技术框架之上添加了不同的“平台”功能。 这些东西使程序员可以更加专注于业务问题。 尽管这是不言而喻的,但这原则上是一件好事。

问题是,作为程序员,这通常很难想象。 我们这些技术人员热衷于使用NTLM身份验证摆弄直到我们获得用于输入订单实例的完美用户界面 ,或者为API创建超媒体驱动的RESTful HTTP接口 。 我们想要创造事物,这完全是我们产业的基础。

换句话说,您可以从另一个角度看它。 我们可能已经从Isacc Newton, Scott Hanselman或Sheldon Cooper那里知道:

我们都站在巨人的肩膀上

在软件开发领域尤其如此。 从底层开始,像所有电气工程一样,主要的硬件抽象是:操作系统,通过HTTP等网络协议,诸如关系数据库之类的数据存储机制,直至Servlet,Rack和Rails等API和框架。 所有这些使我们作为业务软件开发人员能够基本创建这些分布式,可扩展且易于使用的生产力工具。

考虑到这一点,从字面上看,没有理由不提任何可能的抽象字母。 显然,这种一般性建议必须谨慎对待。 有很多充分的理由来使用C以及Plain Java Servlets或CUBA开发软件。

归结为这种“正确的工作工具”之类的东西。 当您要创建典型的企业应用程序(指甲)并且附带此CUBA(锤子)时,它非常适合。 另一方面,这种含义不应让任何人认为,一切都是钉子。

我绝对建议你检查出CUBA尤其是不同的在线演示,你会发现在这里 。

  • [编辑2015-10-30:添加了说明,CUBA是一种商业产品]

翻译自: https://www.javacodegeeks.com/2015/11/my-personal-crud-story-or-how-i-came-to-cuba-platform.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL分库分表环境下全局ID生成方案

转自:https://my.oschina.net/u/142836/blog/174465 在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用…

java 不定参数方法_java中不定长参数的使用方法

java中不定长参数的使用方法不定长参数方法的语法如下:返回值 方法名(参数类型...参数名称)在参数列表中使用“...”形式定义不定长参数,其实这个不定长参数a就是一个数组,编译器会将(int...a)这种形式看作是(int[] a)的形式。示例&#xff1…

光盘刻录只允许读取不能拷贝_原来 8 张图,就可以搞懂「零拷贝」了

作者 | 小林coding来源 | 小林coding(ID:CodingLin)前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是…

如何:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf,并且需要在视图中格式化Java 8 Date&Time对象,则可以使用thymeleaf-extras-java8time –用于Java 8 Date&Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题。我大概是分成了Java基础、中级、高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调…

c++ 多核cpu序列号_详解CPU几个重点基础知识

作者 | 骏马金龙责编 | 阿秃关于CPU和程序的执行1、程序的运行过程,实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后,CPU要从内存中取出指令,然后指令解码(以便知道类型和操作数,简单…

5.8上午

数学分册基础概念 转载于:https://www.cnblogs.com/yanyuying/p/6828791.html

java log4j 写日志_Java log4j同时写入文本日志和数据库日志

版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创!恰饭广告Log4jUtil.javaimport org.apache.log4j.Logger;import org.apache.log4j.MDC;public class Log4jUtil {private static Logger logger Logger.…

订单生产计划表范本_工厂生产管理为什么需要ERP软件?

对于工厂来说,规模大了,管理问题也就随之多了,在工厂生产流程中,我们常见的一些生产现象,比如生产计划表徒具形式、各生产部门半成品堆积、生产计划达标率低、前后工序原材料或半成品衔接不上、经常追加或取消生产计划…

codeforces 701 E. Connecting Universities(树+ 边的贡献)

题目链接:http://codeforces.com/contest/701/problem/E 题意:有n个城市构成一棵树,一个城市最多有一个学校,这n个城市一共2*k个学校,要对这2*k个学校进行连边,使得所有连出来的边的和最大,每条…

拜托,Java。 最终是否支持多行字符串文字

我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API(例如集合)的想法很难打破。 是。 我不明白为什么Java 仍然没有多行字符串文字。 您多久编写一次这样的JDBC代码(或您想嵌入Java的任何其他外部语言或标记,例…

java memorystream 包_MemoryStream

MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。1、MemoryStream类封装一个字节数组,在构造实例时可以使用一个字节数组作为参数,但是数组的长度无法调整。使用默认无参数构造函数…

网站pc端分享QQ好友,空间,微博

在开发pc端网站的过程中,涉及到邀请好友的功能,之前单纯的复制粘贴已经无法满足用户的体验。故,仿照移动端添加自动分享到QQ好友,QQ空间,QQ微博的功能。 分享到QQ好友:http://connect.qq.com/widget/shareq…

python如果选择不在列表里_Python-list.remove(x)x不在列表中

我正在尝试在Python 3.3中创建一个简单的程序,该程序采用四个名称的列表,并将它们随机分配给列表中的另一个人.例如,如果名称是John,Aaron,Lydia和Robin: 约翰先走,然后选择一个名字.他不能画自己的东西.如果他这样做,他会把它放回去并再次抽签.说约翰画了罗宾的名字…

P1266 速度限制

速度限制 洛谷链接 题目大意: 在一个城市中,每条道路有限速和长度,通过一条道路的时间为这条道路的长度除以限制的速度,有的道路不知道限速为多少,那么就按现在的速度走这条路,找出从第一个点到目标点的最短…

dbunit测试dao_用于数据库测试的DBUnit,Spring和注释

dbunit测试dao如果您曾经尝试用Java编写数据库测试,则可能会遇到DBUnit 。 DBUnit允许您设置和拆除数据库,以便它包含可针对其编写测试的一致行。 通常,您可以通过编写一个简单的XML文档来指定要DBUnit插入的行,例如: …

python自动化之正则

import re phoneNumRegexre.compile(r\d\d\d-\d\d\d-\d\d\d\d) mophoneNumRegex.search(My number is 415-555-4242.) print(Phone number found: mo.group()) #######利用括号分组############## phoneNumRegexre.compile(r(\d\d\d)-(\d\d\d-\d\d\d\d)) mophoneNumRegex.searc…

mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...

题目解读题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时候非常困难)。…

发现大量Java原语集合处理

在阅读博客文章5减少Java垃圾收集开销的技巧时 ,我想起了一个名为Trove的小型Java收集库,该库“为Java提供了高速的常规和原始收集”。 我对应用Trove允许原始类型的集合而不是要求集合中的元素成为完整的引用对象的能力特别感兴趣。 我在这篇文章中会更…

51nod1244 欧拉函数之和 杜教筛

和上一题差不多&#xff0c;一个是μ*Ie&#xff0c;一个是φ*IId 稍改就得到了这题的代码 &#xff08;我会告诉你我一开始逆元算错了吗&#xff09; 1 #include <bits/stdc.h>2 #define MAX 50000003 #define MOD 10000000074 using namespace std;5 long long a,b,N;6…