1891_UNIX编程艺术之模块化的设计

全部学习汇总: g_unix: UNIX系统学习笔记 (gitee.com)

003_UNIX编程艺术之模块化的设计

总结一下:黑盒化、独立性、封闭性。

这个在软件设计的时候是十分值得注意的,我看到过的很多设计不够好的代码可能设计者自己都没有弄清楚究竟是在做什么。更麻烦的是,很多人考虑不到模块化,最终的设计可能会在反复堆叠代码。

按照这样的一个经验设计,或许一个接口的代码行数以及实际的物理行数(我理解应该是包含了注释以及空白的行数)应该都有一个推荐的数制。从这里看,如果取一个容易记得住的数据,那么我们似乎可以这么给新手做建议:无论你的注释行数在代码行数中的占比是多少,把你的接口设计控制在400行左右。当然,我考虑这样的建议是建立在一个假设的前提上的:其实我看到新手的注释写的还是很少的。

在这本书中看到过很多关于正交性的描述,我一直没理解什么算是正交性。从这一段描述看,似乎是可以理解为软件设计的效果相对来说是明确且操作固定。这些接口或者模块可能会对控制的对象的某个属性产生影响,但是并不会影响到其他的属性。

重构代码就是改变代码的结构和组织,而不改变其外在行为。当我在工作的过程中看到很多新手写的代码的时候,这通常是我经常想到的一个尝试的工作。计算机其实有计算机的思维,有时候我们在思考问题的时候需要跟自己习惯的思维做一个转换。

SPOT的原则:真理的单点性。简单来总结,应该是同样的功能应该只有一组实现。如果是是非得有两个以上的地方用到不同的表现形式,那么不应该做两份设计而是应该尝试通过一个转换的函数通过一个来生成另一个。

可能是适应了现在流行的一些工具,这些简单的工具我很少使用。而且,diff出来的结果给我的感觉是不够直观。不过,既然这个工具已经流行了这么多年而且还持续生存,那么一定有其合理性。使用的时候也一定会有一个比较好的实践方式。这个,作为以后的一个学习项去了解一下。如果可能,我倒觉得可以去了解一下上面提到的无需了解的内部代码实现看看这种优秀的设计在代码的实现上究竟是如何做的。

这一段让我想到了以前看到的一份关于Ken Thompson的一段采访文章,他提到过他与现在很多软件工程师相比在思考问题的时候可能思维方式不同。他比较容易从软件进一步深入直接看到硬件底层,而很多软件的设计在设计的时候多了很多无效的抽象层。

以前看过一点点OO的介绍,现在想来,的确是有这样的问题。在设计的过程中,我们可能过度关注于控制对象的设计但是却忽略了软件运行的层次。

看到这里,我想到了我现在接触的汽车电子的嵌入式软件设计。其实在这样的工作中,大家追求的也是一个框架性的抽象。但是,在背负了这么多的抽象包袱之后,一个很麻烦的问题来了:几乎所有的软件开发人员,无论是底层、中间层、接口层或者是应用软件的开发人员可能没有谁能够完整地理解系统的根本原理。这就导致了类似上面提到的问题:程序员不知道自己在做什么!

以上是模块化设计的时候需要反复询问自己的一些问题,几条对于嵌入式软件开发比较有价值的点如下:

  1. 全局变量尽可能少,不要过度使用全局变量;
  2. 模块的设计是否足够精简,比如在400~800行以内?
  3. 模块内的函数接口应该尽量简单;
  4. API应该简洁,简洁到能够用一两句话简单说清楚;
  5. API的参数足够少;

这是unix哲学中模块设计的一些读书笔记,整体看下来对于我现在的非unix的软件设计也是有很多可以借鉴的地方的。以后的实践中,可以针对此进行反复揣摩应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值