读书笔记《Unix编程艺术》六
Posted Virtual_Func
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读书笔记《Unix编程艺术》六相关的知识,希望对你有一定的参考价值。
尽量把程序的复杂度从代码中转移到数据中
- 数据比逻辑更容易驾驭,尽可能把设计的复杂度从代码转移到数据中。
- 数据驱动编程:
- 把代码与代码要作用的数据划分清楚,在需要改变程序逻辑时,只需要编辑数据而不是代码
- 例子:语法编辑器需要识别文档中的关键字,可将支持识别的关键字放在某个文件中,每次程序执行前读取,而不是把关键字硬编码在程序中
- 专用代码的生成:
- 将一些代码的书写转移到使用自动化工具来完成
- 例子:可以用C写一个程序来读取配置文件并生成对应的html文档
用户接口设计
- 最小立异原则: 如有可能,尽量允许用户将接口功能为委派给熟悉的程序来完成。不能委派时,效仿熟悉的程序的工作模式
- 设计接口时,应仔细考虑用户群体的经验和知识,尝试去发现用户已知程序与自己程序之间的功能相似性,然后效仿已知接口的相关部分
- 评价接口的几个衡量值:简洁,表现力,易用,透明和脚本化能力
- 简洁:一个事务处理需要的动作时间及复杂度有效的最低上限
- 表现力:接口能触发相当广泛的行为。有更强大的功能
- 易用:使用该接口时要求用户需要记忆的东西
- 透明:对于用户动作的效果,能自然地给出中间结果,有用的反馈和错误通知
- 脚本化能力:接口能够容易的被其他程序使用
几种接口设计模式
- 过滤器模式:
- 接受标准输入的数据,转换后将结果发送到标准输出。如grep等
- Cantrip模式:
- 没有输入与输出,只产生退出状态数值。如rm, touch, clear等
- 源模式:
- 没有输入,产生输出。如 ls, ps, who等
- 接收器模式:
- 只接受标准输入,不发送任何东西到标准输出。如lpr等
- 编译器模式:
- 无标准输入与输出,将错误信息发送到标准错误端。如gcc
- ed模式:
- 在程序启动后需要与用户进行持续对话
- “引擎和接口分离”模式:
- 将程序的引擎部分(程序的核心算法和逻辑规则)从接口部分(接受用户命令,显示结果,提供历史记录等外部交互信息)分离
- 过滤器模式:
- 接口沉默是金原则:不输出任何无意义的或表示正确执行的杂乱输出
复杂度
复杂度的三个来源:代码量,接口复杂与实现复杂
由不同的选择带来不同的陷阱:
- manularity陷阱: 关注实现或代码的规模,将很多底层任务抛给用户
- blivet陷阱:关注代码库的规模,使用极端晦涩复杂的实现技术,系统复杂度层层叠加,难以调试
- adhocity陷阱:关注实现复杂度,拒绝使用统一但复杂的方式来解决一整类问题,更愿意对问题个体编写重复,专用代码
复杂度的特性:
- 本质复杂度:无法避免的,程序定义的复杂度。如硬件驱动程序必须要关注底层硬件接口引入的复杂度
- 选择复杂度:为了实现某个期望的功能而引入的复杂度。如编译器为了支持可视化引入GUI方面的复杂度
- 偶然复杂度:由于设计不良或错误引入的复杂度。如重复代码,功能互相干涉的代码引入的复杂度
以上是关于读书笔记《Unix编程艺术》六的主要内容,如果未能解决你的问题,请参考以下文章