SOLID rules#
- S - 单一职责原则 (Single Responsibility Principle, SRP)
- 核心: 一个类应该仅有一个引起它变化的原因。
- 含义: 一个模块或类只负责一项功能或业务逻辑,避免高耦合。
- O - 开闭原则 (Open/Closed Principle, OCP)
- 核心: 软件实体(类、模块、函数)应该对扩展开放,对修改封闭。
- 含义: 当需要增加新功能时,应通过增加代码来完成,而不是修改现有的代码。
- L - 里氏替换原则 (Liskov Substitution Principle, LSP)
- 核心: 子类对象必须能够替换掉所有父类对象,且程序行为不变。
- 含义: 继承关系中,子类应扩展父类功能,而非改变父类功能。
- I - 接口隔离原则 (Interface Segregation Principle, ISP)
- 核心: 客户端不应强迫依赖它不使用的方法。
- 含义: 将庞大的接口拆分为更小、更具体的接口,使系统解耦。
- D - 依赖倒置原则 (Dependency Inversion Principle, DIP)
- 核心: 高层模块不应依赖低层模块,二者都应依赖其抽象。
- 含义: 要面向接口编程,而不是面向实现编程,具体类应尽量依赖抽象类或接口
// LSP错误示范:长方形不能是正方形的超类,正方形有隐式转换( h = w ),假定长方形<5,10>,则面积为50;强制转换为正方形<5,10>,则面积为100,不相等,subclass broke parent's contract.
SuperClass<长方形>.area((w, h) => w * h)
-> SubClass<正方形>.area((h) => h ** 2)
Tips#
总的来说,除了3、5、8,其他或多或少是SOLID原则的延伸
- 单独存放 Constants/Hard-coded values/Magic values
- 合理的 Folder structure,eg:public&src/components&contexts&lib
- use Fragment
- isolate layout styles from reusable components
- use typescript
- keep components simple,参考SOLID rules
- 子组件避免从父组件传递 setter,传递 handler,复杂操作逻辑写在 handler里面,子组件只需要调用 handle()就行;参考单一责任原则。
- useMemo, useCallback & React.memo()
- keep useEffect simple: one concern per useEffect
- useEffect() & fetch ==> useQuery()
- use custom hooks