读书|Unix 编程艺术-模块性之软件分层

编程的本质其实也是一种思考。

或者我们大多知道每一种编程范式都能引导人们带着某种的倾向去分析和解决问题。

比如大家所熟知的 Java 基于面向对象编程去实现更好的抽象能力和清晰的对象边界。

同时从编程语言的发展趋势看,越高级的编程语言抽象能力越强,离实际要解决的领域问题就越近但离计算机硬件(底层)就越远。

而通常不管是哪种范式多少都会涉及到对代码中函数或对象的具体分层,而对于分层也是我们日常中经常会面对的操作,对于这一类操作通常会有两种思考方式:自顶向下与自底向上

由于受 C 语言影响,Unix 的传统则是胶合层原则,换句话说就是硬件与程序顶层对象之间的抽象层越少越好。

主要挑战是如何将问题从原始场景中进行简化归纳,使得代码和设计之间的层次变得更薄更扁平。

Unix 基于底层的原语是硬件层操作,后者特性固定且极其重要,出于后天学得的本能,Unix 程序员更倾向于自底向上的编程方式

读书|Unix 编程艺术-模块性之软件分层

而现代的程序员大多接触的都是高级语言居多,所采用的编程范式也是面向对象方式为主,思考方式更多的是自顶向下。

即围绕需求的最高层去展开,先从抽象层面规定程序要做些什么,然后再去分解填充具体怎么做的实现,最后用各种比较厚的中间层或者像 Unix 中所提到的胶合层把功能组合成一个整体。

大家也知道面向对象的语言对于问题的分解抽象比较容易,尤其是面对一些复杂问题场景需要大量的抽象时。

而选择面对对象的方式解决问题也会有一些可供参考的实践,例如当我们的面对的开发需求满足以下条件时,面向对象就不失为是一种好的选择:

能够精确预知程序具体要做什么事情

在实现过程中,程序不会发生重大的规格变化

在底层实现上程序可以有充分的自由来选择完成任务的方式

而从 Unix 的维度去看,若只习惯于用面向对象的方式去思考和解决问题,有时候也容易把简单的问题复杂化

比较常见的问题就是使用面向对象做设计时进行了过度的分层设计,复杂的分层让人很难理解程序到底做了什么,依赖关系是什么等等。

读书|Unix 编程艺术-模块性之软件分层

在实际的应用场景里,并非都是基于自顶向下的方式思考和实现所有环节,而是结合自底向上的方式去应用和实践

基于面向对象的自顶向下去定义应用的逻辑表达抽象规范时,通常也需要进行自底向上地去思考和整理。

从底层的角度看哪些是不变的,是可以做为域原语级别的实现,然后把这些实现做进一步的划分 —— 即使顶层的设计变化了,这些内容仍然是可以重用的。

例如基于某一领域实体如 order 实体去打通不同产品线的实现,使用自顶向下的思考时,是可以做很多对于领域对象的抽象规范设计。

但可能若从不同的产品线基于自底向上的思考则可以发现有很多各产品线本身不变的一些元素或服务,是不会随着顶层设计的变化而变化的。

那么这些元素或服务则可以做为整体设计底层中不变的实现,就不需要过度地拆分,否则效果往往也会适得其反。

读书|Unix 编程艺术-模块性之软件分层

简单来说,自底向下的方式类似第一性原理

通常来说不管是哪一类系统,总有一部分领域是属于稳定不变或很少变化的,可以做为域原语级别的存在的。

这部分内容基于自底向上的方式去展开可以帮助我们更好地定位到系统的本质实现,或者看到整体系统中有哪些是不变的部分,强调以更薄的胶合层去进行功能的组合

自顶向下的方式的思考则是以一个更为宏观的方式去对事物进抽象定义,至少是透过现实中事物的表现形式去划分其所处理的抽象层次,鼓励应用较厚重的胶合和复杂层次再把这些不同层次的事物进行整合成为一个整体

来源:品读时光

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐