网有 柳丁脚踏车e
关注数: 48 粉丝数: 39 发帖数: 536 关注贴吧数: 54
《架构整洁之道》17-18章 【第十七章:划分边界】 软件架构设计本身就是一门划分边界的艺术。边界的作用是将软件分割成各种元素,以便约束边界两侧之间的依赖关系。简单来说,通过划清边界,我们可以推迟和延后一些细节性的决策,这最终会为我们节省大量的时间、避免大量的问题。这就是一个设计良好的架构所应该带来的助益。边界线应该画在那些不相关的事情中间。GUI与业务逻辑无关,所以两者之间应该有一条边界线。数据库与GUI无关,这两者之间也应该有一条边界线。数据库又与业务逻辑无关,所以两者之间也应该有一条边界线。这其实就是单一职责原则(SRP)的具体实现,SRP的作用就是告诉我们应该在哪里画边界线。 【第十八章:边界剖析】 跨边界调用指的是边界线一侧的函数调用另一侧的函数,并同时传递数据的行为。为什么需要管控源码中的依赖关系呢?因为当一个模块的源码发生变更时,其他模块的源码也可能会随之发生变更或重新编译,并需要重新部署。所谓划分边界,就是指在这些模块之间建立这种针对变更的防火墙。 1)系统架构最常见的物理边界形式:动态链接库。与单体结构类似,按部署层次解耦的组件之间的跨边界调用也只是普通的函数调用,成本很低。 2)系统架构还有一个更明显的物理边界形式,那就是本地进程。本地进程之间的跨边界通信需要用到系统调用、数据的编码和解码,以及进程间的上下文切换,成本相对来说会更高一些,所以这里需要谨慎地控制通信的次数。 3)系统架构中最强的边界形式就是服务。服务之间的跨边界通信相对于函数调用来说,速度是非常缓慢的。因此我们在划分架构边界时,一定要尽可能地控制通信次数。
《架构整洁之道》13-14章 《架构整洁之道》13-14章 【第十三章:组件聚合】 构建组件相关的基本原则:REP复用/发布等同原则,CCP共同闭包原则,CRP 共同复用原则。 复用/发布等同原则(REP):软件复用的最小粒度应等同于其发布的最小粒度。 从软件设计和架构设计的角度来看,REP原则就是指组件中的类与模块必须是彼此紧密相关的。也就是说,一个组件不能由一组毫无关联的类和模块组成,它们之间应该有一个共同的主题或者大方向。 共同闭包原则(CCP):我们应该将那些会同时修改,并且为相同目的而修改的类放到同一个组件中,而将不会同时修改,并且不会为了相同目的而修改的那些类放到不同的组件中。 CCP原则也认为一个组件不应该同时存在着多个变更原因。 CCP的主要作用就是提示我们要将所有可能会被一起修改的类集中在一处。也就是说,如果两个类紧密相关,不管是源代码层面还是抽象理念层面,永远都会一起被修改,那么它们就应该被归属为同一个组件。 共同复用原则(CRP):不要强迫一个组件的用户依赖他们不需要的东西。 CRP原则实际上是在指导我们:不是紧密相连的类不应该被放在同一个组件里。 【第十四章 组件耦合】 三条组件之间关系的原则:无依赖环原则、稳定依赖原则、稳定抽象原则 无依赖环原则:组件依赖关系图中不应该出现环。 稳定依赖原则:依赖关系必须要指向更稳定的方向。通过遵守稳定依赖原则(SDP),我们就可以确保自己设计中那些容易变更的模块不会被那些难于修改的组件所依赖。 稳定抽象原则:一个组件的抽象化程度应该与其稳定性保持一致。
《架构整洁之道》9-10章 【第九章 LSP:里氏替换原则】 该设计原则是 Barbara Liskov 在1988年提出的一个著名的子类型定义。 里氏替换原则的定义是:任何基类可以出现的地方,子类一定可以出现,而且替换成子类也不会产生任何错误或异常。简单来说,LSP就是指子类对象可以在程序中替换父类对象而不影响程序的正确性。也就是说,在使用继承时,如果一个子类不能完全地替换掉它的父类,那么这个继承关系就不应该存在。 软件架构层面,一旦违背了可替换性,该系统架构就不得不为此增添大量复杂的应对机制。 【第十章 ISP:接口隔离原则】 接口隔离原则告诉我们:任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。 实现接口隔离原则的方法如下: 1、接口应该尽量小:接口应该只包含必要的方法,而不包含不必要的方法。这样可以减少接口的复杂性,提高接口的可读性和可维护性。 2、接口应该高内聚:接口的方法应该在语义上相关联,而不是随意地组合在一起。这样可以使得接口更加一致,更容易理解和使用。 3、接口应该稳定:接口的方法应该是稳定的,也就是说,接口的定义应该尽可能不发生变化。这样可以减少对接口的依赖,使得代码更加稳定和可靠。 4、接口应该对扩展开放,对修改关闭:接口的设计应该能够支持扩展,而不需要对现有代码进行修改。这样可以减少代码的修改,提高代码的可维护性和可扩展性。
《架构整洁之道》7-8章 【第七章 SRP:单一职责原则】 一、是什么?不做会怎么样? 单一职责原则 != 每个模块只做一件事 单一职责原则 == 任何一个软件模块都应该只对某一类行为者负责 反面案例1: 不同行为者的代码(行为)耦合在同一个模块里,且共用同一个方法,造成本该独立的行为互相影响。 反面案例2: 不同行为者的代码(行为)耦合在同一个模块里,多人为了不同的目的修改了同一份源代码,造成合并代码冲突 & 功能出错。 tips: 将服务不同行为者的代码进行切分,不放到同一个模块中; 不同业务的代码,即使暂时是用同样的方法实现,最好也将方法分开来写。否则业务1的逻辑修改,可能影响到业务2(此处业务即指行为)。 二、如何做到单一职责原则? 将数据与函数分离,设计多个行为(业务)类,每个类处理具有个体差异性的行为函数,共用同一个与行为(业务)无关的数据类【存在缺点:需要在程序里处理多个行为类,可以通过facade设计模式来解决】 三、本章小结 单一职责原则:主要讨论函数和类之间的关系。 在组件层面,可以将其称为共同闭包原则 在软件架构层面,则是用于奠定架构边界的变更轴心 【第八章 OCP: 开闭原则】 一、是什么? 开闭原则:易于扩展,但不允许修改 二、如何做到开闭原则? 1、先执行SRP(将系统中满足不同需求的代码分组,划分为不同的组件) 2、再执行DIP(调整组件之间的依赖关系,按照层次结构进行组织,使得高阶组件不会因低阶组件被修改而收到影响) A Tip:如果A组件不想被B组件上发生的修改所影响,那么就应该让B组件依赖于A组件
《架构整洁之道》5-6章 【第五章 面向对象编程】 本章逐个分析了常与面向对象编程绑定的三个概念『封装、继承、多态』,并解答了面向对象编程是什么,有什么优势。 面向对象编程语言:封装、继承、多态 封装:这个特性并不是面向对象编程所独有的,且面向对象编程语言可能不如非面向对象编程语言的封装性强。 1、C语言作为非面向对象的编程语言,具有良好的封装特性。 2、C++作为面向对象的编程语言,反而破坏了C的完美封装特性(C++编译器由于技术原因,必须在头文件中看到成员变量的定义)。 3、Java 和 C#彻底抛弃了头文件与实现文件分离的编程方式,进一步削弱了封装特性。 继承:早在面向对象编程语言被发明之前,对继承性的支持就已经存在很久了。面向对象编程在继承性方面并没有开创出新,但是的却在数据结构的伪装性上提供了相当程度的便利性。 多态: 1、面向对象编程使得插件式架构(与设备无关的程序)可以在任何地方被安全地使用。 2、依赖倒置,当某个组件的源代码需要修改时,仅仅需要重新部署该组件,不需要更改其他组件,这就是独立部署能力。 对软件架构师来说,面向对象编程就是以多态为手段来对源代码的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。 【第六章 函数式编程】 函数式编程语言中的变量是不可变的。 一个架构设计良好的应用程序应该将状态修改的部分和不需要修改的部分隔离成单独的组件,然后用合适的机制来保护可变量。而软件架构师应着力于,将大部分逻辑归于不可变组件中。 事件溯源体系:只存储事务记录,不存储具体状态。当需要具体状态时,从头计算所有事物即可。 软件/计算机程序,无一例外是由顺序结构、分支结构、循环结构和间接转移这几种行为组合而成的,无可增加,也缺一不可。
1 下一页