面向对象设计原则

来源:互联网 发布:c语言连接字符串 编辑:程序博客网 时间:2024/05/29 12:53

1、单一职责原则

    在软件系统总,一个类只负责一个功能领域中的相应职责,仅有一个引起它变化的原因。在一个类中,承担的职责越多,职责就会被耦合在一起,需要修改某个职责时会造成其它的职责受到影响,而且它被复用的可能性越小。类的职责主要体现在了数据和行为,在代码设计上数据体现在了类的属性上,行为体现在了类的方法中,这就要求了设计人员需要把类中的涉及到的职责进行分析,把不同的职责进行分离,从而在类的属性和方法中体现出来。

2、开放-封闭原则

    开放是对软件扩展的开放,封闭式对修改的封闭。在现有的模块或功能在不修改的前提下进行扩展,实现了不修改原有的代码而改变了这个模块或功能的行为。这个开放大到系统,小到一个类甚至是一个方法。在设计中,实现这一原则关键的一步就是抽象化,这个是面向对象设计的目标,从而做到系统的灵活性和拓展性

3、里氏替换原则

    在系统中,能够使用基类对象的地方,也一定能够使用其子类对象,而且程序不会产生任何的错误异常。但是子类对象替换成基类对象就不一定能够使用基类对象,子类有可能存在不同的行为方式。在我们设计时,尽可能使用基类类型对象进行定义,在运行时再确定其子类类型,这样子类类型发生变化时避免对引用的地方造成大的影响。

4、依赖倒置原则

    高层模块不应该依赖于底层模块,它们都应该依赖于抽象。而抽象不应该依赖于细节,细节应该依赖于抽象。即针对接口抽象类编程,不针对实现过程的具体类编程,从抽象化中导出具体的实现类,这个是面向对象的主要的手段。实现的方式在代码中是使用抽象类,在配置文件中放的具体类。具体的代码实现方式是依赖注入,其中包括构造注入(通过构造函数注入实例变量)、设值注入(通过Setter方法注入实例变量),接口注入(通过接口方法注入实例变量),以抽象方式耦合是当前原则的关键。

5、接口隔离原则

    调用方不应该依赖那些他不需要的接口,及调用方仅需要知道它们需要知道与之相关的方法即可。这样就要就我们定义的接口不要太大,如果太大,就应该把他分解成多个专门的接口,每个接口承担一种相对独立的角色,承载的方法行为恰到好处,满足单一职责的原则,将相关的操作定义在一个接口中,满足高内聚。把调用方不需要的行为方法隐藏起来,提供的接口单独尽可能小,有必要时可以考虑定制服务接口的方式,把调用方需要的行为进行封装定义。

6、合成复用原则

    尽量使用对象组合,而不是继承来达到复用的目的。对象通过关联关系来使已知对成为对象的一部分,通过委派调用已知对象的方法达到复用,在这种情况下,要尽量使用组合/聚合关系,少用继承。但这个与我们面向对象特性继承是不冲突的,在不同的情况下复用已有的设计和实现,可以通过继承和关联关系(组合/聚合关系)来实现。继承从基类继承的实现是静态的,在运行时不能发生变化,实现简单易于扩展,但会破坏了封装,组合/聚合耦合对相对较低,可以选择的调用对象的行为操作,在运行时动态的进行,在使用的场景有所不一样。一般情况下对现有类型进行重复使用时,是优先考虑使用组合/聚合来实现复用,它类于类的耦合度减小,再考虑继承,继承有助于对问题理解,降低了复杂度,但也会造成系统构建和维护的困难。

7、迪米特原则

    一个软件实体应当尽可能少的与其它实体发生相互作用,主要的用途控制信息的过载。在狭义上,两个类不应该发生直接的相互作用,可以通过第三者转发这个调用,每个类不会和远距离的对象有直接关联,通过大量的小方法简化系统的局部设计,但也会造成模块间的通讯效率和不易协调。广义上,对对象之间的信息流量、流向以及信息的影响控制,主要是对信息隐藏的控制。每个模块不依赖其它的模块,每个模块可以独立的使用,到达这一目的通过的是信息隐藏,使得模块之间脱耦。在类设计结构上,应当尽量降低其成员变量和成员方法的访问权限,一个类型应当设计成不变的类,对其它类型对象的应用减少到最低。对象的合理引用是当前对象本身、以参数形式传入到当前对象方法中的对象、当前对象成员对象、集合中的元素、当前对象所创建的对象。

    

0 0
原创粉丝点击