没有合适的资源?快使用搜索试试~ 我知道了~
java记录随笔
需积分: 0 1 下载量 201 浏览量
2013-09-15
22:21:36
上传
评论
收藏 444KB DOC 举报
温馨提示
试读
64页
java记录随笔
资源详情
资源评论
资源推荐
一、论 架构设计
软件架构作为一个概念,体现在技术和业务两个方面。
从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术
和一些基本原则的基础之上。
先说一些基本原则:
分层原则:分层是为了降低软件深度复杂性而使用的关键思想,就像社会有了阶级一样,
软件有了层次结构。
模块化原则:模块化是化解软件广度复杂的必然手段,模块化的目的就是让软件分工。
接口实现分离原则随着软件模块化的不断深入改进,面向接口编程而不是面向实现编程可
以让复杂度日趋增高的软件降低模块之间的耦合度,从而让各模块更轻松改进。从这个原
则出发,软件也从微观进行了细致的规范化。
还有两个比较小但很重要的原则:
细节隐藏原则很显然把复杂问题简化,把难看的细节隐去,能让软件结构更清晰。其实这
个原则使用很普遍,语言中的封装原则以及设计模式中的 (外观)模式
就很能体现这个原则的精神。
依赖倒置原则随着软件结构的进一步发展层与层之间、模块与模块之间的依赖逐渐加深,
而层、模块的动态可插拔要求不端增大。依赖倒置原则可看视为接口实现分离原则的深化
根据此原则的精神,软件进入了工具时代。这个原则有点类似于知名的好莱坞法则:
。
以上这些原则奠定了我们的软件架构的价值指标。但软件架构毕竟是建立在当前技术之上
的。而每一代技术都有架构模式。过去的不再说了,让我们现在就来看一下当前流行的技
术,以及当前我们能采用的架构。
因为面向对象是当前最流行开发技术,且设计模式的大量使用使面向对象的走向成熟,而
数据库是当前最有效的存储结构、 界面是当前最流行的用户接口,所以当前最典型的
三层次架构就架构在以上几项技术的基础之上,用数据库作存储层、用面向对象来实现业
务层、用 来作为用户接口层。我们从三层次架构谈起:
因为面向对象技术和数据库技术不适配,所以在标准三层次架构的基础上,我们增加了数
据持久层,来管理 双向映射,但目前一直没有最理想的实现技术。 和
技术因为其实现复杂,功能前景有限,已接近被淘汰的边缘。 及 作
为 映射的后期之秀,尤其是 ,功能相当完备。推荐作为持久层的首选
在业务层因为当前业务日趋负载,且变动频繁,所以我们必须有足够敏捷的技术来保证我
们的适应变化的能力,在标准 系统中 负责业务处理,且有不错的性能
表现,但采用 系统对业务架构模式改变太大,且其复杂而昂贵,业务代码移植性差。
而 !作为一个 配置的轻量级架构,漂亮的 "# 模式实现,对业务架构影响小,
所以推荐作为中间层业务框架。
在用户结构层虽然 $ 能够实现 %&# 架构但终究过于粗糙。
对 %&# 架构的实现就比较完美,' 也极好地实现 %&# 架构,且采用基于
事件的方式,非常诱人,惜其不够成熟,我们仍旧推荐 作为用户接口层基础架构。
因为业务层是三层次架构中最有决定意义的,所以让我们回到业务层细致地分析一下,在
复杂的业务我们常常需要以下基础服务的一种或几种:事务一致性服务 ()
* 、 并 发 加 锁 服 务 ++, 、 池 化 管 理 服 务 、 访 问 控 制 服 务
()*、流程控制服务 ,-、动态实现服务 "#,串行化消息服务()*、
负 载 平 衡 服 务 等 。 如 果 我 们 不 采 用 重 量 级 应 用 服 务 器 ( 如
! 等*及重量级组件(.$*,我们必须自己实现其中一些服务。
虽然我们大多情况下,不需要所有这些服务,但实现起来却非易事。幸运的是我们有大量
的开源实现代码但采用开源代码却常常是件不轻松的事。
随 着 / 作 为 结 构 化 信 息 传 输 和 存 储 地 位 日 渐 重 要 一 些 / 文 档 操 作 工 具
(%!012 等*的使用愈发重要而随着 / 的 ! 工具
(// 等*工具的成熟,采用 / 来设计 / 文档格式然后采用
! 来生成 会成为主要编程模式而这又进一步使数据中心向 / 转移使
在中小数据量上愈发倾向于以 /3 为查询语言的 / 数据库。最近还有一个趋
势4 等纷纷大量开发中间软件如(45 之 4*,可以直接
从 /生成 录入页面等非常实用的功能。还有 的广泛应用,都将
对软件的架构有非常重大的影响。至于面向服务架构 (01*前景如何,三层次架构什么时
候走入历史,现在还很难定论。
的发展也会对软件架构有很深的影响,但在面向对象架构里,无论 还是
抑是 6,、! 都有其自身的严重问题)维护性很差所以说它将
很难走远。也许作为一个很好的思想,它将在 里大展身手。
4 作为 7 语义模型的标志性的语言也很难想象能在当前业务架构发挥太大影响。
但如果真如它所声称那样,广泛地改变着信息的结构。那么对软件架构也会有深远影响。
有关架构设计的一些忠告:
尽量建立完整的持久对象层8可获得高回报
尽量将各功能分层分块每一模块均依赖假定的其它模块的外观
不能依赖静态数据来实现 "# 模式,应该依赖数据特征接口,静态数据仅是数据特征接口
实现方式之一
架构设计时 / 是支持而不是依赖8但可以提供单一的 / 版本的实现
从业务角度说:软件架构应是深刻体现业务内部规则的业务架构,但因为业务变化频纴,
所以软件架构很难保持恒定不变,但业务的频繁变化不应是软件架构大规模频繁变化的原
因,软件架构应是基于变化的架构。
一种业务有其在一段时间内稳定存在的理由(暂且不谈*,业务内部有许多用例,每一种用
例都有固定的规则,每一规则都有一些可供判定的项,每一项从某一维度来观察都是可测
量的,我们的架构首先必须保证完美适应每一项每一种测量方式,很多失败的架构都是因
为很多项的测量方式都发生变更这种微观变化中。
每个用例都有规则,我们在作业务用例分析,常常假定一些规则是先验的,持久稳定的,
然而后来的业务改变常常又证明这种看法是错误的,然而常常我们的架构已经为之付出了
不可挽回的代价。大量事实证明:规则的变化常常用例变化的根本原因。所以我们的架构
要尽可能适应规则的变化,尽可能建立规则模版。
每个用例都关系着不同的角色。每一个用例的产生都必然是因为角色的变更(注意:不是
替换,而是增强或减弱),所以注意角色的各种可能情况,对架构的设计有举足轻重的意
义。在我们当前的三层架构里,角色完美地对应接口概念。
在一个系统里很多用例都相互关联考虑到每个用例均有可能有不同的特例,所以在架构设
计中,尽量采用依赖倒置原则。如架构许可可采用消息通信模式(%0*。这样可降低耦合
度。
现在我们谈一下业务稳定存在理由对业务的影响。存在即是合理,在这里当然是正确的。
业务因人而存在,所以问业务存在的理由即是问不同角色的需要这项业务的理由以及喜欢
不喜欢当前业务用例的理由,所有这样的角色都应该在系统里预留。《待续》
在架构设计中有几个原则可以考虑:
用例尽量细分
用例尽量抽象
角色尽量独立
项测量独立原则
追求简单性
这里未提供相关的例子,例子会在以后的更新时提供。
业务和模式之间的关系
业务中的一些用例之间的关系常常和一些常规的模式很相似。但随着时间的演化,慢慢地
和先前的模式有了分歧。这是个正常的现象。但这对系统架构却要求非常高,要求系统架
构能适应一些模式的更替。在这里我们尽可能早地注意到用例之间的相互角色变化,为架
构更新做好准备8
第一部分完8
二、领域模型驱动设计(.*之模型提炼
板桥里人 )88 99:; <
当 世界提供的可选择性框架平台越来越多时,我们可能被平台架构所深深困扰,
而无暇顾及软件的真正核心:业务建模,其实,业务领域建模同样是一个比平台架构更复
杂,更需要学习的新的领域。
相反,在实践中,我们技术人员在经过冗长的平台架构学习和实践后,就匆忙开始项
目开发,这时是什么指导他们进行软件业务实现呢?大部分可能是依赖数据库建模,甚至
是复杂冗长的数据库存储过程设计,这些已经开始走向面向对象分析设计的反方向,走上
了一条错误的软件开发方向,最终开发出缓慢的、经常当机的 企业系统。
如果你没有恰当的 设计思想, 就会用性能惩罚你,这可能是 世界的一
个潜规则。
那么,一个正确的 1= 步骤是什么呢?目前围绕模型驱动设计(%*的
设计思想成为主流思想,%1 更是在 % 基础上提升和升华。下面让我们首先了解,如
何使用领域驱动设计思想来分析设计一个软件系统。
当我们不再对一个新系统进行数据库提炼时,取而代之的时面向对象的模型提炼。我
们必须大刀阔斧地对业务领域进行细分,将一个复杂的业务领域划分为多个小的子领域,
同时还必须分清重点和次要部分,抓住核心领域概念,实现重点突破。
核心领域模型
精简模型,找出核心领域,将业务需求中最有价值的概念体现出来,让核心变精要,
这实际就是一个使复杂问题变简单的过程,也是对我们软件设计人员真正能力的考验。
核心领域模型不是轻易能够发现,特别是他处于一个纷乱复杂的众多领域模型结构中
时,核心模型通常是我们某个子领域关注的重点,例如订单模型是订单管理领域的核心;
消息模型是论坛或消息领域系统的核心。
目前,分析领域有很多模式来帮助我们来提炼核心模型,例如四色原型、 %
的分析模式等,例如 % 的>分析模式>(1=*中的记帐模型就是不
仅仅用来记录账目数值,而且可以记录和控制账目的每一次修改。而四色原型则是一种高
于分析模式的一种原型基本模式,下面是本人根据四色原型提炼的核心领域模型概念。
一般情况下,在企业应用中,核心模型总是在其周围围绕一些所谓的“卫星”,这实际
上也是来自四色原型的一个推论,核心模型和其“卫星”的类图如下:
根据 .. 在其“领域驱动设计”一书中定义,领域模型划分为实体和值对象两种 ,
实体模型是指业务领域中具有独立属性的对象;而值对象则可能是一种 或状
态或规则。只要有实体对象,就可能存在实体的状态,状态跟踪有时成为一个业务领域使
用计算机软件的首要跟踪,但是,数据库不是对象状态的唯一表达方式,只是一种存储方
式(见状态对象:数据库的替代者*。
图中,实体核心对象大部分可能有一种类型,例如核心模型是产品,那么存在产品目
录;核心模型是消息;就存在消息类型;核心模型是信息;总存在信息类别,我们总是使
用分类方式来管理业务领域的信息,有时,类别甚至复杂到树形结构。
核心实体模型有时会有一个 <)? 关联的子实体,一般可能表达实体的细节,例如:核
心模型是订单,那么存在订单条目这样一个细节,一个订单中可能有多个订单条目;如果
核心模型是信息,那么存在该信息的多个回复或评论;这样的关联一般存在多个业务领域
中。
模型界面实现
原来,我们以为分析设计阶段无需了解实现细节,分析人员只要闷头做分析 @%A 图,
而无需顾及如何具体实现,其实这是一个误区。
.. 在其“领域驱动设计”一书中认为:分析人员负责从领域中收集基本概念;
设计则必须指明一组适应编程工具构造的组件,以及这些组件必须能够在目标环境中有效
执行。模型驱动设计(%!*抛弃了分裂分析模型与设计的做法,使用单
一的模型来满足这两方面的要求。因此,对于核心模型必须掌握了解其实现细节。
从另外一个方面来说,中国的客户总是从界面设计来表达他们的意图(如果中国客户
能够使用 @# 等 @%A 图来表达他们概念真是不可想象),例如客户会说,我希望
有一个界面让我将订单数据输入,然后能够查询符合查询条件的订单。因此,我们的核心
模型至少能够顺利地映射到界面实现,相反,这个客户有这样订单界面要求,但是你没有
提供一个与之适应的核心实体模型,界面实现将变得复杂,甚至走很多弯路,诞生不少
' 垃圾对象。
以 , 框架实现为例子,框架提供了围绕核心模型的新增删除修改查询
(#@*功能以及批量功能的快速实现,尤其 #@ 功能实现前提是必须提炼出核心模型,
从而其界面设计流程就能通过配置立即实现,这样一步到位实现领域模型到界面的过渡,
可以将我们设计核心模型和客户要求的界面需求能够做到完整的统一。
开源 , 下载包中
!
案例实际就是上述核心模型图的一种实现
项目,更复杂的项目可以认为是核心模型的重叠和反复使用(从原理上讲,核心模型是四
色原型的体现,而四色原型被认为是大部分企业系统的基本组成元素,见B,CB@%AC
B=#C%!#@%A)。
核心模型的选择
实际项目中,会存在多个核心模型的重叠和覆盖使用,主要取决于你的领域关注重点。
例如当客户和我们说要做一个旅游网站时,我们必须充分了解需求,它的软件系统重
点是哪些功能。如果当他首先说:我需要一个酒店设备的查询系统,因为他的客户对酒店
设备非常关注,那么我们可能认为酒店设备是这个领域模型的核心;酒店设备。如果他又
进行描述:我需要一个界面,客户在输入酒店资料时,选择多个酒店设备,那么在这样一
个关注领域,核心模型实际是酒店,而酒店设备可能成为酒店的一个特征实体属性,甚至
是值对象了。
以进销存系统为例子,在采购系统中,采购单是一个核心实体模型,而原材料是一种辅助
实体模型;在库存系统中,入出库单是一个核心实体模型,原材料或成品代表的是一个库
存物品概念模型,当需要库存报表查询输出,可以立即计算出来,或将结果缓存起来,缓
存起来的结果其实是库存物品对象的状态,可以使用值对象来实现。
核心模型的精练
当核心模型被定位和确定后,相当于我们抓住领域本质,这时我们可以使用面向对象的概
念对模型进行精练细化,实际就是明确对象的属性,确定模型对象的边界,通过反复重构
结合 D 等设计模式,使得我们得模型准确反映本质,从而实现模型的灵活性设计。所有
这些,都是数据表驱动设计所不能实现的。那你还抱着数据库建模干什么呢?
灵活设计可以使我们随着项目开发的进行,感到速度越来越快,而不是越来越慢,甚至 停
滞不前。灵活设计是对领域建模的补充,当我们从领域中抓住那些隐隐约约的线索和概念
原型后,就象准备好原料;下面就是通过迭代将原料锤炼成一定具体的形状,可以俗称“打
铁”,那么打铁打到什么形状算可以了呢? 也就是最终希望达到什么样的设计呢?
有些软件打着“灵活性”旗号,却出现很多多余的抽象和间接层次,从而导致了复杂性
灵活性可能导致复杂性, 但是灵活性不是导致复杂性的必然原因,如何将灵活性的发展通
往简单,其中精湛技巧就需要学习和不断实践, 正确的理论指导是必不可少的,模型驱动
设计(%*提供这样一个科学的方法论。
在 .. 的“领域驱动设计”一书中专门探讨了这样提供灵活设计的模式和方法,
下面简要述说如下:
明显意图的接口
接口的名称必须表达明显意图,而不是模棱两可,接口虽然是抽象,但是也不能抽象
到别人不知你所云, 如果其他开发人员必须查看接口的实现子类才能搞清楚你这个接口的
意图,那么你的接口抽象无疑是失败的,
使用明显意图的接口可以将整个子领域切分成一个个单独模块,每个模块使用带有明
剩余63页未读,继续阅读
hujd20030325
- 粉丝: 1
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0