早在 2008 年,我有机会参与开发一个使用 Java 编写的有趣的交通预订系统。前端是建立在RichFaces之上的,这是太阳微系统Java服务器面的前组件框架。业务逻辑被放置在由 Spring 框架管理的服务类中,持久层构建在Hibernate ORM 框架上。
在实施之前,由经验丰富的分析师进行了分析;大多数开发团队由具有创建 Java Web 应用程序经验的开发人员组成。就记录而言,上述技术对于团队来说相对较新,但在工作负载估算中考虑到了这一风险因素。
第一反应是积极的,部分归功于JSF组件的整洁外观与嵌入式AJAX支持。随着时间的流逝,发展开始放缓。JSF组件(基于XML文件)的维护变得越来越困难,安全重构是不可能的,并且对前端的重用也很困难。
Typos 在服务层中堆积到方法引用,而 Java 的编译器(通过设计)无法识别它们。在项目的最后阶段,工作开发人员的数量比之前的预期几乎翻了一番。尽管如此,它无法在预期时间内完成与预期质量。不幸的是,麻烦并没有止步于其中。
对真实数据的使用揭示了意外的操作问题。在错误修复和查询性能优化期间,使用 Hibernate 框架实现的时间节省逐渐减少,这在 JDBC 中效果良好。可能我们缺乏Hibernate框架的经验在某种程度上导致了这些问题,因此我认为学习该框架需要很长时间才成为其主要缺点。
您可能还喜欢:前5个课程,以学习深度休眠。
相比之下,主要处理依赖注入和数据库事务的 Spring 框架的使用是顺利和无问题的。这个项目最终被客户接受了,但开发带来的苦涩却一直伴随着我,我意识到有些事情可以以不同的方式工作。这是我开始写一个框架的时刻,今天被称为Ujorm。
Ujorm 基于域键值类型对象,其中用于写入值的键也用作属性描述符,提供一些服务,如链接。这种域对象的体系结构一方面提出了一种(相对)创建某些算法的新方法,另一方面也引起了一些争议。
最初的公共Ujorm版本引入了XML文件持久性,jWorkSheet桌面应用用它来跟踪项目花费的时间。后来,创建了一个包含方言的 ORM 模块,该模块以多个数据库产品为对象wikipedia.org/wiki/Apache_Wicket”rel=”nofollow”目标\”\blank”_ApacheWicket Web框架最终被制作成。2013 年,我发布了一个简单的 Web 应用程序,用于酒店预订(称为演示酒店),以便呈现实现 Ujo 界面的对象的有趣用例场景。该项目只包含一个为简单起见而设置的域对象,请在此处试用。
发布此应用程序后,我得到了一个机会来重写管理实际分包商服务的项目。项目的体系结构已更改,服务类被转移到指定的服务器,通信通过 WS SOAP 进行中介,在服务器上启动了第三方 serici 的集成,但初始技术得以保留。
现在,这里来了故事中最有趣的部分:一个模块的开发只用了3个星期。然而,根据我的经验,JSF/JPA中的同样实施需要三个月的工作。一些人可能会认为这个估计太悲观了,我不能排除其他人更快地创造它的可能性。
话虽如此,如果有人想争议这些时间之间的明显区别,我鼓励他们重写演示酒店JSF(在XHTML模板上)与JPA/休眠持久性,然后比较两个项目的源代码的大小。我估计演示酒店项目将是后者的四分之一。
但是,较小的源代码大小不一定是高效开发的唯一指标。因此,我建议重命名Hotel.name实体的属性,并填写新的参数,允许用户通过 GUI 为每个表分别配置页面上的行数。虽然编辑后演示酒店的错误很容易被发现,甚至由初级程序员感谢编译器(如果IDE不自动重构),在JSF/JPA场景中,这种编辑的难度将在很大程度上取决于程序员的经验。
结论
静态常量的方法似乎与泛型类型和将值写入域对象的方法一起在其时代是唯一的。然而,在服务或文档方面,Ujorm 确实无法与竞争对手竞争。今年将标志着第一个 Ujorm Framework 的 ORM 模块版本十年,从那时起,它被部署到不同的生产服务器上,据我所知,没有重大的运营问题。然而,大规模部署并没有发生。