每个程序员都将从了解设计模式原理和模式中受益。此概述仅供我参考,我已将其放在此处。 也许在设计,讨论或审查期间对您有帮助。请注意,这还远未完成,您经常需要在相互矛盾的原则之间进行权衡。 启发于:, The Principles of Good Programming,尽管如此,我个人更愿意去了解其中的一些原因和扩展阅读,若有些建议和更正我将会很高些。
目录:
- 一般性原则:
- KISS - keep it simple stupid
- 模块/类间
- Composite over Inheritance(Component Reuse Principle) 合成复用原则
- Demeter Principle 即迪米特法则
- Inversion of Control 依赖倒转原则
- 模块/类
-
Liskov Substitution Principle 李氏代换原则
-
Open/Closed Principle 开闭原则
-
Single Responsibility Principle 单一责任/功能原则
-
Interface segregation principle 接口隔离原则
-
内容
KISS-keep it simple stupid
如果大多数系统保持简单而不是更复杂,那么它必然更好更稳定的工作,为什么 ?
- 更少的代码意味着倾向于写起来花更少的时间,更少出现BUG,更容易去扩展和更改。
- 至繁归于至简 (达·芬奇)
- 似乎完美不是没有剩下什么可以添加,而是没有剩下什么可以去掉的时候
Demeter Principle 迪米特法则-即最少知道原则(Principle of Least Knowledge) 指一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。 每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元; 每个单元只能和它的朋友交谈:不能和陌生单元交谈; 只和自己直接的朋友交谈,也即不与陌生人交谈。
- 为什么:
- 与陌生单元交谈会引起更多的耦合
- 这样会显露更多的实现细节。
- 怎么做?
- 一个对象的方法只能调用这些方法:
- 当前对象的方法。
- 当前方法的的参数或参数的方法。
- 当前方法内创建的对象的方法。
- 当前对象的直接属性的方法。
- 一个对象的方法只能调用这些方法:
- 扩展阅读
Composite Over Inheritance: 合成复用原则
尽量使用合成/聚合的方式,而不是使用继承。
- 为什么?
- 实现类之间更少的耦合
- 使用继承,子类可以轻松地进行假设并打破LSP? Favor Composition Over Inheritance
- 怎么?
- 测试LSP(可替代性)以决定何时继承。
- 当存在 “拥有(has a)”或“使用(uses a)” 关系时使用合成。
- 扩展阅读
Inversion of control: 依赖倒转原则
“不要调用我们,我们会调用你(Don't call us, we'll call you)”。IoC是一种设计原理,与传统控制流程相比,IoC颠倒了控制流程。其中计算机程序的自定义编写部分从通用框架接收控制流。控制反转带有强烈的内涵,即可重用代码和特定于问题的代码是独立开发的,即使它们在一个应用程序中一起运行。
-
为什么?
- 控制反转用于程序的模块化并使程序具有扩展性。
- 将程序/任务的执行与实现进行解耦。
- 使模块专注于为其设计的任务
- 可能于上面几个意思相同:将模块从关于其他系统如何执行其任务(what they do)的假设中解放,取而代之的是依赖于契约。
- 可避免模块替换产生的副作用(只要被更换的模块依旧按照契约执行其任务)。
-
怎么?
- 使用工厂模式。
- 使用Service Locator 模式。
- 使用依赖注入(Dependency Injection)
- 使用更符合实际的查找(Using contextualized lookup)
- 使用模板方法模式(Template Method Pattern)
- 使用策略模式 (Strategy Patern)
-
扩展阅读
Open/Closed Principle: 开闭原则
程序实体(classes, modules, functions, etc.)应该对扩展开放,对修改关闭。也就是说该程序实体使其功能行为得到扩展而无需修改其源码。
- 为什么?
- 通过最小化对当前代码得更改而提高可维护性和稳定性。
- 怎么?
- 只暴露可更改的部分,而隐藏其他部分。
- 编写可扩展的类(于可修改的类相反)
- 扩展阅读
Single Responsibility Principle:单一职责原则 规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该和该功能平行(功能平行意味着没有依赖)。责任可以定义为更改的原因,因此类或模块应该有且只有一个更改的原因。
-
为什么?
- 可维护性:只需要在一个模块中更改。
-
扩展阅读
Liskov Substitution Principle:李氏代换原则
LSP是关于对象的可预期的行为的,是面向对象的基本原则之一。任何基类可以出现的地方子类一定可以出现,并不会因此改变程序的正确性。LSP是继承服用的基石,只有当派生类可以替换掉基类,而且软件功能不受影响时,基类才能真正的被复用。而派生类也能够在基类的基础之上增加新的行为。李氏代换原则是对开闭源原则的一个补充。实现开闭原则的关键步骤就是抽象化,而基于子类的继承关系就是抽象化的具体实现,所以李氏代换原则使对实现抽象化的具体实现的具体步骤规范
-
为什么?
-
怎么?
-
扩展阅读
Interface Segregation Principle:接口隔离原则 使用多个具体的接口,比使用单个复杂的接口要好。接口应该更依赖于调用它的代码而不是更依赖于实现它的代码,另一个意思是降低类之间的耦合度。
-
怎么?
- 避免复杂的接口,类永远不必实现违反单一职责原则的方法。
-
扩展阅读