zoukankan      html  css  js  c++  java
  • 面向对象设计原则

      面向对象设计原则是从设计模式中总结出来的指导性原则,也就是说面向对象设计原则遵循了设计模式。我们平时在开发软件的时要尽量遵循面向对象设计原则进行开发。面向对象设计原则为支持可维护性复用而诞生.

      1、单一职责

        定义: 一个类只负责一个功能领域中的相应职责,或者可以定义为,就一个类而言。应该只有一个引起变化的原因。

        以一个类来说,在定义一个类的时候应该明确这个类的动作,所有的动作只针对一个事物(职责),比如有一个汽车类,它有几个方法分别是开门、关门、前进、后退、洗车、维护等功能。

        

      按照单一职责的定义,一个类只负责一个功能领域中的相应职责。 汽车能干什么?汽车可以开门,关门,前进,后退;这是汽车应该干的事。对于洗车,修车,保养这些动作应该是修车厂的事情。

      看图:

      

      为什么要这样做?单一职责带来了哪些好处?

        降低了类的复杂程度,提高可读性,一个类只负责一项职责(对一个事物的操作),使类的方法高度聚合。

        低耦合,提高可维护性,对其修改引起的风险降低。

      2、开闭原则

        开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性

        定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应该尽量在不修改原有代码的情况下进行扩展.

          开闭原则的关键在于抽象,使用接口、抽象类对一些功能抽象化,再通过具体的类来进行扩展。

        比如,系统主题,今天用第一个主题,明天用第二个主题;在这些主题切换时不应该对现有系统进行更改。如果把这些主题抽象出一个基类,那是不是我要用哪个主题时只要把主题直接引用赋值给基类就行了。要添加主题直接继承基类就可以了,不需要修改原有的代码。

        

       3、里氏替换原则

        定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.
        里氏代换原则是实现开闭原则的重要方式之一,只对扩展开发,对修改关闭。在软件中将一个基类对象替换成它的子类对象时,程序将不会产生任何错误和异常,反过来则不成立。子类其实是基类的扩展类,它有的功能基类不一定有。
        里氏替换原则它是实现开闭原则的一种方式,也应该对扩展开发,对修改关闭;子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
       4、依赖倒转原则

        什么是依赖倒置,把细节进行抽象,抽象不应该依赖于细节,细节应该依赖于抽象,就是针对接口编程,而不是针对具体编程。
    依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类型来做这些事情。
        为了确保该原则的应用,一个具体类应当只实现接口或者抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。

      5、合成复用原则:
        它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
        继承有什么问题?
          1、继承复用破坏了类的封装性,继承会将基类的实现细节暴露给子类,父类对子类是透明的,这种被称为“白箱”复用。
          2、子类与父类的耦合度高,父类的实现发生变化会导致子类的实现发生变化,不利于类的扩展与维护。
          3、类没有声明final才能被继承,使用条件有限。
          4、从基类继承的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。
        使用组合、聚合复用,可以将已有的对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能。它有以下优点:
          1、它维持了类的封装性,因为成员对象的内部细节是新对象看不见的。
          2、新老对象的耦合度底,对老对象的扩展不会影响到现有对象,新对象获取老对象的唯一办法是通过它的接口。
          3、复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
      6、接口隔离原则:
        接口隔离主要是对接口的一种约束,对接口的定义应该尽量小而合理,不会导致实现类被迫设计冗余的代码,降低类对接口的依赖性。
        接口的定义应该尽量遵循一个接口只服务于一个子模块或业务逻辑;为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法,把一个大的接口尽量拆分成多个小功能接口,用到谁实现谁,减少冗余代码;提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
        优点:
          1、将囊肿庞大的接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
          2、接口隔离提高了系统的内聚性,降低了系统的耦合性。
          3、能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码。

      7、迪米特法则

        迪米特法则又叫最少知识法则,就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。定义:只与朋友交谈,不跟陌生人交谈;其本意是对象与对象之间没有直接关系的情况下,不应当发生直接的相互调用,可以通过第三方转发调用。其目的是降低类之间的耦合度,提高模块的相对独立性。“朋友”指的的是:对象自身、以参数传入的方法中的对象、成员对象、当前对象所创建的对象。
        限制类之间相互的优点:
          1、减低类之间的耦合度。
          2、提高复用性和扩展性。
        缺点:
          1、大量使用,会导致系统产生大量的中介类。
          2、增加了结构的复杂度。

        比如,明星与经纪人的关系。明星的职责应该是全身心的投入艺术,经纪人是替明星处理日常的事务。明星和经纪人是有直接关系的,而粉丝和媒体公司是被明星的艺术才华吸引过来的,他们与明星不存在任何直接关系,看示例图

        

  • 相关阅读:
    (转)The Road to TensorFlow
    (转) TensorFlow深度学习,一篇文章就够了
    论文笔记之:Fully-Convolutional Siamese Networks for Object Tracking
    关于 Local feature 和 Global feature 的组合
    (转) 技术揭秘:海康威视PASCAL VOC2012目标检测权威评测夺冠之道
    (转)一文学会用 Tensorflow 搭建神经网络
    (转)TensorFlow 入门
    (转)阿尔法狗是怎么用机器学习做决策的
    How to Configure the Gradient Boosting Algorithm
    A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning
  • 原文地址:https://www.cnblogs.com/liaobudao/p/11234409.html
Copyright © 2011-2022 走看看