精华内容
下载资源
问答
  • 架构整洁之道

    2019-09-24 07:57:09
    架构整洁之道设计原则一. SRP:单一职责原则二.OCP:开闭原则三.LSP:里氏替换原则四.ISP:接口隔离原则五.DIP:依赖反转原则组件构建原则一.组件聚合1.REP:复用/发布等同原则2.OCP:共同闭包原则3.CRP:共同复用原则二....

    设计原则

    SOLID

    一. SRP:单一职责原则

    定义:任何一个软件模块都应该有且仅有一个被修改的理由或者任何一个软件模块都应该只对一个用户或系统利益相关者负责。综上所述:任何一个软件模块都应该只对某一类行为者负责。

    上述的软件模块可以是一组紧密相关的函数和数据结构

    二.OCP:开闭原则

    定义:设计良好的计算机软件应该易于扩展,同时抗拒修改

    三.LSP:里氏替换原则

    定义:如果对于每个类型是S的对象o1都存在一个类型为T的对象o2能使操作T类型的程序P在用o2替换o1时行为保持不变,我们就可以将S成为T的子类型。

    LSP实际上是一种指导接口与其实现方式的设计原则。

    四.ISP:接口隔离原则

    定义:如果A依赖于B,则B发生改动会导致A需要重新编译部署,故需要在A和B之间增加接口C,使B的改动不影响A。A和B可以理解为源代码,那么C应该是B源代码内的接口。

    五.DIP:依赖反转原则

    定义:控制流跨越架构边界的方向(实现类控制接口的实现)与源代码依赖关系跨域边界的方向(具体类依赖接口而非实现类)正好相反。

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

    组件构建原则

    一.组件聚合

    1.REP:复用/发布等同原则

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

    2.OCP:共同闭包原则

    我们应该将那些会同时修改,并且为相同目的而修改的类放到同一个组件中,而将不会同时修改,并且不会为了相同目的而修改的那些类放到不同的组件中。

    3.CRP:共同复用原则

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

    二.组件解耦

    展开全文
  • 架构整洁之道导读

    2019-09-13 20:58:58
    架构整洁之道导读(一)编程范式 导读(二)组件聚合 导读(三)组件耦合 转载于:https://my.oschina.net/zhaolin/blog/3067096...
    展开全文
  • 接上文:架构整洁之道(原则篇) 1.什么是软件架构什么是软件架构?“软件架构师”的工作内容是什么?软件架构设计的目标?2.重复3.划分边界4.尖叫的软件架构5.整洁架构5.1 业务实体5.2 用例5.3 接口适配器5.4 框架与...

    只有顺心意,才能逆天命 --猫腻《择天记》

    接上文:架构整洁之道(原则篇)

    欢迎关注微信公众号“江湖喵的修炼秘籍”

    1.什么是软件架构

    什么是软件架构?

    软件架构的实质就是规划如何将系统切分成组件,安排好组件之间的排列关系,以及组件组件之间的通信方式。

    “软件架构师”的工作内容是什么?

    软件架构师应该坚持做一线程序员,应该在自身承接编程任务的同时引导团队向一个能够最大化生产力的系统设计方向前进。如果架构师从代码中解放出来,就不能亲身承受因系统设计而带来的麻烦和痛苦

    软件架构设计的目标?

    软件架构设计的主要目标是支撑软件系统的全生命周期,设计良好的架构可以让系统便于理解,易于修改,方便维护,并且能够轻松部署。

    软件架构的终极目标是最大化程序员的生产力,最小化系统的总运营成本。

    以下从不同角度看待软件架构的目标:

    **开发:**软件架构的作用是便于开发

    **部署:**一个系统的部署成本越高,可用性越低,实现一键式的轻松部署是软件架构设计的一个目标。运用微服务架构时,要合理控制服务数量。

    **维护:**系统维护成本主要集中在“探秘”和“风险”两件事情上,“探秘”的目的是确认新增功能或者被修复问题的最佳位置和最佳方式;“风险”的目的是确认再进行修改时,可能衍生出的新问题。软件架构设计的目标是降低这两个成本。

    **保持可选项:**一个优秀的软件架构师应该致力于最大化的可选项数量。高层策略应该避免固化具体的实现细节,比如选择何种UI,选择哪种数据库等等,应尽可能长的延迟这种决策,保留更多的选择性。

    **设备无关性:**程序应该与设备无关。

    2.重复

    架构师们经常会钻进一个牛角尖——害怕重复。

    当然,重复在软件行业里一般来说都是坏事。我们不喜欢重复的代码,当代码真的出现重复时,我们经常会感到作为一个专业人士,自己是有责任减少或消除这种重复的。

    但是重复也存在着很多种情况。其中有些是真正的重复,在这种情况下,每个实例上发生的每项变更都必须同时应用到其所有的副本上。重复的情况中也有一些是假的,或者说这种重复只是表面性的。如果有两段看起来重复的代码,它们走的是不同的演进路径,也就是说它们有着不同的变更速率和变更缘由,那么这两段代码就不是真正的重复。等我们几年后再回过头来看,可能会发现这两段代码是非常不一样的了。

    当我们按用例垂直切分系统的时候,这样的问题会经常出现。我们经常遇到一些不同的用例为了上述原因被耦合在了一起。不管是因为它们展现形式类似,还是使用了相似的语法、相似的数据库查询/表结构等,总之,我们一定要小心避免陷入对任何重复都要立即消除的应激反应模式中。一定要确保这些消除动作只针对那些真正意义上的重复。

    3.划分边界

    一个系统中最消耗人力资源的 是系统中存在的耦合。

    我们应该在软件架构中划分边界,将系统分割成组件,一部分是系统的核心业务逻辑组件,一部分是与核心业务逻辑无关但是负责提供必要功能的插件。

    业务逻辑是什么

    业务逻辑就是程序中那些真正用于赚钱或者省钱的业务逻辑与过程。

    业务逻辑应该保持纯净,不要掺杂用户界面或者所使用的数据库相关的东西。在理想情况下,这部分代表业务逻辑的代码应该是整个系统的核心,其他低层概念的实现应该以插件形式接入系统中。业务逻辑应该是系统中最独立、复用性最高的代码。

    架构设计的任务就是找到高层策略与底层细节之间的架构边界,同时保证这些边界遵守依赖关系规则。

    4.尖叫的软件架构

    架构!=框架

    架构设计不应该是与框架相关的,架构应该基于用例来设计,而不应该基于框架来设计。

    良好的架构设计应该可以让人第一眼看出这是个什么系统(架构应该尖叫的告诉你)。

    一个良好的架构设计应该围绕着用例展开,这样的架构设计可以在脱离框架、工具以及使用环境下完整地描述用例。这就好像一个住宅建筑设计的首要目的应该是满足住宅的使用需求,而不是确保一定要用砖来构建这个房子。架构师应该花费很多精力来确保该架构的设计在满足用例的需要下,尽可能地允许用户能自由地选择建筑材料(砖头、石料或者木材)。

    而且,良好的架构设计应该尽可能地允许用户推迟和延后决定采用什么框架、数据库、Web服务以及其他与环境相关的工具。框架应该是一个可选项,良好的架构设计应该允许用户在项目后期再决定是否采用Rails、Spring、Hibernate、Tomcat、MySQL这些工具。同时,良好的架构设计还应该让我们很容易改变这些决定。总之,良好的架构设计应该只关注用例,并能够将它们与其他的周边因素隔离。

    5.整洁架构

    软件层次从低到高分别是:

    框架与驱动程序 (数据库、Web、用户界面、设备、外部接口) < 接口适配器 ( 控制器、展示器、网关) < 应用级业务逻辑(用例) <系统级业务逻辑(业务实体)

    源码中的依赖关系也必须按照这个方向流动,即低层机制指向高层机制。

    5.1 业务实体

    业务实体这一层中封装的是整个系统的关键业务逻辑,一个业务实体既可以是一个带有方法的对象,也可以是一组数据结构和函数的集合。

    5.2 用例

    软件的用例层中通常包含的是特定应用场景下的业务逻辑,这里面封装并实现了整个系统的所有用例。这些用例引导了数据在业务实体之间的流入/流出,并指挥着业务实体利用其中的关键业务逻辑来实现用例的设计目标。

    我们既不希望在这一层所发生的的变更影响业务实体,同时也不希望这一层受外部因素(如数据库、UI、常见框架)的影响。用例层应该与它们都保持隔离。

    5.3 接口适配器

    软件的接口适配器层中通常是一组数据转换器,它们负责将数据从对用例和业务实体而言最方便操作的格式,转化为外部系统(如数据库、Web)最方便操作的格式。例如,这一层应该包含整个MVC框架。展示器、视图、控制器都应该属于接口适配器层。而模型部分则应该由控制器传递给用例,再由用例传回展示器和视图。

    同样的,这一层的代码也会负责将数据从对业务实体与用例而言最方便操作的格式,转化为对所采用的持久性框架最方便的格式。从该层再往内的同心圆中,其代码就不应该依赖任何数据库了。

    这一层的代码还会负责将来自外部服务的数据转换成系统内用例与业务实体所需的格式。

    5.4 框架与驱动程序

    最外层的模型层一般是由工具、数据库、Web框架等组成的。在这一层中,我们通常只需要编写一些与内层沟通的黏合性代码。

    框架与驱动程序层中包含了所有的实现细节。Web是一个实现细节,数据库也是一个实现细节。我们将这些细节放在最外层,这样就很难影响到其他层了。

    6.解耦谬论

    谬论:拆分服务最重要的一个好处就是让每个服务之间实现强解耦。

    维服务架构中,拆分服务并不意味着这些服务可以彼此独立开发、部署和运维,如果这些服务之间以数据形式或者行为形式相耦合,那么它们的开发、部署和运维也鄙夫彼此协调来进行。如何为了满足一个需求需要多个服务共同修改,则这些服务本质上都是强耦合的,这就是横跨度变更问题。

    展开全文
  • 最近,朋友圈都在晒 Uncle Bob 的新书《Clean Architecture》(中文名《架构整洁之道》)的相关内容,书架上也因此新增了一本书。阅读了之后,倒是产生...
        

    最近,朋友圈都在晒 Uncle Bob 的新书《Clean Architecture》(中文名《架构整洁之道》)的相关内容,书架上也因此新增了一本书。阅读了之后,倒是产生了一些想法,便想写篇文章记录一下。

    编程的年限

    与书本身的架构部分的内容相比,这本书最吸、启发我的地方,怕是结尾的 《架构设计考古》相关的故事。编程年限时间越长,经常思考更好的解决方式,能收获到的知识也就越多。如果我们不能决定一个系统的架构,那么就思考、实践如何把它变好。过程中,大抵也是能收获更多的东西,对下一个系统有更多的启发。

    不同的编程时期,对于软件架构的看法是不一样的。过去,我们要面对的是,一行行代码构成的面条式代码,系统处于混沌架构的形式。提取、整理、总结出 MVC 架构之后,应用的架构变得明朗。但是,随着时间的增长,又变成臃肿的单体应用。按业务(领域)拆分出代码,拆分出业务模块,变成一个个的服务。到了今天,我们开始提及演进式架构,以变化的心态,应对软件架构带来的变化。

    软件架构总是要变的,重要的不是设计出好的架构,而是让架构和开发人员适应变化

    从结尾的考古故事里,可以看出:国外的技术人员到底和国内的技术人员,还是有上那么一些差距——对外输出上的差距。90 年代的中国程序员,没能为国内的开发者留下多少经验,这一点倒是颇为遗憾的。一来可能是没有记录下来,很多故事只能从内部知道;二来则是不能持续地记录,随着时间的推移,便被潮流覆盖。Robert C·Martin、Martin Fowler、Joel Spolsky、Jeff Atwood 等知名的程序员,写了大量的技术文章。从这点上来,倒是可以和国内的技术氛围形成了对比。

    可一如村上春树在《我的职业是小说家》所讲述的故事,有些富有才华的年轻人,总是 “消逝” 得非常快——是他/她们在这一领域的时间太短了,昙花一现般的职业生涯。若能在一个行业里,持续地提升自己,早晚得是有发光的时候。编程亦是哪些,那些做得最好的,往往是做得最久的。

    书评

    再回到这本书上,架构也是这样循序渐进出来的。底层的代码,影响了顶层的建筑,便需要一点一滴慢慢从底层关注系统。大体上,我是将这本书分成了两部分:

    第一、二部分,资深程序的程序员都会有一定的了解、实践。第三部分,是他最为人所知的 SOLID 原则,他最早出现 15 年前的《敏捷软件开发》等书上。而作为一个接受过 ThoughtWorks OO Bootcamp 训练的学员,我大抵还是能相当熟悉的运用它们。

    第四部分,在讲述组件化架构,都是能以 UI 项目,而非后端服务谈论组件化架构,那倒能多得几分。终于在第五部分,开始总结性地介绍软件架构??然后,剩余的部分都在讲代码故事,Uncle Bob 讲述故事的能力,大概是我的好几个数量级。

    说到底,还是因为我太年轻了,没能读懂这本书的精髓。看上去像可有可无的大道理,在落地上倒是得自己花时间去考虑。遇到一个架构方面的难题,带上这本书,加上所谓的悟性,或许我的问题就能迎刃而解。要是一看,本书倒是不适合初学者。可是,这本书的叙述方式,又相当的适合初学者。

    要是各位对这本书有兴趣,又有些不是甚懂,建议去看看《代码整洁之道》。

    展开全文
  • 本文是《架构整洁之道》的读书心得,作者将书中内容拆解后再组织,不仅加入了个人的独到见解,而且用一张详细的知识脉络图帮助大家了解整本书的精华。如果你读过这本书,可以将本文当做一次思想交流,如果你还没看过...
  • 架构整洁之道 罗伯特·C·马丁 162个笔记 ◆ 推荐序一 无论是微观世界的代码,还是宏观层面的架构,无论是三种编程范式还是微服务架构,它们都在解决一个问题——分离控制和逻辑。所谓控制就是对程序流转的与业务...
  • 架构整洁之道(一)-良好架构的作用 一、软件架构的目标 软件架构的终极目标 使用最小的人力成本实现软件的构建和维护。 衡量一个架构好不好,其实就是看维护代码需要的成本很低,并且长时间维持比较低的状态。 ...
  • 架构整洁之道的作者是创造“Clean神话”的Bob大叔,作者总结了其数十年的软件从业经历,围绕构建整洁架构展开讨论,系统的分享了整洁架构的方方面面。 架构师要做什么。软件架构的价值可以在两方面体现,一方面是...
  • 04Go工程化(一) 架构整洁之道阅读笔记
  • 最近开始看了《架构整洁之道》,对下面这个图比较有感触,就拍了上传作为记录下。 这本书给我的感觉是自己原来根本不会设计程序,原来程序的设计不单是功能的实现和框架的使用,编写程序虽然不是必须要这么做,但好...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 302
精华内容 120
关键字:

架构整洁之道