设计模式之美总结

这门课算是看完了,但是还是比较教条的理解,很多概念很难用上,先记录一下

代码评判标准

易维护、易读、易扩展、灵活、简洁、可复用、可测试七个标准
可维护性:可读性好、简洁、可扩展性好
灵活性:易扩展、易复用或者易用
可测试性:好写单测

原则

image.png

封装:安全,有限暴露提高易用性
抽象:隐藏方法具体实现,好理解
继承:代码复用,多用组合,少用继承
多态:子类可以替换父类

SOLID 原则 -SRP 单一职责原则:一个类一个函数做一件事情,不要过度设计,持续重构
SOLID 原则 -OCP 开闭原则:对扩展开放,对修改关闭
SOLID 原则 -LSP 里式替换原则:子替父,完全按照约定
SOLID 原则 -ISP 接口隔离原则:不让调用方调用没有用的接口
SOLID 原则 -DIP 依赖倒置原则:高不依赖第,抽象不依赖细节
DRY 原则:不要重复你自己
KISS 原则:尽量保持简单
YAGNI 原则:你不会需要它
LOD 法则:迪米特法则,高内聚,松耦合,不和陌生组件交流,只依赖必需的

重构

测试驱动开发
最小原型
持续重构:加UT

  • 未决行为
  • 全局变量
  • 静态方法
  • 复杂继承
  • 高耦合

编码规范

然后我发现公司的仓库已经做了很多了
命名规范

  • 准确达意,不同作用域可选用不同长度
  • 借助类信息简化属性/函数命名,借助函数信息简化参数命名
  • 易读、易搜索,避免生僻词
  • 符合项目统一规范,避免反直觉命名
  • 接口命名:统一使用「I 前缀」或「Impl 后缀」之一
  • 抽象类命名:统一使用「Abstract 前缀」或「无前缀」之一

注释规范

  • 注释包含:做什么、为什么、怎么做;复杂类/接口需说明如何用
  • 类与函数必须写注释,尽可能详细
  • 函数内部注释尽量少,通过命名、提炼函数、解释性变量、总结性注释提高可读性

代码风格

  • 函数不超过一屏(约 50 行),类大小视情况
  • 行宽不超过 IDE 显示宽度,避免过短导致折行
  • 使用空行分割代码块,较长函数尤其如此
  • 使用两格缩进(避免深层嵌套),禁用 Tab
  • 大括号位置统一:与上条语句同行,或另起一行
  • 成员排列:依赖类按字母序;先成员变量后函数;静态先于普通;按作用域大小排列

编码技巧

  • 将复杂逻辑拆分为函数 rayon类
  • 参数过多时,拆分为多个函数或将参数封装为对象
  • 函数职责单一
  • 不使用参数控制执行逻辑
  • 减少嵌套:去除多余 if/else,使用 continue/break/return 提前退出,调整执行顺序,提取独立函数

设计模式

设计模式要干的事情就是解耦。创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦。

创建型

  • 单例:一个类只允许创建一个对象(或者实例),那这个类就是一个单例类
    配置信息,解决资源冲突
  • 工厂:简单工厂、工厂方法
    • 简单工厂:根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器
    • 工厂方法:将某个代码块剥离出来,独立为函数或者类
  • 建造者/生成器:创建一杯奶茶,配料/口味/茶底可选
  • 原型模式:拿现成的当模板,复制后微调,js常用prototype,一个类型会自动拥有原型链

结构型

以下四种都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

  • 代理模式:非功能性需求,找代理,比如监控、统计、鉴权、限流、事务、幂等、日志、RPC、缓存
  • 桥接:不常用,抽象与实现分离,用组合代替继承。画图工具(铅笔、毛笔)和颜色(红色、蓝色)也是两个维度,桥接模式让工具和颜色自由组合,可以方便增加笔类和颜色
  • 装饰器:功能增强,比如log外面包一层
  • 适配器:常用,Adapter,充电器接口转接头,补救接口不兼容
  • 门面模式:可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。一键支付,一键飞行模式
  • 组合模式:不常用,树形结构,把叶子和容器,把零散和打包都当一样的东西。删除员工和删除部门都点删除就行。
  • 享元模式:不常用,共享静态的类型。下棋上千游戏大厅,共享同一套棋牌。和其它复用区别,应用单例模式是为了保证对象全局唯一。应用享元模式是为了实现对象复用,节省内存。缓存是为了提高访问效率,而非复用。池化技术中的“复用”理解为“重复使用”,主要是为了节省时间。

行为型

  • 观察者模式: 发布订阅模式,在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。观察者模式,它是将观察者和被观察者代码解耦,RPC里面MQ
  • 模版模式:复用和扩展,奶茶制作模板是 “煮茶底→加配料→加奶 / 糖→摇匀→装杯”,配料(珍珠 / 椰果)、甜度(三分 / 五分)是可变的。
  • 策略:策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。客户端代码如何选择使用哪个策略,有两种确定方法:编译时静态确定和运行时动态确定。其中,“运行时动态确定”才是策略模式最典型的应用场景。
    高级代码的运行流程就像 “做饭”:编译是 “买菜切菜”(准备原料),加载链接是 “摆好厨具”(准备工具),初始化是 “热锅烧油”(预热),执行是 “炒菜出锅”(核心操作),终止是 “洗碗收拾”(收尾)。而策略模式的动态选择,就是炒菜时根据口味(运行时条件)换调料(策略)
  • 职责链:在职责链模式中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。过滤器,拦截器
  • 状态模式: 有限状态机,实现方法分支逻辑法和查表法
  • 迭代器模式: 也叫游标模式。它用来遍历集合对象。这里说的“集合对象”,我们也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如,数组、链表、树、图、跳表。
  • 访问者模式:对象不动,不同访问者的操作方法不一样,将对象与操作解耦
  • 备忘录模式:快照模式,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。主要是用来防丢失、撤销、恢复等
  • 命令模式:命令模式就是 “把‘做什么’写成纸条,谁都能递纸条,谁接到纸条谁干活”,解耦命令发送者和接受者
  • 解释器模式::解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式
  • 中介模式:中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容