面向对象设计原则是软件开发中一系列重要的设计指南,它用于帮助开发人员构建可维护、可扩展和灵活的软件系统。
如果一个类承担的职责太多,就等于把这些职责耦合到了一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计。当变化发生时,设计会遭受到意想不到的破坏。
软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离。
软件实体(类,模块,函数等)可以扩展,但不能修改。即对于扩展是开放的,对于修改是封闭的。
但是实际上封闭修改是不可能的,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择,他必须先猜测出最有可能发生变化的变化种类,然后构造抽象来隔离那些变化。对于需求变化,如果软件设计初期没有意识到某处未来可能修改,也就是说目前并没有满足开放-封闭原则,那么在本次修改时,应该考虑未来这个地方是否还会变化,如果是,就做出适当的抽象。
开放-封闭原则是面向对象程序设计的核心,遵循这个原则能够带来面向对象技术声称的巨大好处,即可维护、可扩展、可复用,以及高度的灵活性。当然,软件设计时抽象也不是越多越好,那样软件会过于复杂且有很多无用的代码,我们应该分析出容易变化的地方,并适当进行抽象。
抽象不应该依赖细节,细节应该依赖于抽象,总结来说就是应该面向接口编程。
面向接口编程,接口实现容易替换。如果上层和下层耦合度高,下层就难以替换,程序修改起来就十分麻烦,更难以扩展,也就是说难以实现开放-封闭原则。
如果两个类不必彼此直接通信,那么这两个类就不必发生直接的相互作用,如果其中一个类需要调用另一个类当中的某一个方法,可以通过第三者转发这个调用。
迪米特法则的根本思想是强调了类之间的松耦合,类之间的耦合越弱越有利于复用,一个对弱耦合类的修改,对和它有关系的类影响较小。
合成/聚合复用原则是指优先使用合成/聚合,其次在考虑继承。
优先使用对象的合成/聚合将有助于保持每个类被封装,并被集中在单个任务上。继承是较强的耦合关系,让类和类的继承层次保持较小规模能够更容易把控整个程序的结构。