一些软件设计的原则
软件设计的原则不单单只是软件开发,可能推广到其他生产活动中。甚至我们生活中遇到问题的思考。
Don’t Repeat Yourself(DRY)
DRY是最简单法则。它关注的是我们在两个地方发现一些相似代码后。我们需要把他们共性抽离出来,形成一个唯一的方法。并改变现有地方的代码,以适合的参数调用新的方法。
Keep It Simple,Stupid
KISS原则在设计上是备受推崇的。在家装,界面,操作设计上。它的哲学是:把一个简单的事情搞复杂是一件简单的事情,但是把一个复杂的事情变简单,是件复杂的事情。
面向接口变成,非面向实现编程
注重接口而不是实现,依赖接口而不是实现。这是由于接口的抽象是稳定的,实现则是多样化的。稳定的事物在操作起来更有安全感。
你可能不真正需要它原则
只考虑设计必须的功能,避免过度设计。实现目前需要的功能,在以后考虑需要更多功能时候,再进行添加。
如无必要,无增加复杂性。软件开发是一场沟通博弈。
迪米特法则(Law of Demeter)
迪米特法则又称之为 "最少知识原则" 它来源于1987年荷兰大学的一个Demeter项目。又被称作"不要和陌生人说话"
如果你想让你的狗跑的话 ,你会对狗狗说还是要对四条腿说?
如果你去买东西,你是把钱缴费电源,还是把钱包交给店员让他自己拿?
简言之,在对象调用对象的时候只出现一个"." dog.run() 而非 dog.getFouLeg().move()
面向对象的S O L I D法则
一般来说这是面向对象的五大设计原则。但是,我们可以把这些原则用于所有的软件开发。
Simple Responsiblility Principle(SRP) - 职责单一原则
其核心思想是:一个类,只做一件事。并把事做好。它只有一个引起它变化的原因。它可以看做是低耦合高内聚的在面向对象上的引申,将职责定义为引发
变化的原因,提高内聚性来减少引起变化的外因。职责过多,引起变化的原因就变多。一般情况下设计成引起变化的因素只有一类就好。职责与职责之间不
产生依赖。从而降低了耦合度。
正向例子:Unix/Linux
反向例子:Windows
Open/Closed Principle(OCP)-开闭原则
核心思想是:模块是可以扩展的,不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
对扩展开放:意味着有新的需求或者变化时,可以对现有代码进行扩展。以适应新的业务需求。
对修改封闭:意味着一旦设计完成,就可以独立完成其工作。而不要对类进行任何修改。
Likov substitution principle(LSP) - 里氏代换原则
子类必须能够被替换成他们的基类。
既:子类在任何地方时候都可以被他们的基类替换,代码还能正常工作。不应该在代码里进行if/else对子类的类型进行判断的条件。
LSP是开闭原则的一个重要保证。它也是我们进行类设计的重要思考条件。就像"蜗牛不是牛","鲸鱼是鱼"其判断条件方式就是里氏族代换原则来的。
Interface Segregation Principle(ISP) - 接口隔离原则
接口隔离是把功能实现在接口中,而不是类中,使用多个专门的接口比使用单一的总接口要好。
例子:电脑有很多使用方式。比如:看电影,聊天,看电影,上网,变成等等。如果把这些都申明在电脑的抽象类里。那么我们的上网本,PC机,服务器
这些都要实现所有的这些接口。就太复杂了。所以,我们把这些功能都隔离开,比如:看电影接口,聊天接口,上网接口。这样不同功能的电脑就可以有
选择地进行继承实现这些接口。
这个原则让我们可以使用"搭积木"的方式进行软件开发。 Java中的Event listener 和Adapter就是用这种原则实现的。
Dependency Inversion Priciple(DIP) - 依赖倒置原则
高层不应该依赖低层的实现。而是依赖于高层抽象。
墙面的开关不应该依赖于点灯的开关实现,而是依赖于一个抽象开关标准接口。当我们扩展程序时候,我们的开关同样可以控制其他不同的等,甚至不同的
电器。也就是说点灯和其他电器集成并实现我们的标准开关接口,我们的开关产商可以不需要关于要控制什么样的设备,只需要关心哪个标准开关就行。这
就是依赖倒置原则。
Common Closure Principle(CCP) - 共同封闭原则
一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包。便影响了包中的所有类。一个简单的说法是:一起修改的类,应该组合在一起(同个包里)
如果有需要改代码,我们希望所有的修改发生在意个包里,而不是分布在很多包里CCP实际上是对包的只能的相似进行聚合。对包的分配有指导作用。