《软件架构设计》学习笔记&摘录(七)——程序员成长篇【完】

       在进行面向对象设计的时候不要受到过多OOP编程语言级细节的干扰,就是要有在设计之时将OOP细节忘却的能力。在不同层面思考,需要考虑不同的问题。OOD应更多地将精力放在职责的划分、变化点的隔离、交互机制的确定等问题上。不能忘却OOP级的编程细节,就无法真正在OOD层面上思考。

       封装、继承、多态是OO的三大特性(笔者的理解是:封装是思想,继承是手段,多态是效果)。但是,不少人对继承的理解过多地局限在OOP层面,从而限制了继承思想在OOD层面的巨大作用。针对接口编程(Program To An Interface)、混入类(Mix In class)、基于角色的设计(Role-basedDesign)这三个与继承紧密相关的著名OOD技巧。

       耦合是依赖的同义词,被定义为“两个元素之间的一种关系,其中一个元素变化,导致另一个元素变化”。

       依赖性倒置原则(DependencyInversion Principle)形象化了抽象耦合的概念,明确表述了应该“依赖于抽象类,不要依赖具体类”。针对接口编程遵守上述原则,从而在很大程度上阻止了变化波及范围的扩大,有效地隔离了变化,有助于增强系统的可重用性和可扩展性。

       一个软件系统通常包含四层:用户界面层、问题领域层、数据管理层、系统交互层。核心思想是:问题领域层“不依赖于”其他任何层,而其他任何层“只依赖于”问题领域层。该架构设计的实现,极为重要的一点,就是要使用针对接口编程的技巧。如果系统交互层要调用问题领域层的操作,直接调用即可;如果问题领域层要调用系统交互层的操作,需要由问题领域层定义一个通用的抽象接口,通过针对接口编程调用这个抽象接口,而系统交互层实现该接口。

       混入类被定义为“一种被设计为通过继承与其他类结合的类”,它给其他类提供可选择的接口或功能。混入类通常是抽象类,不能实例化。混入类的作用在于:它不仅可以提高功能的重用性,减少代码冗余;而且还可以使相关的“行为”集中在一个类中,而不是分布在多个类中,避免了所谓的“代码分散”和“代码交织”问题,提高了可维护性。

       协作被定义为“多个对象为了完成某种目标而进行的交互”。而角色是“特定协作中的对象的抽象”,它“仅定义了对象特征的一个对某协作有意义的子集”。接口隔离原则(Interface Separation Principle)信奉“多个专用接口优于一个单一的通用接口”的思想,因为“任何接口都应该具有高内聚性”,以便“保证实现该接口的类的实例对象可以呈现为单一角色”。

       开发人员应该仅仅对程序中呈现出频繁变化的那部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

       依赖(Dependency):两个元素之间的一种关系,其中一个元素变化,导致另外一个元素变化。依赖的同义词:耦合(Coupling),共生(Connascence)。依赖的危害:如果被依赖的元素发生变化,可能引起另外一个元素不得不变化。但是不会在“实际中”造成危害的依赖关系,都是良性依赖。依赖是不可避免的,重要的是如何务实地应付变化。这就是良性依赖原则要做的。OOD的实质,简而言之,就是妥善地为多个类进行职责分配,使这些类相互协作而构造出完成特定功能的系统。“只受一次愚弄”的策略很精辟。在我们最初编写代码时,假设变化不会发生;这时的设计很简洁,但对当时的需求,却是有效的、“不多不少的”。当变化发生时,我们就通过创建良性依赖,来隔离以后发生的同类变化;一般认为要通过创建抽象来隔离变化。

       不要将重构和添加新功能同时进行。

       一个设计良好的接口无疑是“不易变的”。

       良性依赖可以是对抽象基类的依赖,也可以是对具体类的依赖。好的组件库,都遵守接口隔离原则(Interface-Segregation Principle),以达到“不应该强迫客户依赖于它们不用的方法”的目的。这其中包括了基于角色的设计(Role-based Design)的思想:协作被定义为“多个对象为了完成某种目标而进行的交互”;角色被定义为“特定协作中的对象的抽象”,它“仅定义了对象特征的一个对某协作有意义的子集”;协作和角色的概念和实现世界和接近,我们很容易通过已有角色的组合来构造新的协作,以完成新的功能。

       “依赖”是和“变化”紧密联系在一起的概念。由于依赖关系的存在,变化在某处发生时,影响会波及开去,造成很多修改工作,这就是依赖的危害。

       单一职责原则(Single-ResponsibilityPrinciple)“对一个类而言,应该仅有一个引起它变化的原因”。该原则是“高内聚性原则”的引申,但是通过将“职责”极具创意地定义为“变化的原因”,使得该原则具有可操作性。该原则还揭示了内聚性和耦合性是“一物两面”的关系,为了降低耦合性,基本途径就是提高内聚性;如果一个类承担的职责过多,那么这些职责就会相互依赖,一个职责的变化可能会影响另一个职责的履行。OOD的实质,就是合理地进行类的职责分配。

       开放封闭原则(Open-ClosedPrinciple)“软件实体应该是可以扩展的,但是不可修改”。我们应当创建抽象来隔离以后发生的同类变化。

       Liskov替换原则(Liskov-SubstitutionPrinciple)“子类型必须能够替换掉它们的基类型”。Liskov替换原则从基于契约的设计演化而来,契约通过为每个方法声明“先验条件”和“后验条件”;定义子类时,必须遵守这些“先验条件”和“后验条件”。

       依赖倒置原则(Dependency-InversionPrinciple)“抽象不应依赖于细节,细节应该依赖与抽象”。该原则几乎就是软件设计的正本清源之道。

       接口隔离原则(Interface-SegregationPrinciple)“多个专用接口优于一个单一的通用接口”。该原则是单一职责原则用于接口设计的自然结果。

       面向对象设计最困难的部分是将系统分解成对象集合。用面向对象的观点去观察世界,我们可以发现许多不同种类的对象,它们都有自己的内部状态和运行规律;而不同对象之间相互联系和相互作用,就构成了完整的客观世界。面向对象的开发方法论以对象为基本着眼点,以模拟为手段,建立问题空间的解空间。基于角色的设计,其要旨在于使用角色组装协作。协作被定义为“多个对象为了完成某种目标而进行的交互”。角色被定义为“特定协作中的对象的抽象”。协作和角色的概念,同时存在于软件设计和现实世界中。没有类的协作,就没有面向对象的软件设计。基于角色的设计强调的是,系统、子系统、模块、类等这些不同级别的抽象单元之间的协作。先为协作建立抽象模型,再分别具体实现协作红的角色。

       分析模型是设计模型的基础,设计模型是分析模型的精化。

       如果两个或更多事物中的一个发生变化,不会影响其他事物,这些事物就是正交的。正交思维最有益的用处之一,是用于分类。正交思维是“分而治之”思想的一种具体手段。

       反模式与模式的概念类似,都是常见问题的可复用的经验总结,也都有名称、问题、解决方案、效果四个要素。但是,经验不一定正确,反模式就是对“不要那么做”的归档。

       模型驱动开发(Model-DrivenDevelopment, MDD)是业界的大趋势。正如GOF设计模式分为创建型模式、结构型模式、行为型模式,MDD模式被分为过程和组织模式、领域建模模式、工具架构模式、应用平台开发模式。

       UML的最终目标是在尽可能简单地同时能够对实际需要建立的系统的各个方面建模。UML只是我们表达建模思想的工具,其背后的思想才是最重要的。建模的本质是抽象,抽象的目的是把握重点,以使结构清晰化。

       RUP(IBM RationalUnified Process,统一软件过程)。尽早解决重大风险,是软件工程管理中的一条重要原则。RUP是风险驱动的。它将整个开发生命周期分为4个阶段:初始阶段、细化阶段、构造阶段、移交阶段。初识阶段着重化解业务风险,并确保所有涉众对项目达成一致的认识。细化阶段主要化解技术风险,要定义并创建可执行的系统架构。RUP的每个阶段又可分为一到多个迭代周期。采用迭代开发,意外着有持续不断的反馈,反馈是决策的基础,也是化解风险的基础。这个根据持续决策来进行决策的时机,叫做里程碑(Milestone)。里程碑有两种,阶段结束对应的里程碑叫做主里程碑(Major milestone);迭代结束对应的对应的里程碑叫做次要里程碑(Minor milestone)。阶段和迭代,为开发团队提供了不同级别的决策时机。

       建立并管理基线(baseline),为迭代开发提供了有力支持。基线的要点有二:一是要通过评审,二是要受配置和变更管理控制。配置和变更管理完成建立并管理基线的任务。置于配置和变更管理之下的工件,称为配置项(configuration item)。

       发布是某个迭代周期的成果,但是并非每个迭代周期都用发布。发布是特殊的基线。

       模型就是抽象,就是有意识地忽略事物的某些特征。抽象带来的好处是能够反映模型中元素之间的关系,清晰把握大局。概念模型是模型的一种,简单说就是抽象程度极高的一种模型。软件工程概念模型是对软件工程领域进行抽象描述的模型,它能够使我们对软件工程有一个完整的把握。软件工程是(目标、方法、活动)三元组。它体现了“目标—方法—活动”的3维正交关系:任何目标,都要依照特定方法,由特定活动实现;任何方法,都要指导特定活动,来完成某种目标;任何活动,都由特定方法指导,来完成某种目标。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值