为什么要分层呢?——大部分人是为了分层而分层,比如我们以前的一个做法就是强制一个实体对应一个dao、一个service一个action等等,就像是写八股文章,还美其名曰规范化,为了以后好维护。结果都是一两行的代码在几层之间包来包去。
我觉得分层最主要的目的是解耦。很多人可能觉得分层是为了分类职责,这可能是分层带来的一个好处,但不是主要目的。要的目的是解耦,解耦的主要目的是应对变化。比如我分一个dao层,可以屏蔽掉hibernate或jpa或jdbc的具体实现,这样我可以切换不同的实现了。你看spring里边的petstore例子提供了不同的实现。
问题是对于变化我们应该什么态度。我觉得应该在三个方面考虑:1.变化发生的可能性和机率;2.提前准备应对这个变化要增加的成本(包括机会成本)3.如果不提前考虑这个变化,以后通过重构来应对的代价。
比如你有多大的可能要切换hibernate到jdbc或其他的实现呢?如果hibernate已经被证实足够稳定,那依赖它有什么问题呢?就像你依赖java.util一样是吧。这种被Rod JSon成为“幻影需求”提前为此而分层实在不值得吧。其实就算你分了层以后切换的时候还是会有很多问题的(比如你用了hibernate的二级缓存、关联关系要是切换到其它实现,很容易引入潜在的问题),除非你的应用就像petstore一样简单。所以与其这么做,不如完善你的测试,如果变化来了,有测试做保障,提炼重构付出的代价不一定比你提前预防这种变化的的代价要大很多。而且一定要考虑这种变化的机率的大小。
分层的另一个好处是可以做孤立测试,说白了就是分离职责然后单独测试。但我前面说过分离职责不一定要分层的,如果这种情况不是很多,你可以把业务复杂职责单一的功能放在同一层中另外一个类中。
我现在的做法是用spring web flow做控制层,不需要java代码,只要xml的flow定义,其中调用service层。这个service层负责事务边界也代理业务,service方法中直接调用JPA接口。domain对象除了jpa等元数据的映射,提供一些get方法(我是说计算方法,比如getTotalSize()),还提供一些验证逻辑。页面使用Rich Faces。
service测试大部分不做mock,而是连接数据库做测试,spring test框架支持自动回滚,可以用dbunit初始化测试数据就可以了。业务计算复杂的,如果不依赖于数据存储,应该放在domain对象中,否则,提炼出一个service类,这样对这段逻辑就可以做孤立测试了。domain就是普通的javabean,测试自然没有问题。
可能以后还想加上selenium做验收测试,现在还没有加。
分享到:
相关推荐
工作流程明细:开发领域模型工作流程明细:开发领域模型
领域模型最近代码实现 领域模型最近代码实现 领域模型最近代码实现
IOCP模型总结:里面有理论总结和代码实现
计算机组成原理实验报告一四:基本模型机设计与实现
数学建模:统计模型.PPT 总结得很好,分享给各位。大家感兴趣的拿
3.3.4 实现项目信息视图模型 3.3.5 实现项目信息视图 3.4 总结 第4章 公司和联系人 4.1 问题 4.2 设计 4.2.1 设计领域模型 4.2.2 定义company聚合和contact聚合 4.2.3 定义聚合边界 4.2.4 设计仓储 4.2.5 ...
523-8-量化策略周报:拥挤度模型观点
完整英文版 IEC 62264-6:2020 Enterprise-control system integration - Part 6:Messaging service model(企业...该模型被称为信息服务模型(MSM),旨在实现制造运营领域的应用和其他领域的应用之间的互操作性。
2训练数据集:ChatGPT需要大量的训练数据集,通常使用互联网上的大规模文本数据集,例如Wikipedia、Common Crawl、Gutenberg等,也可以使用特定领域的数据集进行微调。 3预处理工具:在训练模型之前,需要进行数据...
本文研究了将模型应用于金融领域时的AI模型的可解释性。 我们分析黑匣子问题的原因并探索有效的解决方案。 我们提出了一种新型的Regtech自动化工具LIMER,并提出了政策建议,从而不断推动Fintech的发展。
提升代码质量的方法:领域模型、设计原则、设计模式.docx
1.领域:matlab,逆Preisach模型双线性插值算法 2.内容:题目,通过MATLAB实现逆Preisach模型双线性插值数值仿真+代码操作视频 3.用处:用于逆Preisach模型双线性插值算法编程学习 4.指向人群:本硕博等教研学习...
领域模型代码示例
威胁即刻存在 面临的问题 图结构可视化 图构建 异常发现 方法流程 图节点角色模型 时序动态角色模型 多目标回归模型 攻击场景模拟 异常检测 总结
该算法对数据集的泛化能力强,不易过拟合,且能够处理高维数据,因此在众多领域都有广泛的应用。 以下是关于这个基于MATLAB实现的随机森林分类代码的简要介绍: 1. **集成学习**:利用多个决策树的集成方法,提高...
有限扩散集团凝聚模型(DLCA)定义及MATLAB中的实现:动态实现胶体颗粒脱稳并形成微小聚集体的过程
现代OpenGL+Qt学习笔记之四:使用Uniform变量实现对模型的旋转http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77944140源码
模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+...
什么是领域(Domain)? 我们所做的软件系统的目的都是来解决一系列问题,例如做一个电商系统来在线销售自己企业的产品;做一个灰度发布平台来提升服务的质量和稳定性。任何一个系统都会属于某个特定的领域,例如: ...
特征模型作为捕获领域需求的重要模型已被现阶段的主流领域工程方法所接受,但这些方法缺乏对特征模型组织框架的细致研究和说明,在一定程度上导致了特征模型在表现形式上的冗余性和混乱性,也使得领域分析人员在实践中...