前言
一个不想做架构师的程序员不是一个好程序员。
所以最近在看一本《架构整洁之道》觉得还不错,这里把看过的一些笔记和心得汇总一下。
以便后面自己可以温故知新,也方便小伙伴们可以快速的认识到架构的真谛。扯远了,进入正题。
编程范式
先从编程范式开始讲起。目前常见的有3种编程范式:结构化编程、面向对象编程、函数式编程。每种范式的出现,都具有重大意义。
前两种我们比较熟悉。后面一种其实出现的更早,只是作为Java开发来说,是最近才慢慢开始接触。
下面针对上面3种范式,进行一个简单的说明解释。
结构化编程
什么是结构化编程,其实我们不知不觉都在使用,且听我娓娓道来。一般机器的运行是按命令来执行的。
例如,在汇编时代,我们编排好一堆命令,让机器去逐条执行,以操控各种硬件。当我们需要控制某些
流程时,就会用到类似goto的语句,让机器执行完本条命令后,跳转到另一条命令执行(这两条命令并不是
按编排好的顺序排放的)。这样就能很灵活的控制程序的流程走向。但人类的思维是连续的,这种goto的
连续跳跃,使人类无法很好的理解程序的意向。于是我们打算做一些约束,同时发现了一套结构化定理:
任何程序都可以用顺序、选择和循环三种基本控制结构来表示。
即在Java的世界里,我们的代码是顺序执行的,使用if-else来代表执行的选择,使用for和while来控制循环。
这样我们就可以很好的屏蔽类似goto语句的使用,使整个程序阅读更加流畅,更加接近人类的理解,
有了以上的铺垫,结构化编程可以总结到一句话:
结构化编程对程序控制权的直接转移进行了限制和规范
面向对象编程
结构化编程思维,还是比较靠近机器运行的思维。那么面向对象编程,就比较靠近人类的思维去编程了。
我们发现,简单靠结构化思维编程,很难构建起一个庞大的应用。在编码过程中,我们也会不知不觉的
把一些逻辑和数据封妆起来。形成一个可复用的组件。也许这就是人性思维。慢慢的,有人把这些习惯
总结成了一套方法论。并扩展了一些概念,让这套理论更加贴切人类的客观世界。对于面向对象编程有很多种说法
一种常见回答是:
面向对象是数据和函数的组合
还有一种回答是:
是一种对真实世界的建模
上面的总结都有道理,但也都不够概全。这里讲一下其中有3个概念是面向对象的核心,即:
封装、继承、多态
封装
在我看来,封装就是把数据和函数组合到一起。类似Java的类,有变量和方法组成。同时,由于封装的特性,
我们可以把一些内部使用的数据和函数隐藏起来。类似Java的权限控制,privite、protect、public等。
继承
简单点讲,就是在封装的基础上,我们可以定义一个所谓的子类,去继承父类的数据和函数。并根据需要,覆盖
其中的一些数据和函数形成子类特有的行为。这点,和现实中人类的DNA继承极为相似。
多态
上面讲继承时,说到了,子类可以覆盖父类的函数,当多个子类都去继承这个父类并覆盖这个函数时,多态其实
已经就开始形成了。此时我们可以使用父类的引用,使用不同子类的实例,调用这个被覆盖的方法,不同的子类实例
就会有不同的表现。所以多态可以用一句话来解释即:
同一个操作(方法或者函数)作用于不同的对象时,可以有不同的解释。
多态是非常有用的,我们可以使用依赖反转把实例化子类的操作剥离出去时,我们的程序设计就天然的变
成了插件式架构,这个后面会细讲,这里先点到为止。
函数式编程
这种编程思想主要是把运算过程尽量写成一系列嵌套的函数调用。我自己简单粗暴的理解是,把函数当作变量看待。且这些
函数有一些限定条件。即只要函数的入参是确定的,出参就是确定。函数不会改变任何变量状态。存粹的函数式编程语言编写
的函数没有变量。在JDK1.8中,已经开始有函数式编程的影子了。
架构师会比较关心变量的可变性。因为所有的并发问题,都是由于变量的可变性导致的。所以,在设计程序的时候,
我们往往需要把不会涉及到变量变更的逻辑,和需要操作变量变更的逻辑分离开来。前者就可以用函数式编程范式构建
函数。分成两个独立组件。前者因为没有对变量的操作,所以绝对线程安全。而且对单元测试也更加的友好。
总结
对于上面的编程范式,我们来总结一下:
结构化编程是对程序控制权的直接转移的限制
面向对象编程是对程序控制权的间接转移的限制
函数式编程是对程序中赋值操作的限制
总的来说,范式是限制编写程序的灵活性,以达到人类友好阅读的目的。所以业务架构从某种意义上来讲
也是在某种领域中限制程序员的一些行为,让他往我们所希望的规范方向编码。从而达到整个系统的简洁。