`

分离领域——将各层关联起来

 
阅读更多

将各层关联起来

到目前为止,我们的讨论主要一种在层次划分以及如何分层才能改进程序各个方面的设计上,特别是集中在领域层上。但是显然,各层之间也需要互相连接。在连接各层的同时不影响分离带来的好处,这是很多模式的目的所在。

 

各层之间是松散连接的,曾与层的依赖关系只能是单向的。山层可以直接使用或操作下层元素,方法是通过调用下层元素的公共接口,保持对下层元素的引用(至少是暂时的)以及采用常规的交互手段。而如果下层元素需要与上层元素进行通信(不只是回应直接查询),则需要采用另一种机制,使用架构模式是来连接上下层,比如回调模式或observers模式。

 

最早将用户界面层与应用层和领域层相连的模式是Model-View-Controller(MVC)框架。他是为Smalltalk语言发明的一种设计模式,创建于20世界70年代。随后出现的许多用户界面架构都是受到他的启发而产生的。

 

还有许多其他连接用户界面层和应用层的方式。对我么而言,只要连接方式能够维持领域层的独立性,保证在实际领域对象时不需要同时考虑可能与其交互的用户界面,那么这些连接方式就都是可用的。

 

通常基础设施层不会发起领域层层中的操作,他处于领域层“之下”,不包含其所服务的领域中的知识。事实上这种技术能力最常以service的形式提供。例如,如果一个应用程序需要发送电子邮件,那么一些消息发送的借口可以放在基础设施层中,这样,应用层中的元素就可以请求发送消息了。这种解耦是程序的功能更加丰富。消息发送接口可以连接到电子邮件发送服务、传真发送服务或任何其他可用的服务。但是种方式最主要的好处是简化了应用层,使其只专注于自己所负责的工作:知道何时该发送消息,而不用操心怎么发送。

 

应用层和领域层可以调用基础设施层所提供的Service。如果Service的范围寻则合理,接口设计完善,那么通过把详细行为封装到服务接口中,调用程序就可以保持与Service的松散连接,而且不会那么复杂。

 

然而并不是所有的基础设施都是以可供上层调用的Service形式出现的。有些技术组件被设计成直接支持其它层的基本功能(比如为所有的领域对象提供抽象基类),并且提供关联机制(比如MVC以及类似的框架实现)。这种“架构框架”对于程序其他部分的设计有着更大的影响。

 

架构框架

如果基础设施通过接口调用Service的形式来实现,那么如何分层以及如何保持曾与层之间的松散连接就是相当显而易见的。但是有些技术问题要求更具侵入性的基础设施。整合了大量基础设施需求的框架通常会要求其他曾以某种特定的方式实现,不如意框架类的子类形式或者带有结构化的方法签名。(子类在父类的上层似乎是违反常理的,但是要记住那个类反映了另一个类的更多知识。)最好的架构框架既能解决复杂技术问题,也能让领域开发人员集中精力去表达模型,而不考虑其他问题。然而使用框架很容易为项目制造障碍:要么是设定了太多的假设,减少了领域涉及的可选范围;要么是需要实现太多的东西,影响开发进度。

 

项目中一般都需要某种形式的架构框架(尽管有时项目团队选择了不太合适的框架)。当使用框架时,项目团队应该明确其使用目的:建立一种可以表达领域模型的实现并且用它来解决重要问题。项目团队必须想方设法让框架满足这些需求,即使这意味着抛弃框架中的一些功能。明智而谨慎的选择框架中最具价值的功能能够减少程序实现和框架之间的耦合,是随后的设计决策更加灵活。更重要的是,现在许多框架的用法都齐齐复杂,这种简化方式有助于保持业务对象的可读性,使其更富有表达力。

 

架构框架和其他工具都在不断发展。在新出现的框架中,越来越多的技术问题会自动得到解决或者被预先设定好解决方案。如果框架使用得当,那么程序开发人员将可以更加专注与核心业务问题的建模工作,这会大大提高开发效率和程序质量。但与此同时,我们必须保持克制。不要总是想着寻找框架,因为精细的框架也可能会束缚住程序开发人员。

 

模型属于领域层

现在大部分软件系统都采用了Layeared Architecture,只是采用的分层方案存在不同而已。许多类型的开发工作都能够从分成中受益。然而,领域驱动设计之需要一个特定的层存在即可。

 

领域模型以一系列概念的集合。“领域层”则是另有模型以及所有与其直接相关的设计元素的表现,他有业务逻辑的设计和实现组成。在Model-Driven Design中,领域层的软件构造反映出了模型概念。

 

如果领域逻辑与程序中的其他关注点混在一起。就不可能实现这种一致性。将领域实现独立出来时领域驱动设计的前提。

 

 

分享到:
评论

相关推荐

    化工原理离心分离设备讲稿PPT学习教案.pptx

    本文将深入探讨离心分离技术的核心概念——离心沉降速度,以及旋风分离器的操作原理及其性能分析。 首先,让我们聚焦于离心沉降速度这一核心概念。与重力沉降速度不同,离心沉降速度是基于离心力的分离原理。在离心...

    其他非均相物系分离方法.docx

    在现实生产中,往往需要将不同的分离方法结合起来,以实现最佳的分离效果和工艺效率。 例如,一些工厂可能会先用惯性分离器去除大颗粒,然后使用文丘里除尘器来处理更细微的尘粒,最后通过泡沫除尘器进行最终的清洁...

    征服Spring AOP—— Schema

    3. `<aop:advisor>`:顾问元素,它将切入点与通知关联起来。顾问包含了何时以及如何执行通知的信息。 4. `<aop:aspect>`:定义一个切面,可以包含多个通知和切入点。切面可以看作是封装了多个相关通知的逻辑单元。 ...

    数学建模——肾炎诊断

    《数学建模——肾炎诊断》 在医学领域,数据驱动的决策支持系统已经成为辅助医生进行疾病诊断的重要工具。本文探讨了如何运用数学建模,特别是统计学中的Fisher判别法与马氏距离判别法,来识别肾炎患者。这两种方法...

    09新课标生物考点预测——遗传的基本规律.docx

    【标题】:“09新课标生物考点预测——遗传的基本规律.docx” 【描述】:“09新课标生物考点预测——遗传的基本规律.docx” 本文档主要关注高中生物学中的一个重要考点,即遗传的基本规律。遗传的基本规律是新课标...

    重构——改善既有代码的设计 中文版

    2. **将双向关联改为单向(Change Bidirectional Association to Unidirectional)** - **定义**: 修改两个类之间的双向引用关系,使其变为单向引用。 - **目的**: 减少类间的耦合度,提高代码的可维护性和可测试...

    多通道盲电磁辐射现场分离方法研究.docx

    为了解决上述问题,本文提出了一种基于小波分解、相关性筛选以及独立成分分析(ICA)的多通道盲电磁辐射现场同步分离方法——WICA算法。 - **小波分解**: 首先,利用小波分解技术对每个通道的信号进行预处理,构造...

    Qt4.6——白皮书

    ### Qt4.6——白皮书:跨平台GUI应用程序开发框架详解 #### 一、引言 ##### 1.1 执行摘要 Qt是著名的跨平台C++应用程序框架,其核心理念是“编写一次,到处编译”,允许开发者在单一源代码库的基础上,轻松为多个...

    ASP.NET源码——[学校班级]悠索科技教师评价系统.zip

    通过研究这个教师评价系统的源码,开发者可以学习到如何在ASP.NET环境下实现一个完整的Web应用,理解各层次架构的设计思想,以及如何处理特定领域的业务逻辑。同时,这也为其他学校或教育机构提供了一个可参考的模板...

    数据库设计实验——医疗保险总控系统.rar

    例如,将重复组分离开来,确保每个表只存储单一类型的信息。 三、ER图绘制 在实验中,参与者会用到ER图工具来可视化实体、关系和它们的属性。这有助于更好地理解数据结构,并在设计过程中发现潜在的问题。 四、...

    国有企业改制方法——企业资产剥离.pdf

    资产剥离指的是将企业的一部分资产分离出来,形成独立的实体或转移到其他企业,以优化资源配置,减轻企业负担,提升核心竞争力。在本文中,我们将探讨企业资产剥离的背景、目的和具体实施。 在国有企业中,过宽的...

    重构——改善既有代码的设计

     Separate Domain from Presentation 将领域逻辑与表现分离   Extract Hierarchy 提取继承层次  Chapter 13:Refactoring,Reuse,and Reality(by William Opdyke) 重构,复用与现实   A Reality Check 现实的...

    SpringBoot+Vue实现汽车销售管理系统前后端分离项目.zip

    本项目——"SpringBoot+Vue实现汽车销售管理系统前后端分离项目",旨在利用现代Web技术为汽车销售业务提供一套高效、便捷的解决方案。以下是该项目的核心知识点和实现细节: 一、SpringBoot框架的应用 SpringBoot是...

    轻量级J2EE企业应用实战——Struts+Spring+Hibernate整合开发 源码第一部分

    Hibernate通过映射机制将Java对象和数据库表进行关联,减少了数据库操作的复杂性,增强了代码的可读性和可维护性。 【整合开发】Struts、Spring和Hibernate的整合通常被称为SSH框架,这种整合可以实现更高效的应用...

    数据管理 数据的操纵和检索——综合数据库管理系统.doc

    ### 数据管理:数据的操纵与检索——综合数据库管理系统 #### 数据管理挑战与需求背景 在传统的文件处理方式中,文件被视为独立的逻辑实体,并且往往与特定的业务领域紧密关联。这种方式导致了一系列的问题: 1. ...

    电子政务-一种电路板钻孔粉分离机功率控制器.zip

    标题中的“电子政务-一种电路板钻孔粉分离机功率控制器”揭示了这个主题与电子政务和电子设备制造,特别是电路板生产流程中的一个特定环节——钻孔粉分离及功率控制有关。电子政务通常指的是政府机构利用信息技术...

    TS流分析与分离程序

    在描述中提到的功能——“能对TS流文件进行分析并分离除video和audio”——意味着该程序具备以下关键技术点: 1. **TS包解析**:TS是由固定长度的包组成,每个包通常为188字节。程序需要识别包头,确定包的类型,如...

    iOS游戏应用源代码——peyton-MOOPullGesture.zip

    在iOS开发领域,游戏应用一直是热门话题,而源代码分析则是提升开发者技能的重要途径。本篇将深入探讨名为“peyton-MOOPullGesture”的iOS游戏源代码,通过分析其核心组件、手势识别以及交互设计,来揭示其背后的...

    ASP,NET源码——[新闻文章]MilesXNA v0.69 Beta Build.zip

    数据库操作通常使用ADO.NET或Entity Framework进行,而数据绑定则将服务器端的数据与用户界面动态关联起来,使得数据的更新能够实时反映在页面上。 此外,ASP.NET MVC(Model-View-Controller)框架也可能被用在该...

Global site tag (gtag.js) - Google Analytics