倚楼听风雨
淡看江湖路

阿里巴巴Java开发手册第七章-设计规约(中)

《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断的完善,系统化地整理成册,回馈给广大开发者。老四购买了纸质版本,发现纸质书中多了一个章节,主要讲解软件设计过程中UML(Unified Modeling Language:标准建模语言)设计准则以及基本的架构理念。鉴于阿里巴巴官方电子版本没有此类内容,所以老四精心整理,附上些许不成熟的、更多的示例和说明,希望对看到的人有所帮助。

6.[强制] 如果系统中超过2个对象之间存在协作关系,并且需要表示复杂的处理流程,则使用活动图来表示。

说明:活动图是流程图的拓展,增加了能够体现协作关系的对象泳道,支持表示并发等。

老四附言:

活动图的组成元素:

  • 活动状态(Activity)
  • 动作状态(Actions)
  • 动作状态约束(Action Constraints)
  • 动作流(Control Flow)
  • 开始节点(Initial Node)
  • 终止节点(Final Node)
  • 对象(Objects)
  • 数据存储对象(DataStore)
  • 对象流(Objects Flows)
  • 分支与合并(Decions and Merge Nodes)
  • 分叉与汇合(Fork and Join Nodes)
  • 异常处理(Exception Handler)
  • 活动中断区域(Interrupttible Activity Region)
  • 泳道(Partition)

阿里巴巴设计规约泳道活动图示例

 

7.[推荐] 在考虑主干功能的同时,需求分析与系统设计需要充分评估异常流程与业务边界

反例:用户在淘宝网站的付款过程中,如银行扣款成功,则会给用户发送扣款短信;但是当支付宝入款时,由于断网演练产生异常,淘宝订单页面依然显示未付款,导致用户投诉。

老四附言:无论是初期的系统设计还是后期的业务实现都需要考虑系统边界的问题。初期的需求分析要详细的列出系统边界并输出文档,便于日后再开发之中使用单元测试测试系统边界,这对于项目的整体架构以及项目周期会产生很大的影响。

8.[推荐] 类在设计与实现时要符合单一原则。

说明:单一原则是最易理解却又最难实现的一条规则,随着系统的演进,工程师很多时候会忘记类设计的初衷。

老四附言:

这里面孤尽强调是面向对象的基本原则之单一职责,关于设计模式中面向对象单一职责的详述请参考这里,点我走起

9.[推荐] 谨慎使用继承的方式进行扩展,优先使用聚合或组合的方式来实现

说明:若一定要使用继承,则必须符合里氏代换原则。此原则要求父类能够出现的地方子类一定能够出现,比如”把钱交出来”中,钱的子类美元、欧元、人民币等都可以出现。

老四附言:

①.关于里氏代换原则,请戳这里详细了解,点我走起

②.继承、聚合与组合的定义

继承:指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;

关联:是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

聚合:关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

组合:组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

③为什么优先使用聚合或者组合呢?

继承的缺点:

  • 继承在编译时刻即被定义,运行时刻无法改变父类继承的实现。而且父类有局限性,破坏了封装性
  • 子类与父类有严重的依赖性,导致新问题新需求必须重写父类,最终限制了复用性,一般继承提供较少实现的抽象类

组合的优点:

  • 组合通过获得对其他对象的引用在运行时刻动态定义,对象之间标准的接口定义保证了封装性,基于接口的实现避免了对象之间紧密的依赖性。
  • 组合有助于类的封装,系统的行为依赖于对象之间的关系而不是被被定义在某个类中

所以面向对象设计的一个原则:优先使用对象组合,而不是类继承。

10.[推荐] 在系统设计时,根据依赖倒置原则,尽量依赖抽象类与接口,有利于扩展与维护。

说明:低层次模块依赖于高层次木块的抽象,方便系统间的解耦。

老四附言:

关于依赖倒置原则可以参考老四发布的设计模式专栏中关于设计模式-面向对象基本原则之依赖倒转原则的浅析。点我直达

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。

赞(7) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 阿里巴巴Java开发手册第七章-设计规约(中)

开始你的表演 抢沙发

觉得文章有用就打赏一下老四,鼓励我更好的创作

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册