OOD面向对象编程规范

现在有许多设计原则,但是最基本的,就是SOLID(缩写),这五项原则。

S = 单一责任原则
O = 开闭原则
L = Liscov替换原则
I = 接口隔离原则
D = 依赖倒置原则


1.单一责任原则(SRP 原则):

它的意思是:“如果你可以在一个设备中实现所有的功能,你却不能这样做”。为什么呢?因为从长远来看它增加了很多的可管理性问题。

从面向对象角度解释是:"导致类变化的因素永远不要多于一个。"或者换行个说法:"一个类有且只有一个职责"。

如果有多于一个原因会导致你的类改变(或者它的职责多余一个),你就需要根据其职责把这个类拆分为多个类。

为什么拆分很重要的?

那是因为:


  • 每个职责都是轴向变化;
  • 如果类包含多个职责,代码会变得耦合;
2.开闭原则:(抽象是关键)

设计规则如下:

“软件实体(类,模块,函数等)应该对扩展开放,对修改关闭。”

这意味着在最基本的层面上,你可以扩展一个类的行为,而无需修改。这就像我能够穿上衣服,而对我的身体不做任何改变。

扩展开放意味着模块/类的行为可以被扩展,那么当需求变化时我们可以用各种各样的方法制定功能来满足需求变更或者新需求

你要对系统的核心业务进行抽象,如果你抽象化做的比较好,很可能,在扩展功能的时候它们不必做任何改变(比如Server就是一个抽象的概念). 你所定义的抽象的实现 (比如,IIS服务器 实现了 Server) 和 抽象的代码 (Server) 要尽可能的多. 这样在客户端代码中不需要做任何修改就会允许你定义一个新的实现(比如,ApacheServer) .

3.里氏替换原则:(多态性)LSP原则

原则描述了:

"子类型必须能够替换它们的基类."

或者,换句话说:

"使用基类引用的函数必须能够使用派生类而无须了解派生类."

在基本的面向对象原则中,"继承" 通常被描述成 "is a" 的关系. 如果一个 "开发者" 是"软件专业人员",那么 "开发者" 类 应该 继承 "软件开发人员" 类. 这样的 "Is a" 关系在类设计阶段非常重要,但是这也很容易让设计者得意忘形从而以一个糟糕的继承设计告终.

"里氏替换原则" 仅仅是一种确保继承被正确使用的手段.

  • 如果不遵循 LSP原则,类继承就会混乱。如果子类实例被作为参数传递给方法,后果难以预测。
  • 如果不遵循 LSP原则,基于父类编写的单元测试代码将无法成功运行子类。

    4.接口隔离原则:

    用户不应该被迫依赖他们不使用的接口。”假如你有一些类,
  • 你通过接口暴露了类的功能,这样外部就能够知道类中可用的功能,客户端也可以根据接口来设计。当然那,如果接口太大,或是暴露的方法太多,从外部看也会很混乱。接口包含的方法太多也会降低可复用性, 这种包含无用方法的”胖接口“无疑会增加类的耦合。
  • 这还会引起其他的问题。如果一个类视图实现接口,它需要实现接口中所有的方法,哪怕一点都用不到。所以,这样会增加系统复杂度,降低系统可维护性和稳定性。接口隔离原则确保接口实现自己的职责,且清晰明确,易于理解,具有可复用性。
    5.依赖倒置原则:(关键是抽象)

  • “高层次的模块不应该依赖于低层次的模块,而是,都应该依赖于抽象。”

    如果代码不遵循依赖倒置,就有下面的风险:

    • 使用低层级类会破环高层级代码;
    • 当低层级的类变化时,需要太多时间和代价来修改高层级代码;
    • 代码可复用性不高

    除 SOLID 原则外还有很多别的面向对象原则。比如:

    • “组合替代继承”:是说“用组合比用继承好”;
    • “笛米特法则”:是说“类对其它类知道的越少越好”;
    • “共同封闭原则”:是说“相关类应该一起打包”;
    • “稳定抽象原则”:这是说"类越稳定,就越应该是抽象类";

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
    单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
    动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
    适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
    策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
    设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
    模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
    迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
    外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
    单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
    组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
    装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
    观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
    代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
    工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
    状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
    命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
    享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结