五、接口隔离原则
1. 定义
i. 客户端不应该依赖那些它不需要的接口。
ii. 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
2.分析
i. 接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。
ii. 使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。
iii. 可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为
3.实例
i. 下图展示了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。如图所示:
图(一)
图(二)
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为这样做既满足了接口隔离原则,又满足了单一原则,何乐而不为呢,但是也带来了很多的不便,类增多了。
总结:类应该完全依赖相应的专门的接口
六、合成复用原则
1.定义
i. 尽量使用对象组合,而不是继承来达到复用的目的。
2.分析
i. 合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合关系,少用继承。
ii. 在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。
a) 继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )
b) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 )
iii. 组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。
3. 实例
i. 某教学管理系统部分数据库访问类设计如图所示:
图(一)
图(二)
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。
总结:类中应用,尽量使用对象组合而不是用继承来达到复用的目的。
七、迪米特法则
1. 定义
i. 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
2. 分析
i.迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。
ii. 狭义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。
iii. 广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明显。
iv. 迪米特法则的主要用途在于控制信息的过载。
1.在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及
2.在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限
3.在类的设计上,只要有可能,一个类型应当设计成不变类
4.在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
3. 实例
i.某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂。如图所示:
图(一)
图(二)
图(一)和图(二)分析:
图(一)为什么到图(二)哪?因为这样就可以降低类的耦合性,是类中功能更加单一,相当于外观模式。
总结:一个软件实体应当尽可能少的与其他实体发生相互作用
综述:以上就是其中程序员必备的七大面向对象设计原则,原则犹如国家的法规,这就是面向对象的准则,要使我们的编程更加灵活,封装性更好,复用性更高,易于维护我们需要我们的这些原则建设我们规范我们的程序。这样我们编写的才是高质量的程序。我们每个人都这样去做,我们的编程水平一定会进步一大截!
感谢大家的支持,无论是顶的,还是踩的,都谢谢你们,希望大家互相关注,共同进步。
上接:程序员必备的七大面向对象设计原则(二)
分享到:
相关推荐
下面是七大面向对象设计原则的总结: 一、开闭原则 开闭原则是面向对象设计中最重要的原则之一。它定义为:一个软件实体应当对扩展开放,对修改关闭。也就是说,在设计一个模块的时候,应当使这个模块可以在不被...
深入理解面向对象编程(OOP)的基本原则,如封装、继承、多态等,是构建高效、可扩展性强的Java应用程序的基础。良好的面向对象设计不仅能提高代码的复用率,还能降低系统维护的成本。 #### 九、编码规范 遵循一致...
### Java程序员必备技能详解 #### 一、语法基础 对于一名Java程序员而言,掌握扎实的语法基础至关重要。这意味着在编写代码时,面对IDE(集成开发环境)中的报错信息能够迅速定位并解决语法错误。例如,当遇到诸如...
STL极大地提高了开发效率,简化了编程工作,是C++程序员必备的知识。 九、智能指针 智能指针是一种自动管理内存的对象,如std::unique_ptr、std::shared_ptr和std::weak_ptr。它们在对象不再使用时自动释放内存,...
- **设计模式**:利用面向对象的设计模式解决常见的软件设计问题。 - **接口与实现分离**:将接口和实现分离,增强代码的灵活性和可扩展性。 - **契约编程**:通过预设条件、后置条件等方式明确函数的行为预期。 ##...
熟练的C++程序员会深入理解类的设计原则,如单一职责原则、开闭原则等,以及接口与抽象类的区别。同时,他们会熟练运用虚函数、纯虚函数实现多态性,并理解虚析构函数的重要性。 三、STL与算法 标准模板库(STL)是...
1. **编程语言**:面试中,面试官可能会考察你对某一特定编程语言(如Java、Python、C++或JavaScript)的理解,包括语法、面向对象编程概念、异常处理、内存管理等方面的知识。你需要熟悉至少一两种主流编程语言,并...
C++作为一门强大的面向对象编程语言,是实现这些设计模式的理想选择。下面将对23种设计模式中的部分进行详细阐述。 (一)简单工厂模式:这种模式主要用于创建对象,它提供一个工厂类来负责创建特定类型的对象,...
面向对象编程(OOP)是Java设计的核心理念。掌握OOP的基本原则(封装、继承、多态)是写出高质量、可维护性强的代码的基础。 #### 八、规范 遵循良好的编码规范对于保持代码的一致性和可读性至关重要。例如,类名首...
8. **软件设计原则**:面向对象编程的三大特性(封装、继承、多态),以及设计模式(单例、工厂、观察者等)的理解和应用。 在准备这样的模拟试题时,考生应全面复习以上知识点,并通过做题来检查自己的理解和应用...
封装、继承和多态是OOP的三大原则,封装保证数据安全,继承实现代码复用,多态则提供灵活的设计可能性。 四、模板与泛型编程 C++的模板允许我们编写泛型代码,即不依赖特定数据类型的代码。这在编写算法和容器(如...
Java作为面向对象的编程语言,其特性包括平台独立性、安全性、高效性和可移植性。熟练掌握Java语法、类与对象、封装、继承和多态是Java程序员的基本功。此外,理解异常处理、集合框架(如ArrayList、LinkedList、...
数据库设计原则如第三范式(3NF)和正常化也是考察的重点。 2. **C语言**:C语言是一种基础且强大的编程语言,用于系统编程、嵌入式开发等。掌握C语言的基本语法、指针操作、内存管理、预处理器、文件操作等是必备...
《C++面向对象程序设计(李涛)》是一本深入探讨C++编程语言,特别是其面向对象特性的经典教程。C++是一种强大的、通用的编程语言,由Bjarne Stroustrup于1979年在C语言的基础上发展而来,旨在提供更高级别的抽象和...
2. **数据结构与算法**:这是任何程序员必备的知识,包括数组、链表、栈、队列、树、图等基本数据结构,以及排序算法(如冒泡、选择、插入、快速、归并)、查找算法(如二分查找、哈希查找)等。 3. **操作系统**:...
理解变量、控制流、函数、类等基本概念以及面向对象编程的原则至关重要。 其次,数据结构和算法是面试中的重头戏。这包括数组、链表、栈、队列、树、图、哈希表等数据结构的使用和特性,以及排序、搜索、动态规划等...
第十至十三讲,可能讲解了面向对象编程的核心概念,如类的定义、对象的创建、构造函数、方法以及封装的原则。第十四至十六讲可能进一步深入到继承和多态,这是Java中实现代码复用和模块化的重要机制。第十七讲可能...
此外,理解面向对象设计原则,如封装、继承、多态,以及设计模式也是C++面试中的常见话题。 数据库部分通常涉及SQL语言,包括数据查询、插入、更新和删除,以及复杂的联接操作。理解关系数据库模型、范式理论、索引...
四、面向对象设计原则 理解SOLID原则(单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则)是提升代码质量的关键。此外,还要学习模块化设计、组件化思想,以及如何实现可复用、可维护的代码。...
Steve McConnell在书中不仅介绍了当时已有的编程语言和技术,还预测并探讨了未来可能的发展趋势,如面向对象编程、设计模式等。这些内容对于当时的读者来说,无疑是一份宝贵的技术前瞻资料。 ### 三、通用概念与...