面向对象编程设计原则

  1. 1.       单一职责 (SOP Single Responsibility Principle
  2. 2.       里氏替换(LSP Liskov Substitution Principle
    1. 子类必须完全实现父类的方法

注:若子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖,聚集,组合等关系代替继承

  1. 子类可以有自己的个性
  2. 覆盖或实现父类的方法时输入参数可以被放大

方法中的输入参数为前置条件(即,契约原则,先定义出WSDL接口,制定好双方的开发协议,然后再各自实现);

里氏替换原则也要求制定一个契约,就是父类或接口。契约制定好了,也就同时制定了前置条件和后置条件,前置条件是你要我执行,就必须满足我的条件;后置条件就是我执行完了需要反馈,标准是什么;

如:与父类的方法名相同,参数不同的话,即为重载(Overload)而非覆写(Override)

若,父类方法输入的是HashMap类型,子类输入的参数是Map类型,也就是说子类输入参数类型的范围扩大了,子类替代父类传递到调用者中,子类的方法永远都不会被执行。但是,如果Father类输入的参数类型宽于子类的输入参数类型,则父类存在的地方子类未必可以存在,因为一旦把子类作为参数传入,调用者就很可能进入子类方法的范畴。

  1. 覆写或实现父类的方法时输出结果可以被缩小

即,父类一个方法的返回值是T,子类相同的方法(覆写或重载)的返回值为S,则里氏替换原则要求S<=T。

  1. 3.       依赖倒置(DIP Dependence Inversion Principle

3.1

a.高层模块不应该依赖底层模块,两者都应该依赖其抽象

b.抽象不应该依赖细节

c.细节应该依赖抽象

3.2对象的依赖关系的三种传递方式

a. 构造函传递依赖对象

b. Setter方法传递依赖对象

c. 接口声明依赖对象(接口注入)

注:a. 每个类尽量都有接口或抽象类,或抽象类和接口两者都具备

b. 变量的表面类型尽量是接口或抽象类

c. 任何类都不应该从具体类派生

d. 尽量不要覆写基类的方法

e.结合里氏替换原则使用

4.接口隔离原则(ISP Interface Segregation Principle)

4.1接口分类

a. 实例接口(Object Interface), 即声明一个类,通过new关键字产生

b. 类接口(Class Interface) interface关键字定义的接口

4.2 接口设计原则

a. 接口要尽量小(拆分接口时,首先必须满足单一职责原则)

b. 接口要高内聚(提高接口、类、模块的处理能力,减少对外的交互)

注:在接口中尽量减少公布public方法,接口是对外的承诺,承诺越少越利于系统开发,变更的风险也越少,同时降低成本。

4.3 定制服务(只提供访问者需要的方法)

4.4 接口设计是有限度的

总结:接口隔离原则是对接口的定义,同时也是对类的定义,接口和类尽量使用原子接口或原子类来组装。

  1. 一个接口只服务于一个子模块或业务逻辑
  2. 通过业务逻辑压缩接口中public方法
  3. 已经被污染的接口,采用适配器模式进行转化
  4. 结合实际,具体应用
  1. 5.       迪米特法则(LOD Law of Demeter)即最少知识原则(LKP Least Knowledge Principle

一个对象应该对其他对象有最少的了解,其核心观念:类间解耦,若耦合

  1. 6.       开闭原则(OCP Open Closed Principle)

定义:软件实体应对扩展开放,对修改关闭,即一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。软件包括:项目或软件产品中按照一定的逻辑规则划分的模块;抽象和类;方法

尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化

扩展:将价格定义为int并非错误, 在非金融类项目中对货币处理时,一般取两位精度,通常的设计方法是在运算过程中扩大100倍,在需要展示时在缩小倍,减少精度带来的误差。

增加一个子类,覆写发生变化的方法,高层次的模块(即需要变化的模块static)通过新这类产生新的对象,完成业务变化对系统的最小开发。

 

变化可归纳为:

  1. 逻辑变化
  2. 子模块变化(会对其他模块产生影响,尤其低层次的模块必然引起高层次模块变化)
  3. 可见视图变化

6.1开闭原则对测试的影响

新增加一个子类,要新增加一个对应的测试类

6.1.2开闭原则可以提高复用性

6.1.3开闭原则可提高可为维护性

6.1.4面向对象开发的要求

6.2 开闭原则的具体应用

a. 抽象约束

通过接口或抽象类可以约束一组可能变化的行为,并且能够实现对扩展开放,其包含三层含义:第一,通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法;

第二,参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;

第三,抽象层尽量保持稳定,一旦确定即不允许修改

b. 元数据(metadata)控制模块行为

元数据:描述环境和数据的数据,即配置参数,可以从文件中获得,也可以从数据库中获得。

  1. 制定项目章程
  2. 封装变化:第一,将相同的变化封装到一个接口或抽象类中;

第二,将不同的变化封装到不同的接口或抽象类中,不应该有两个不同的变化出现在同一个接口或抽象类中

时间: 2024-10-01 20:27:39

面向对象编程设计原则的相关文章

面向对象的设计原则

面向对象设计原则是学习设计模式的基础,每一种设计模式都符合某一种或者多种面向对象设计原则.通过在软件开发中使用这些原则可以提高软件的可维护行和可用性,让我们可以设计出更加灵活也更加容易扩展的软件系统,实现可维护可复用的目标.在使用面向对象的思想进行系统设计时,前人共总结出了7条原则,它们分别是:单一职责原则.开闭原则.里氏替换原则.依赖注入原则.接口分离原则.迪米特原则和合成复用原则. 1.单一职责原则(SRP) 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象

面向对象思想设计原则 及常见设计模式

1.面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设计原则. 1)单一职责原则:就是开发人员经常说的”高内聚,低耦合”.也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个.在设计模式中,所有的设计模式都遵循这一原则. 2)开闭原则:一个对象对扩展开放,对修改关闭.也就是说,对类的改动是通过增加代码进行的,而不是修改现有代码.软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直

零散知识点(面向对象七大设计原则,jdbc--BaseDao,jsp九大内置对象。四个作用域)

面向对象七大设计原则: 1.开闭原则(OCP:Open-Closed Principle)2.里氏替换原则(LSP:Liskov Substitution Principle) 3.单一职责原则(SRP:Single responsibility principle)4.接口隔离原则(ISP:Interface Segregation Principle)5.依赖倒置原则(DIP:Dependence Inversion Principle)6.迪米特法则(LOD:Law of Demeter)

java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设计原则 单一职责原则 开闭原则 里氏替换原则 依赖注入原则 接口分离原则 迪米特原则 单一职责原则 其实就是开发人员经常说的"高内聚,低耦合" 也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个.在设计模式中,所有的设计模式都遵循这一原则. 开闭原则 核

Java 面向对象的设计原则

一. 1.面向对象思想的核心: 封装.继承.多态.   2.面向对象编程的追求: 高内聚低耦合的解决方案: 代码的模块化设计: 3.什么是设计模式: 针对反复出现的问题的经典解决方案,是对特定条件下(上下文)问题的设计方案的经验总结,是前人设计实践经验的精华. 4.面向对象设计原则 是面向对象设计思想(法理精神)的提炼(基本宪法),比面向对象思想的核心要素更具有实操性,比设计模式(各种具体法律条文)更抽象. 5.如何最大限度降低耦合度? 少用类的继承,多用接口隐藏实现细节. 避免使用全局变量.

GOF 的23种JAVA常用设计模式总结 03 面向对象七大设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 各位代码界的大佬们总结出的七大设计原则,还是需要好好了解一下 1.开闭原则 开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作<面向对象软件构造>(Object Oriented Software Construction)中提出:软件实

第2章 面向对象的设计原则(SOLID):3_依赖倒置原则

3. 依赖倒置原则(Dependence Inversion Principle,DIP) 3.1 定义 (1)要依赖抽象,不要依赖具体的实现类.简单的说就是对抽象(或接口)进行编程,不要依赖实现进行编程,这样就降低了客户与实现模块间的耦合.包含3层含义: ①高层模块不应依赖低层模块,两者都应该依赖于抽象 ②抽象不应该依赖细节 ③细节应该依赖于抽象 (2)何为“高层模块”和“低层模块” ①“低层模块”:每个逻辑的实现都是原子逻辑组成,不可分割的原子逻辑就是低层模块.一般和具体实现相关. ②“高层

《转》面向对象类设计原则

面向对象类的设计原则 1                 SRP(单一职责原则) 这个原则看起来很简单,就是说一个类只能承担一个职责. 但这里有一个关键:"职责"是如何理解的? 按照汉语的理解,职责其实分为两部分:"职"和"责"."职"就是这个类是什么,而"责"就是这个类要干什么. 举个例子来说:Door是一个对象,那么它的"职"就是门,"责"就是"开门.关

.NET 高级架构师0005 架构师之路(4)---面向对象的设计原则

1         OO的设计原则 采用面向对象的分析和设计思想,为我们分析和解决问题提供了一种全新的思维方式.我们在拿到需求之后(略去OOA,以后补全),接下来的问题就是:如何对系统进行面向对象的设计呢? 按照软件工程的理论,面向对象的设计要解决的核心问题就是可维护性和可复用性.尤其是可维护性,它是影响软件生命周期重要因素,通常情况下,软件的维护成本远远大于初期开发成本. 一个可维护性很差的软件设计,人们通常称之为"臭味"的,形成的原因主要有这么几个:过于僵硬.过于脆弱.复用率低或者