产品框架初步设计后,如何为每个部件定义一个清晰的职责范畴?

设计之初,我们必须对整个产品的基本概念和框架有一个初步的设计,这个设计也不可避免地成为整个产品的基础轮廓。

如何定义合理的层数

具体到将要设计的仓库管理流程控制框架产品,首先就要划分为不同的服务层次,而且要找到一种平衡,使得设计既能够将应用划分为有意义、可处理的部件,使它们可以独立开发和部署,同时又要避免过度分解,不能将自己淹没在太多的细节中,从而丧失对整个系统远景的把握或者带来运行问题,如性能、可伸缩性等。本系统将其分为不同的5层,如下图所示。

要注意到,定义的层数越多,端到端的控制流需要穿越的中间层就越多,可能会引入性能问题(特别是在层与层之间是远程的时候)。在同一层内,我们可以再进一步划分为若干易于处理的部分,这些部分应该能够进行独立的开发和升级。这些完备且内聚的职责会被实现为一个单独的领域对象。

这种对仓库管理流程控制系统中不同关注点的严格区分,有助于我们将功能的“大泥球”划分成切实可行的抽象层次,每一层包含具有公共稳定性的元素,从而可以独立地开发和修改而不会影响其它部分产生意外后果。

关注点的进一步细化

仅仅分为不同层次对基于服务组件的软件开发来说粒度太粗了,因为它们仅仅将不同抽象层次的功能关注点区分开,而没有将同一抽象层次不同的功能关注点区分开。例如,仓库管理和物流控制的关注点是完全不同的,但是我们仍有可能在开发过程中将其交织在一起。

问题:怎样将分层系统提炼成更小的、严格划分的领域对象或部件,并为每个部件定义一个清晰的职责范畴呢?

对策:需要为每个完备的、内聚的、功能相关的职责提供一个领域对象(Domain Object),从而严格划分、封装并组件化同一抽象层次上的不同的业务职责。

解决方案:由于系统规模庞大,必须面对多样性业务,而且需求还会不断变化,所以整体上采用面向服务的分布式系统。

从服务的层次来说,总体上分为基础、业务、应用三大服务层。为了便于应用,每个服务层提供了完整的企业服务总线,以集成接口、用户注册、权限管理、安全机制、消息传递等功能。

这样既减少了每一部分规模,也极大地减少了相互之间的耦合性,提升了适应变化的能力。

下图描述了简化的分层结构,对每一个分离出的领域对象,还需要标识出它们的依赖关系,以及相应的接口。

每个服务包是完全独立内聚的,可以独立设计、开发与维护,相互间的接口实现了依赖倒置原则,并且根据用户不同分离了接口,而接口设计切忌主观武断,具体的的做法是:

  • 首先确定各个领域对象的依赖关系。
  • 凡是具有依赖关系的都设定接口。
  • 该结构的详细设计必须等下一层设一完成后再进行。
  • 详细设计的时候,首先由上层设计者提出信息的需要。
  • 再由下层提供者提出接口的规划。
  • 最后由首席架构师做出接口设计的决定。

整个层次接口各层次的说明如下:

在系统的表现层:我们应该区分必须提供的不同“北向网关”和“客户端应用”。

在业务处理层:不论各种类型仓库有多么大的不同,业务处理都包含两个大的部分:“仓库管理”和“物流控制”。我们首先将仓库管理功能和物流控制功能分开,仓库管理功能包含所有的管理性任务,而物流控制功能控制实体层的系统。

在基础设施层:不论何种类型的仓库,有几个基础类型的功能都是存在的,例如:“报表”、“日志”以及“持久化”,这几个不同的功能,如日志、报表和持久化也可以分开。

在访问层:可以为每一个支持的实体层系统提供一个单独的“南向网关”,以实现对实体注意:现实世界的仓库管理流程控制系统中,业务处理、业务对象以及基础设施层包含更多的功能,如警告管理、监控以及安全等,这里作为一个案例,进行了适当简化。此外,根据需要,我们用UML 标记的包符号来表示一个领域对象服务。包符号允许我们表示的领域对象可以像服务一样包含多个组件或类。

时间: 2024-08-02 02:42:51

产品框架初步设计后,如何为每个部件定义一个清晰的职责范畴?的相关文章

VS2010 数据库框架比较后出现text lines should not be null错误

在前段时间里由于VS2010的其他问题(见这个http://www.cnblogs.com/churun/p/4821548.html),我重装了VS2010软件,因为我的VS2010是打了SP1补丁的,所以SP1补丁也重装过,其他问题解决了,又出现数据库框架比较后出现text lines should not be null错误,导致VS2010崩溃. 查找了一下信息,在这里找到了相关资料http://www.cnblogs.com/zyzlywq/archive/2012/02/21/236

SSH基本框架搭建后的简化

对于SSh框架的简化,我们可以从下面几个方面来剖析: 1.实体类entity:在这里我们需要将数据库和实体类进行关联,在简化之前,我们需要在entity包里面加入一份.xml配置文件 例如原码----> 而在简化之后就不需要这份.xml文件,可以直接删除.我这里暂时没有自己项目简化后的截图, 所以只能在其他地方找了一些,自己做了一些解释 当然在图上的现在写的还是比较简单基础的,,对于其他的外键以及关联主键和各个数据类型字段的描述还没有. 2.对于类注解,我的理解就是让我们知道这个类是干什么的,

实例演示如何使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程

实例演示如何使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义-请假申请流程 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 参考文章: RDIFramework.NET - 基于.NET的快速信息化系统开发框架 - 系列目录 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程

实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web

实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件WinFor

Android网络框架-Volley实践 使用Volley打造自己定义ListView

这篇文章翻译自Ravi Tamada博客中的Android Custom ListView with Image and Text using Volley 终于效果 这个ListView呈现了一些影视信息,每一行是一个影片的信息,每一行中有一张电影的图片,电影的名字.评分.类型.年份等信息. 1.json数据 我们通过解析json然后拿到数据,这个json数据包含json数组.每一个json数组中是一个json对象,json对象中包含了电影的图片url地址.标题.年份.评分.类型等信息 JSO

ASP.NET Ajax 客户端框架未能加载、"Sys"未定义

在Windows Server 2003 系统上部署asp.net项目出现以下问题: IIS为6.0 导致菜单控件的图片显示不出来: WebSite:程序中的图片显示正常. 但用到ASP.net 2.0 的 asp:TreeView 控件,控件显示不出图片 图片属性: 地址:http://localhost/WebSite/WebResource.axd?d=41VAQHZc9t11gcfcSh8IynBrLxqhiiUYVpPeaSf8-4s1&t=633965754543750000协议:超

Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器

上一篇<更加简练的编程体验>提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义.采用“基于约定”的Interceptor定义方式是Dora.Interception区别于其他AOP框架的一个显著特征,要了解拦截器的编程约定,就得先来了解一下Dora.Interception中针对方法调用的拦截是如何实现的. 一.针对实例的拦截 总地来说,Dora.Interception针对方法调用的拦截机制

用js在网页上完成倒计时3秒后自动跳转到另一个页面

<body> <div id="time"></div> <a href="#" onclick="stop()">停止</a> <script type="text/javascript"> var i=3; function changeTime(){ document.getElementById("time").innerHTM

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS