前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构整洁之道 3~6章读书笔记

架构整洁之道 3~6章读书笔记

作者头像
跑马溜溜的球
发布2021-06-11 18:06:48
4360
发布2021-06-11 18:06:48
举报
文章被收录于专栏:日积月累1024

第2部分 从基础构件开始:编程范式

第3章 编程范式总览

三个编程范式包括:结构化编程(structured programming)、面向对象编程(object-oriented programming)以及函数式编程(functional programming)。

结构化编程

结构化编程对程序控制权的直接转移进行了限制和规范。

面向对象编程

面向对象编程对程序控制权的间接转移进行了限制和规范。

函数式编程

函数式编程对程序中的赋值进行了限制和规范。

仅供思考

没有一个范式是增加新能力的。也就是说,每个编程范式的目的都是设置限制。这些范式主要是为了告诉我们不能做什么,而不是可以做什么。

这三个编程范式分别限制了goto语句、函数指针和赋值语句的使用。

本章小结

多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程则是各模块的算法实现基础。这和软件架构的三大关注重点不谋而合:功能性、组件独立性以及数据管理。

第4章 结构化编程

科学理论和科学定律的特点:它们可以被证伪,但是没有办法被证明。

我们可以说数学是要将可证明的结论证明,而与之相反,科学研究则是要将可证明的结论证伪。

Dijkstra曾经说过“测试只能展示Bug的存在,并不能证明不存在Bug”

结构化编程范式中最有价值的地方就是,它赋予了我们创造可证伪程序单元的能力。

无论在哪一个层面上,从最小的函数到最大组件,软件开发的过程都和科学研究非常类似,它们都是由证伪驱动的。软件架构师需要定义可以方便地进行证伪(测试)的模块、组件以及服务。为了达到这个目的,他们需要将类似结构化编程的限制方法应用在更高的层面上。

第5章 面向对象编程

封装

C程序在头文件中进行数据结构以及函数定义的前置声明(forward declare),然后在程序文件中具体实现。程序文件中的具体实现细节对使用者来说是不可见的。C++作为一种面向对象编程语言,反而破坏了C的完美封装性。

继承

继承的主要作用是让我们可以在某个作用域内对外部定义的某一组变量与函数进行覆盖。

虽然面向对象编程在继承性方面并没有开创出新,但是的确在数据结构的伪装性上提供了相当程度的便利性。

多态

归根结底,多态其实不过就是函数指针的一种应用。

采用面向对象编程语言让多态实现变得非常简单,让一个传统C程序员可以去做以前不敢想的事情。综上所述,我们认为面向对象编程其实是对程序间接控制权的转移进行了约束。

程序应该与设备无关

依赖反转

关系的方向和控制流正好是相反的,我们称之为依赖反转。这种反转对软件架构设计的影响是非常大的。

通过依赖反转,软件架构师可以完全控制采用了面向对象这种编程方式的系统中所有的源代码依赖关系,而不再受到系统控制流的限制。不管哪个模块调用或者被调用,软件架构师都可以随意更改源代码依赖关系。

简单来说,当某个组件的源代码需要修改时,仅仅需要重新部署该组件,不需要更改其他组件,这就是独立部署能力。

如果系统中的所有组件都可以独立部署,那它们就可以由不同的团队并行开发,这就是所谓的独立开发能力。

本章小结

面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。

第6章 函数式编程

函数式编程语言中的变量(Variable)是不可变(Vary)的。

不可变性与软件架构

一切并发应用遇到的问题,一切由于使用多线程、多处理器而引起的问题,如果没有可变变量的话都不可能发生。

可变性的隔离

一种常见方式是将应用程序,或者是应用程序的内部服务进行切分,划分为可变的和不可变的两种组件。不可变组件用纯函数的方式来执行任务,期间不更改任何状态。这些不可变的组件将通过与一个或多个非函数式组件通信的方式来修改变量状态。

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

软件架构师应该着力于将大部分处理逻辑都归于不可变组件中,可变状态组件的逻辑应该越少越好。

事件溯源

在事件溯源体系下,我们只存储事务记录,不存储具体状态。当需要具体状态时,我们只要从头开始计算所有的事务即可。

这种数据存储模式中不存在删除和更新的情况,我们的应用程序不是CRUD,而是CR。因为更新和删除这两种操作都不存在了,自然也就不存在并发问题。

本章小结

软件,或者说计算机程序无一例外是由顺序结构、分支结构、循环结构和间接转移这几种行为组合而成的,无可增加,也缺一不可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第2部分 从基础构件开始:编程范式
  • 第3章 编程范式总览
    • 结构化编程
      • 面向对象编程
        • 函数式编程
          • 仅供思考
            • 本章小结
              • 第4章 结构化编程
                • 第5章 面向对象编程
                  • 封装
                  • 继承
                  • 多态
                  • 依赖反转
                  • 本章小结
                • 第6章 函数式编程
                  • 不可变性与软件架构
                  • 可变性的隔离
                  • 事件溯源
                  • 本章小结
              相关产品与服务
              数据保险箱
              数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档