一、何为设计?

简单描述如下:

  • 按照一种思路或者标准来实现功能;
  • 功能相同,可以有不同设计方案来实现;
  • 伴随着需求增加,设计的作用才能体现出来;

二、《UNIX/LINUX 设计思想》准则

《UNIX/LINUX 设计思想》这边书提到设计软件应遵循的几大设计准则,如下所示:

  • 准则1:小即是美
  • 准则2:让每个程序只最好一件事
  • 准则3:快速建立原型(注:如先满足用户最基本需求,然后再一步步迭代)
  • 准则4:舍弃高效率而取可移植性(注:优先保障可移植性)
  • 准则5:采用纯文本来存储数据(注:在效率和可读性上的取舍,优先考虑可读性)
  • 准则6:充分利用软件的杠杆效应(软件复用)
  • 准则7:使用 shell 脚本来提高杠杆效应和可移植性
  • 准则8:避免强制性的用户界面(注:用户界面应该是作为一个软件单独存在,不应该是一个系统的必备项)
  • 准则9:让每个程序都作为过滤器(注:可以理解为数据能流水一样可以流经各个程序,如Koa中间件)

在《UNIX/LINUX设计思想》中还讲了几个小准则,常用的小准则如下:

  • 小准则:允许用户定制环境
  • 小准则:尽量使操作系统内核小而轻量化
  • 小准则:使用小写字母并尽量简短(注:list简写成ls)
  • 小准则:沉默是金(注:举例一个函数是处理数字的,它的返回值通常是数字。当遇到参数非数字格式的,此处应返回空或者不返回,而不是返回一些错误信息等诸如此类信息)
  • 小准则:各部分之和大于整体(注:以小个体组成大的整体)
  • 小准则:寻求90%的解决方案

注:建议每半年看下《LINUX/UNIX设计哲学》

举例1
准则:让每个程序都作为过滤器,演示如下:

  1. design-pattern git:(main) ls
  2. LICENSE dist node_modules src webpack.dev.config.js
  3. README.md index.html package.json tsconfig.json yarn.lock
  4. design-pattern git:(main)
  5. design-pattern git:(main)
  6. design-pattern git:(main) ls | grep .json
  7. package.json
  8. tsconfig.json
  9. design-pattern git:(main) ls | grep .json | grep package
  10. package.json
  11. design-pattern git:(main)

其中:

  • lsgrep都是过滤器,ls 命令输出的结果通过管道作为 grep 命令的输入;

举例2
准则:沉默是金,演示如下:

  1. design-pattern git:(main) ls | grep .json | grep package
  2. package.json
  3. design-pattern git:(main) ls | grep .json | grep package1
  4. design-pattern git:(main)

当在文件中搜索 package1 文件时,Shell 终端找不到这样的文件,就无任何输出(沉默是金),而不会返回类似no file这样的提示(如果返回这样的提示,就不方便作为后续命令的输入了)。

三、SOLID 五大设计原则

在JS中,针对设计原则有以下特征:

  • SO体现较多,详情介绍
  • LID体现较少,但是要了解其用意

2.1 S - 单一职责原则(Single Responsibility Principl)

  • 一个程序只做好一件事
  • 如果功能过于复杂就拆分开,每个部分保持独立

2.2 O - 开放封闭原则

  • 对扩展开放,对修改封闭
  • 增加需求时,扩展新代码,而非修改已有代码
  • 这是软件设计的终极目标

2.3 L - 李氏置换原则

  • 子类能覆盖父类
  • 父类能出现的地方子类就能出现
  • JS中使用较少(弱类型&继承使用较少)

2.4 I - 接口独立原则

  • 保持接口的单一独立,避免出现“胖接口”
  • JS中没有接口(typescript例外),使用较少

2.5 D - 依赖导致原则

  • 面向接口编程,依赖于抽象而不依赖于具体
  • 使用方只关注接口而不关注具体类的实现
  • JS中使用较少(没有接口 & 弱类型)

四、什么是模式?

模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。

人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。 但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实现代码可能会不一样。

算法更像是菜谱: 提供达成目标的明确步骤。 而模式更像是蓝图: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。

4.1 模式包含哪些内容?

大部分模式都有正规的描述方式,以便在不同情况下使用。 模式的描述通常会包括以下部分:

  • 意图部分简单描述问题和解决方案。
  • 动机部分将进一步解释问题并说明模式会如何提供解决方案。
  • 结构部分展示模式的每个部分和它们之间的关系。
  • 在不同语言中的实现提供流行编程语言的代码, 让读者更好地理解模式背后的思想。

部分模式介绍中还列出其他的一些实用细节, 例如模式的适用性、 实现步骤以及与其他模式的关系。

五、从设计到模式

设计模式,是由设计和模式两个词拼接而成。

  • 设计:主要指设计原则,通过设计原则提供统一的指导思想;
  • 模式:通过概念总结出来的一些模板(注:模块可理解为能效仿的固定式的东西);

简而言之,设计模式就是根据设计原则的指导思想,然后结合我们日常的开发经验,由一些大牛作者总结出来我们在日常开发中应该用到的一些固定模板。