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

尽量把程序的复杂度从代码中转移到数据中

  • 数据比逻辑更容易驾驭,尽可能把设计的复杂度从代码转移到数据中。
  • 数据驱动编程:
    • 把代码与代码要作用的数据划分清楚,在需要改变程序逻辑时,只需要编辑数据而不是代码
    • 例子:语法编辑器需要识别文档中的关键字,可将支持识别的关键字放在某个文件中,每次程序执行前读取,而不是把关键字硬编码在程序中
  • 专用代码的生成:
    • 将一些代码的书写转移到使用自动化工具来完成
    • 例子:可以用C写一个程序来读取配置文件并生成对应的HTML文档

用户接口设计

  • 最小立异原则: 如有可能,尽量允许用户将接口功能为委派给熟悉的程序来完成。不能委派时,效仿熟悉的程序的工作模式
  • 设计接口时,应仔细考虑用户群体的经验和知识,尝试去发现用户已知程序与自己程序之间的功能相似性,然后效仿已知接口的相关部分
  • 评价接口的几个衡量值:简洁,表现力,易用,透明和脚本化能力
    • 简洁:一个事务处理需要的动作时间及复杂度有效的最低上限
    • 表现力:接口能触发相当广泛的行为。有更强大的功能
    • 易用:使用该接口时要求用户需要记忆的东西
    • 透明:对于用户动作的效果,能自然地给出中间结果,有用的反馈和错误通知
    • 脚本化能力:接口能够容易的被其他程序使用
  • 几种接口设计模式

    • 过滤器模式
      • 接受标准输入的数据,转换后将结果发送到标准输出。如grep等
    • Cantrip模式
      • 没有输入与输出,只产生退出状态数值。如rm, touch, clear等
    • 源模式
      • 没有输入,产生输出。如 ls, ps, who等
    • 接收器模式
      • 只接受标准输入,不发送任何东西到标准输出。如lpr等
    • 编译器模式
      • 无标准输入与输出,将错误信息发送到标准错误端。如gcc
    • ed模式
      • 在程序启动后需要与用户进行持续对话
    • “引擎和接口分离”模式
      • 将程序的引擎部分(程序的核心算法和逻辑规则)从接口部分(接受用户命令,显示结果,提供历史记录等外部交互信息)分离
  • 接口沉默是金原则:不输出任何无意义的或表示正确执行的杂乱输出

复杂度

  • 复杂度的三个来源:代码量,接口复杂与实现复杂

  • 由不同的选择带来不同的陷阱:

    • manularity陷阱: 关注实现或代码的规模,将很多底层任务抛给用户
    • blivet陷阱:关注代码库的规模,使用极端晦涩复杂的实现技术,系统复杂度层层叠加,难以调试
    • adhocity陷阱:关注实现复杂度,拒绝使用统一但复杂的方式来解决一整类问题,更愿意对问题个体编写重复,专用代码
  • 复杂度的特性:

    • 本质复杂度:无法避免的,程序定义的复杂度。如硬件驱动程序必须要关注底层硬件接口引入的复杂度
    • 选择复杂度:为了实现某个期望的功能而引入的复杂度。如编译器为了支持可视化引入GUI方面的复杂度
    • 偶然复杂度:由于设计不良或错误引入的复杂度。如重复代码,功能互相干涉的代码引入的复杂度

你可能感兴趣的:(读书笔记)