这门课算是看完了,但是还是比较教条的理解,很多概念很难用上,先记录一下
代码评判标准
易维护、易读、易扩展、灵活、简洁、可复用、可测试七个标准
可维护性:可读性好、简洁、可扩展性好
灵活性:易扩展、易复用或者易用
可测试性:好写单测
原则

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 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。