模块拆分与封装
- 模块分层上层无需关注下层具体实现
- 模块职责确定,满足职责单一性
- “封装”是指将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类、模块)。封装的目的是 增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用 类的成员,核心在于数据隐藏
- 接口满足 SOLID 原则
什么是SOLID原则
- 职责单一原则 & 接口隔离:接口只做一件事情,而不在于事情大小;一个功能实现只允许出现一种解决方案
- 开闭原则:接口针对扩展打开,针对修改封闭,要求在不修改现有代码的基础上扩展功能
- 里氏替换原则:对接口行为约束,需要保证接口的不同实现之间可以相互替换
- 依赖倒置原则:模块之间不要有依赖,一个模块不直接依赖另一个模块的细节,而是共同依赖定义明确的接口
- 迪米特法则:只调用公共接口,不允许私自依赖内部实现
如何设计一个好的API
- 提升复用能力和扩展能力
- 降低使用复杂度
- 屏蔽内部细节,但提供足够的灵活性
- 防止用户误用,破坏设计者的约束
逻辑解耦与代码健壮
解耦:将纠缠在一起的若干逻辑分开,让它们不再相互影响,或者影响减小,改善设计可测试性、可维护性、可扩展性
三个步骤:
- 识别易变流程和不变流程;
- 分离“易变”与“不变”流程;
- 分离出“制程”阶段,利用“流程描述”定义生产流程,提高生产流程的灵活性;
契约式编程
指在函数调用者和实现者之间制订约定,规定调用者和实现者各自必须遵守的一些约束,以简化函数之间协作的 异常处理逻辑
进攻式编程
它强调在代码中预测并处理错误,而不是简单地依赖外部代码或调用者来保证输入的正确性。 进攻式编程的目标是在可能出现错误的地方主动采取措施,以确保代码的正常执行,并提供适当的错误处理和错 误消息。
防御式编程
防御式编程关注的是通过确保代码能够适应不正常或意外的情况,防止错误传播和程序崩溃。 它强调在代码中进行边界检查、错误处理和异常处理,以应对潜在的问题和异常情况。 防御式编程的目标是通过加入适当的错误处理机制,保护代码免受非预期输入或外部条件的影响,以提高代码的 可靠性和容错性。