读书笔记《Unix编程艺术》三

程序的可显性与透明性

1. 可显性

  • 定义:软件帮助人们(用户)知道“做什么、怎么做”
  • 理解:降低进入门槛

2. 透明性

  • 定义:能预测到程序的全部或者大部分行为,通过程序看透机器究竟在干什么
  • 理解:减少代码中存在的成本

3. 两者区分:

  • Linux内核:用户可以明确知道 Linux 内核的全部或大部分行为(高透明性),但是不能很简单的就可以通过程序知道怎么去读磁盘,写磁盘等(低可显性)。

  • SNG : 该工具可以将二进制的PNG文件无损转换成文本文件,并将文本文件再无损转换回二进制文件。通过将PNG转为文本文件,使得用户可以直接修改文本文件,即使PNG对用户可见(降低进入门槛,体现了高可见性),但是程序的代码本身并不透明(低透明性)

  • 其实并不需要特别的去区分透明性与可显性(个人看法),透明性与可显性综合起来就是需要尽量的使软件的行为保持最小惊异性,能让用户基本把握软件操作产生的影响,同时尽可能的使软件上手的成本低,不需要太多先验知识。

  • 对于不可编辑的表现形式(如PNG的二进制文件),尽可能写出辅助程序将其转为文本形式,称为文本化器

编码要点

1. 避免过度抽象,隐藏细节不等于无法访问细节。

  • 不能展示其行为的程序使故障检查难得多。
  • 提倡具有灵活性的程序,给有意愿的用户提供尽可能多的状态和活动信息

2. 程序调用中最大的静态深度是多少?

  • 理解程序时,需要调用的函数层次(应该是指理解上的层次)
  • 如果大于四层,则需要小心,代码层次太深会降低透明性

3. 代码是否具有强大、明显不变的性质?

  • 如正确处理字符串的C程序中,从各个字符串函数退出时,每个字符串缓冲区都会包含终止符NUL字节
  • 如按行读取文件时默认忽略(不返回)换行符

4. 软件是否有一个明显的执行主线?

  • 是否存在一些顺手可用的关键数据结构或全局唯一的记录器,捕获了系统的高层状态?
  • 这个状态是否很容易被形象化和检验,还是分布在各个全局变量中难以找到?

5. 程序的数据结构与其所代表的的外部实体之间,是否是一一对应的

  • 模块化原则中:每个数据结构仅代表一个事物,特殊情况用新的数据结构处理(此处与NULL对象的设计稍有矛盾,具体取舍由实际情况而定)

6. 整个程序读懂需要耗费多少精力?

  • 包括其中某个函数,模块等是否易读易找

7. 代码增加了特殊情况处理还是避免了特殊情况?

  • 每种不同的特殊情况处理之间有可能会产生冲突,冲突是Bug的温床
  • 特殊处理会使代码更难理解

8. 注意魔数和全局变量

9. 实现软件时要选择清晰易懂的算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值