设计原则
# 设计原则
# 何为设计
- 即按照哪一种思路或者标准来实现功能
- 功能相同,可以有不同设计方案来实现
- 伴随着需求增加,设计的作用才能体现出来
# UNIX/LINUX 设计哲学
《UNIX/LINUX 设计哲学》这是一本书的名字,它里面讲了很多的设计准则。由于 UNIX/LINUX 是比较成功的操作系统,书的作者通过了解这两个操作系统,总结出了设计软件时应该遵循的 10 个设计准则。
- 准则 1: 小即是美
- 一个系统尽量做得小而精,不要盲目追求大而全
- 准则 2: 让每个程序只做好一件事
- 分割多个子程序,各自负责好自己的功能,让大程序成为多个子程序的集合
- 准则 3: 快速建立原型
- 先搭建能满足用户最基本需求的原型,再根据用户或自己的需求去升级迭代
- 准则 4: 舍弃高效率而取可移植性
- 代码的高效率相对于代码的可移植性和可复用性,优先级放低
- 代码的效率问题会随着硬件产品的升级而被抹平
- 准则 5: 采用纯文本来存储数据
- 纯文本比二进制可读性更高
- 现在硬盘成本低,效率问题可以通过硬件的升级来解决
- 准则 6: 充分利用软件的杠杆效应(软件复用)
- 写的东西尽可能抽象出来提高复用性,同准则 4
- 准则 7: 使用 shell 脚本来提高杠杆效应和可移植性
- 同准则 4,这是一种具体的解决方案
- 准则 8: 避免强制性的用户界面
- UNIX/LINUX 默认只有命令行,因为用户界面作为一个单独的软件而存在,不是一个操作系统的必备项
- 对于操作系统而言,用户界面会占用很大的内存,用户界面的输入会带来安全问题,用户界面的操作没有命令行高效
- 所以对于操作系统,应该避免强制绑定用户界面,把这个功能和系统本身分开
- 准则 9: 让每个程序都成为过滤器
- 每个子程序都是独立的,只做好一件事:就像过滤器一样让数据进来,处理完再出去,结果进入另一个子程序
- 举例:
ls | grep *.json
,管道符作为过滤器,ls 输出的结果通过过滤器过度到 grep 选择器的结果,实现了找到所有 .json 文件的功能
小准则:
- 允许用户定制环境
- 环境不能限制死,要提供配置文件方便用户进行配置
- 尽量使操作系统内核小而轻量化
- 内核与工具分离:内核只包含最核心的 API,其他的东西通过扩展或插件的形式来增加
- 使用小写字母并尽量简短
- 这是 LINUX 命名规范(list -> ls)
- 沉默是金
- 正例:如果只允许输出数字,遇到结果不是数字的场景,则输出 0 或什么都不输出
- 举例:
ls | grep *.json | grep 'package'
,如果结果中没有关键词 package,就什么都不会输出 - 反例:遇到结果不是数字的场景,输出 "这不是一个数字",那么之后的统计规则就变了,会出现问题
- 举例:
ls | grep *.json | grep 'package' | wc -l
统计最终输出结果有几行,如果找不到关键词时输出了其它字符串,那么统计行数就会出错了
- 各部分之和大于整体
- 以小的个体来组合成大的整体,遇到改变时就能解耦了
- 寻求 90% 的解决方案
- 一个产品不可能满足所有客户的需求,遵循二八定律即可(花 20% 的成本解决 80% 的需求)
# 五大设计原则:SOLID
# S - 单一职责原则(single)
- 一个程序只做好一件事
- 如果功能过于复杂就拆分开,每个部分保持独立
# O - 开放封闭原则(open)
- 对扩展开放,对修改封闭
- 增加需求时,扩展新代码,而非修改已有代码
- 这是软件设计的终极目标
# L - 李氏置换原则
- 子类能覆盖父类
- 父类能出现的地方子类就能出现
- JS 中使用较少(弱类型 & 继承使用较少)
# I - 接口独立原则
- 保持接口的单一独立,避免出现「胖接口」
- 胖接口:一个接口/函数做了所有事
- 慎重使用,并非绝对不能使用,因为外观模式就违背了这一条原则
- JS 中没有接口(typescript 例外),使用较少
- 类似于单一职责原则,这里更关注接口
# D - 依赖导致原则
- 面向接口编程,依赖于抽象而不依赖于具体
- 使用方只关注接口而不关注具体类的实现
- JS 中使用较少(没有接口 & 弱类型)
在 JavaScript 编程中,受限于语言本身的特性,S O 体现较多;L I D 体现较少,但是要了解其用意。
(完)