首页 > 其他分享 >面向对象设计原则

面向对象设计原则

时间:2023-08-06 17:04:06浏览次数:32  
标签:职责 原则 对象 复用 接口 面向对象 Principle 设计

单一职责原则(Single Responsibility Principle)

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

单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

开闭原则(Open Closed Principle)

开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

面向对象设计的基石是“开—闭”原则。

“开一闭”原则讲的是:一个软件实体应当对扩展开放,对修改关闭。

这个规则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

从另外一个角度讲,就是所谓的“对可变性封装原则”。

“对可变性封装原则”意味着两点:

1 .一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。

2.一种可变性不应当与另一种可变性混合在一起。即类图的继承结构一般不应超过两层。

做到“开—闭”原则不是一件容易的事,但是也有很多规律可循,这些规律同样也是设计原则,它们是实现开—闭原则的工具。

里氏替换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。但反过来的代换不成立

如果有两个具体类A和B之间的关系违反了里氏代换原则,可以在以下两种重构方案中选择一种:

1 创建一个新的抽象类C,作为两个具体类的超类,将A和B共同的行为移动到C中,从而解决A和B行为不完全一致的问题。

2 从B到A的继承关系改写为委派关系。

咋一看觉得这个怎么还是面向对象设计的原则呢?这个明明就是Java的语法规则。对,Java是提供了对里氏代换原则在语法上的支持。但是仅仅是语法上,在和现实世界的相符合程度上根本没有提供。所有常常会有不符合里氏代换原则的情况出现。

依赖倒置原则(Dependence Inversion Principle)

依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程。

针对接口编程的意思是,应当使用接口和抽象类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明、参量的类型声明,方法的返还类型声明,以及数据类型的转换等。

依赖倒转原则虽然强大,但却不易实现,因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类。维护这样的系统需要较好的面向对象的设计知识。

此外,依赖倒转原则假定所有的具体类都是变化的,这也不总是正确的。有一些具体类可能是相当稳定、不会发生变化的,消费这个具体类实例的客户端完全可以依赖于这个具体类。

接口隔离原则(Interface Segregation Principle)

接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

接口隔离原则讲的是:使用多个专门的接口比使用单一的接口要好。

从客户的角度来说:一个类对另外一个类的依赖性应当是建立在最小的接口上的。如果客户端只需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。提供接口意味着向客户端作出承诺,过多的承诺会给系统的维护造成不必要的负担。

合成复用原则(Composite Reuse Principle)

合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,

使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。

合成、聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部份,新的对象通过向这些对象的委派达到复用已有功能的目的。这个原则有一个简短的描述:要尽量使用合成、聚合,尽量不要使用继承。

合成、聚合有如下好处:

新对象存取成分对象的唯一方法是通过成分对象的接口。

这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不到的。

这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。

合成、聚合可以应用到任何环境中去,而继承只能应用到一些有限环境中去。

导致错误的使用合成、聚合与继承的一个常见原因是错误的把“Has-a”关系当作“Is-a”关系。如果两个类是“Has-a”关系那么应使用合成、聚合,如果是“Is-a”关系那么可使用继承。

迪米特法则(Law of Demeter)

迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。

迪米特法则说的是一个对象应该对其它对象有尽可能少的了解。即只与你直接的朋友通信,不要跟陌生人说话。如果需要和陌生人通话,而你的朋友与陌生人是朋友,那么可以将你对陌生人的调用由你的朋友转发,使得某人只知道朋友,不知道陌生人。换言之,某人会认为他所调用的是朋友的方法。

以下条件称为朋友的条件:

当前对象本身。以参量的形式传入到当前对象方法中的对象。当前对象的实例变量直接引用的对象。当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友。

当前对象所创建的对象。

任何一个对象,如果满足上面的条件之一,就是当前对象的朋友,否则就是陌生人。

迪米特法则的主要用意是控制信息的过载,在将其运用到系统设计中应注意以下几点:

在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。

在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。在类的设计上,只要有可能,一个类应当设计成不变类。在对其它对象的引用上,一个类对其它对象的引用应该降到最低。

标签:职责,原则,对象,复用,接口,面向对象,Principle,设计
From: https://blog.51cto.com/u_11906056/6985105

相关文章

  • 系统架构设计师笔记第45期:SOA参考架构
    SOA(Service-OrientedArchitecture,面向服务的架构)是一种软件设计和开发的方法论,它将软件系统划分为一组相互协作的服务。下面是一个示例的SOA参考架构,展示了不同服务之间的关系和功能:服务提供者(ServiceProvider):这些服务提供者负责实现和提供具体的功能服务,如用户管理服务、支付服......
  • 笔记|数据库设计——《数据库原理》
    数据库结构设计包括⚫需求分析阶段:综合各个用户的应用需求⚫概念结构设计:形成独立于各个DBMS概念模式,如E-R图⚫逻辑结构设计:形成数据库逻辑模式与外模式,用(基本)数据模型描述,例基本表、视图等⚫物理结构设计:形成数据库内模式,如DB文件或目录、索引一.需求分析......
  • Python类与面向对象
    目录一、面向对象的概念1.是什么?2.特点二、类与对象1.类的定义(1)类的定义格式(2)类的定义形式2.类的构造(创建create)方法3.类的实例化(类的对象化)(1)对象的创建格式(2)访问对象成员4.成员的定义及访问(1)私有变量和方法的访问——只允许本类使用,子类和外部都不能访问(2)公有变量和方法的访问......
  • 美的(Midea)超声波清洗机 眼镜清洗机 超声波洗眼镜 首饰剃须刀手表假牙牙套化妆刷 洗眼
      前段时间买了一个美的的超声波清洗机,就是那种超声波洗眼镜的那种,本着买个高档的可以分体的那种好清洗的原则,就在JD上千挑万选后买了下面的这个货: 链接地址:https://item.jd.com/100037217483.html 美的(Midea)超声波清洗机眼镜清洗机超声波洗眼镜首饰剃须刀手表假牙......
  • Sketch Mac中文版下载 最佳矢量绘图设计软件 官方版特色
    Sketch是一款功能强大的矢量设计工具,旨在帮助设计师创建出精美的用户界面、网页和图标设计。作为Mac操作系统的专用设计软件,Sketch在设计领域中已经享有盛誉,并被全球设计师广泛使用。其直观的界面、出色的功能和强大的工具使得设计师能够快速而高效地创建出令人惊叹的作品。软件地......
  • 基于STM32设计的智能空调
    一、项目背景随着人们生活水平的不断提高,对居住环境的舒适度要求也越来越高。空调作为一种重要的家电设备,已经成为了现代家庭中必不可少的一部分。本文介绍了一种基于STM32的智能空调设计方案,可以自动地根据环境温度进行温度调节。二、设计思路2.1整体构架智能空调系统由温度检测......
  • 【软考备战·四月模考】希赛网四月模考软件设计师上午题
    题目及解析来源:2023上半年软考-模考大赛一、成绩报告二、错题总结第一题解析:相联存储器的工作原理就是根据中央处理单元给出的一个相联关键字,然后据此完成后续的读取工作,所以相联存储器均是按关键字进行检索的。第二题解析:A项,海明码是一种利用奇偶性来检错和纠错的校验方法,A正......
  • 数码管亮度控制器的设计
    通过分频改变占空比来控制数码管的亮暗程度想要些思路还有一些程序上的建议因为对于程序编写知识有点差在quartus9.0中编程数码管亮度控制器的设计可以通过以下步骤实现:选择一个定时器模块,例如STM32的TIM模块,来生成一个固定频率的PWM信号。将PWM信号连接到数码管的控制引脚上,通......
  • 设计原则总结
    目录封装变化针对接口编程,不针对实现编程多用组合(has-a),少用继承(is-a)为交互对象之间的松耦合设计而努力最少知识原则LKP/迪米特法则LawofDemeter好莱坞原则SOLID原则单一职责原则SRP开放关闭原则OCP里氏替代原则LSP接口隔离原则ISP依赖倒置原则DIP......
  • 《软件测试的艺术》原书第三版 - 第四章 - 测试用例的设计
    第四章测试用例的设计白盒测试白盒测试关注的是测试用例执行的程度或覆盖程序逻辑结构(源代码)的程度。完全的白盒测试是将程序中每条路径都执行到,然而对一个带有循环的程序来说,完全的路径测试并不切合实际。逻辑覆盖测试判定覆盖或分支覆盖是较强一些的逻辑覆盖准则。该准......