读书笔记-架构整洁之道.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

1.设计与架构

软件架构的终极目标是,用最小的人力成本来满足构建和维护该系统的需求。

一个软件架构的优劣,可以用它满足用户需求所需要的成本来衡量。如果该成本很低,且在系统的生命周期内始终很低,那么这个系统的设计就是优良的。反之,就是不好的设计。

胡乱编写代码的工作速度,其实比循规蹈矩更慢。要想跑得快,先要跑得稳。

2.两个价值维度

行为价值:程序按照需求文档要求的方式工作

架构价值:软件的“软”,即软件的灵活性

艾森豪威尔矩阵

重要且紧急

重要不紧急

不重要但紧急

不重要且不紧急

紧急的事情往往没那么重要,而重要的事情似乎永远也排不上优先级。

第一个价值维度:系统行为,是紧急的,但是并不总是特别重要。

第二个价值维度:系统架构,是重要的,但是并不总是特别紧急。

应有的排序:

重要且紧急

重要不紧急

不重要但紧急

不重要且不紧急

常犯的错误:将第三优先级的事情提到第一优先级去做。导致重要的事情被忽略。

平衡系统架构的重要性与功能的紧急程度,是软件研发人员自己的职责。

建议:为好的软件架构而持续斗争

研发团队必须从公司长远利益出发,与其他部门抗争,公司内部的抗争本来就是无止境的。

软件的可维护性需要由你来保护,这是你的职责,公司雇你的很大一部分原因就是需要有人来做这件事。

3.编程范式

编程范式指的是程序的编写模式。一共只有三种编程范式,而且未来几乎不可能再出现新的(理由是,编程范式都是增加限制,Bob大叔的理解)。

一本谈软件架构的书,为什么要设计编程范式呢?Bob大叔如是说:

多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程则是各模块的算法实现的基础。

这和软件架构的三大关注重点不谋而合:功能性、组件独立性、数据管理。

结构化编程

可推导性:可以用代码将一些已证明可用的结构串联起来,只要证明额外的代码是正确的,就可以推导出整个程序的正确性

goto语句的某些用法会导致某个模块无法被递归拆分成更小的、可证明的单元。

如果某个结论经过一定的努力无法证伪,则认为它在当下是足够正确的。

测试只能展示bug的存在,并不能证明不存在bug。

软件架构师需要定义可方便证伪(测试)的模块、组件及服务。为了达到这个目的,要将类似结构化编程的限制方法应用在更高的层面上。

面向对象编程

以多态为手段来对源代码中的依赖关系进行控制的能力。这种能力让软件架构师可以构建出某种插件式架构,让高层策略组件与底层实现组件相分离。

函数式编程

架构设计良好的程序,应该将状态修改的部分与不需要修改状态的部分隔离成单独的组件,然后用合适的机制来保护可比量。

4.设计原则

SRP:单一职责原则

人们对单一指责原则的理解,是逐步发展的

每个模块都应该只做一件事。

任何一个软件模块都应该有且仅有一个被修改的原因。

任何一个软件模块都应该只对某一类行为者负责。

OCP:开闭原则

设计良好的计算机软件系统应该易于扩展,同时抗拒修改。换句话说,在不需要修改的前提下就可以轻易被扩展。

一个好的软件架构设计师会努力将旧代码的修改需求量降至最小,甚至为0。如何做到呢?可先将满足不同需求的代码分组(即SRP),然后再来调整这些分组之间的依赖关系(即DIP)。

LSP:里氏替换原则

任何基类可以出现的地方,子类一定可以出现。

在架构上的意义,可以理解为插件式的架构,插件之间、子服务之间的可替换性。

ISP:接口隔离原则

任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。

DIP:依赖反转原则

如果想要设计一个灵活的系统,在源代码层次的依赖关系中就该多引用抽象类型,而非具体实现。

相对而言,接口比实现更稳定。如果想要在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的具体实现。

应在代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。

不要在具体实现类上创建衍生类

在静态类型的编程语言中,继承关系是所有源代码依赖关系中最强的、最难被修改的,所以应该格外小心。

不要覆盖(override)包含具体实现的函数

应避免在代码中写入与任何具体实现相关的名字,或者是其他容易变动的事物的名字。

5.组件构建原则

组件聚合

REP:复用/发布等同原则

软件复用的最小粒度应等同于其发布的最小粒度。

一个组件内的类和模块之间,应该有一个共同的主题或大方向。

一个组件内的类和模块还应该可以同时发布。

CCP:共同闭包原则

单一职责原则在组件层面上的再度阐释。

要将所有可能被一起修改的类集中在一处。

将由于相同原因而修改,且需要同时修改的东西放在一起。

CRP:共同复用原则

接口隔离原则的一个普适版本。

不要强迫一个组件的用户依赖他们不需要的东西。

将经常共同复用的类和模块放在同一个组件中。

组件聚合原则张力图(TO

文档评论(0)

meow9x + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档