面向对象设计原则
1.SRP(单一职责原则) 就一个类而言,应该仅有一个引起它变化的原因。
好处:提高内聚 降低耦合
缺点:造成资源文件增多,管理不便
SRP说的其实是类设计时的职责划分和粒度问题。
在软件开发中使用SRP原则时,一个类承担一个职责,过多互不相关的职责集中在一个类中会导致高耦合性。
但要根据具体的情况设计,避免因过度追求单一职责而将类的结构设计的过度复杂,过犹不及。
策略模式,
2.OCP(开-闭原则) (对扩展开放,对修改关闭) 即在不修改原码的情况下对其进行扩展。
好处:提高灵活性、可重用性、可维护性
难点:OCP的关键是抽象(抽象父类或接口),创建正确的抽象花费时间和精力,也增加了软件设计的复杂性。
正确的做法是 只对程序中频繁变化的部分做出抽象,拒绝不成熟的抽象和抽象一样重要。
OCP是OO设计原则中高层次的原则,其余的原则对OCP提供了不同程度的支持
对OCP的追求也应该适可而止,不要陷入过渡设计。
策略,装饰器,模板
3.LSP(里氏替换原则) 任何基类可以出现的地方,子类一定可以出现。反之不成立。
LSP是使OCP成为可能的主要原则之一。
正是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展。
附A:
基于契约设计(DBC:Design By Contract)
使用DBC,类的编写者能够显式的规定针对该类的契约。客户代码的编写者可以通过该契约获悉可以依赖的行为方式。
契约是通过为每个方法声明的前置条件(preconditions)和后置条件(postconditions)来指定的。
要使一个方法得以执行,前置条件必须要为真。执行完毕后,该方法要保证后置条件为真。
附B:
use-a 依赖 A与B use-a关系 A中持有B的实例,B实例是在A之外创建,通过传参被A使用,可以调用B的方法或属性。
例如:我使用电脑。
has-a 组合 A与B has-a关系 A持有B的实例,A负责B的创建。
1.静态Has-A关系。这在UML中叫做组合(composition)
例如:我有一双手
2.动态Has-A关系。这在UML中叫做聚合(aggregation)
例如:Ant-Team拥有5名成员。
is-a 继承 A与B is-a 关系 B是A的父类
工厂模式,策略,模板,装饰器
4.DIP(依赖倒置原则)
A.高层模块不应该依赖于低层模块。它们都应该依赖于抽象。
B.抽象不应该依赖于细节,细节应当依赖于抽象
缺点:将导致大量的类文件。给维护带来不必要的麻烦。所以,正确的做法是只对程序中频繁变化的部分进行依赖倒置
附A:
启发式规则:
1.任何变量都不应该持有一个指向具体类的指针或者引用.
2.任何类都不应该从具体类派生(始于抽象,来自具体)
3.任何方法都不应该覆写它的任何基类中的已经实现了的方法.
这个原则对于那些虽然具体但是却稳定的类来说似乎并不是很合适, 如果一个类不太会改变,
而且也不太可能创建其他的派生类,那么依赖它似乎并没有太大的危害。比如java的String类。
DIP的关键其实在于找到系统中“变”与“不变”的部分,并利用接口将其隔离。
附B:
IoC就是Inversion of Control,控制反转。
在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
模板模式
5.ISP(接口隔离)
使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。
没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
观察者模式
6.LKP(最少知识原则) 又叫迪米特法则(Law of Demeter),LoD
一个对象应当对其他对象有尽可能少的了解,不和陌生人说话
这是一个关于如何松耦合(Loosely-Coupled)的法则
缺点:
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关
用迪米特法则到系统的设计中时,要注意以下几点:
* 在类的划分上,应当创建有弱耦合的类.类之间的耦合越弱,就越有利于复用.
* 在类的结构设计上,每一个类都应当尽量降低成员的访问权限.
* 在类的设计上,只要可能,一个类应当设计成不变类.
* 在对其他类的引用上,一个对象对其他对象的引用应降到最低.
* 尽量限制局部变量的有效范围.
例:门面模式
米特法则又叫作最少知识原则(Least Knowledge Principle或简写为LKP),就是说一个对象应当对其他对象有尽可能少的了解。
如何实现迪米特法则
迪米特法则的主要用意是控制信息的过载,在将其运用到系统设计中应注意以下几点:
1) 在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。
2) 在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。
3) 在类的设计上,只要有可能,一个类应当设计成不变类。
4) 在对其它对象的引用上,一个类对其它对象的引用应该降到最低。
分享到:
相关推荐
以下是对各个设计原则的详细说明: 1. **系统总体设计原则**: - **统一设计原则**:这强调了在设计时需全局考虑,包括应用系统结构、数据模型、存储和扩展规划,确保一致性。 - **先进性原则**:采用成熟且先进...
而对于其他模式和原则,应以类似的方式进行学习和应用,不断深入理解每个设计模式的特点和适用场景,以及设计原则的核心指导思想,最终能够在实际开发中灵活运用,编写出高质量、高内聚低耦合、易于扩展的代码。
发现了在触摸屏界面设计上存在的问题,深感触摸屏界面可用性的重要性以及在设计中人力物力投资的重复性,从而得出了为触摸屏界面提供一套通用的设计原则的必要性。 文章开篇第一章首先说明了一下研究背景...
数据库索引设计原则 数据库索引设计原则是 Oracle 数据库管理系统中的一项重要技术,旨在提高数据库的查询效率和性能。以下是数据库索引设计原则的详细解释。 一、基本原则 数据库索引设计原则的基本原则是确保...
在Android开发中,设计模式和设计原则是提升代码质量、可维护性和可扩展性的重要工具。以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single ...
这个PDF文档“24种设计模式介绍与6大设计原则”旨在帮助开发者理解和应用这些模式,提高代码的可维护性和可扩展性。以下是其中的主要内容: 一、设计原则 1. 单一职责原则:一个类或模块应只有一个引起其变化的原因...
面向对象设计原则是软件开发中不可或缺的指导方针,它们旨在提升软件的可维护性和复用性,从而提高开发效率和质量。C++作为一门支持面向对象编程的语言,遵循这些原则可以使代码更加健壮和易于扩展。以下是7个常用的...
理解并遵循EMI设计原则和电磁兼容设计原则对于提升电路板的抗干扰性能至关重要。 首先,我们要明白EMI是指由于电路中电流的变化产生的电磁场对周围环境产生的影响,这可能会影响其他电子设备的正常工作。为了减少...
面向对象设计原则是软件开发中至关重要的一环,它关乎到代码的可维护性、扩展性和复用性。本文将深入探讨这些原则,并结合实例来解释它们的重要性。 首先,我们需要理解面向对象不仅仅是编程语言中的概念,如封装、...
【HWS公有云架构设计原则】 华为公有云架构设计遵循一系列关键原则,旨在构建一个高效、灵活且可扩展的云服务环境。以下是这些原则的详细解释: 1. **开放API原则**:所有子系统,包括Portal/Console、BSS...
通过以上三个面向对象的设计原则,我们可以构建出更加健壮、灵活且易于维护的软件系统。这些原则不仅适用于特定的语言环境,而且对于所有的面向对象编程语言都有普遍的意义。理解和掌握这些原则,对于提升软件开发的...
高速PCB EMC设计的47个原则二、PCB设计原则归纳 原则1:PCB时钟频率超过5MHZ或信号上升时间小于5ns,一般需要使用多层板设计。 原因:采用多层板设计信号回路面积能够得到很好的控制。 原则2:对于多层板,关键...
在软件设计领域,设计原则是指导软件系统构建的基础法则和最佳实践,它们可以帮助开发者构建出更加灵活、可维护和可扩展的系统。在嵌入式系统开发中,这些原则同样适用,并且需要根据嵌入式环境的特殊性进行适当的...
### Web界面设计原则详解 #### 引言 Web界面设计是一项综合艺术与科学的技能,旨在创造既美观又实用的在线体验。良好的Web界面不仅能够吸引用户,还能引导他们高效地完成目标。本文将深入探讨Web界面设计的核心...
### Java设计原则详解 #### 一、基本原则与实践 **原则1:避免不必要的代码重复** 根据Arthur J. Riel的观点,在设计时应当避免代码的重复。例如在第13页提到,应尽量减少相似功能模块的重写,这有助于提高代码的...
24种设计模式介绍与6大设计原则24种设计模式介绍与6大设计原则
面向对象设计原则是软件工程领域中的重要组成部分,旨在提高软件系统的可维护性、可扩展性和灵活性。其中,类设计原则尤为关键,它们指导着开发者如何合理地构建类,以适应不断变化的需求。以下是对给定文件中提及的...
数据采集系统设计原则与基本方法 数据采集系统设计原则与基本方法是数据采集系统设计的基础,掌握这些原则和方法是设计高质量的数据采集系统的关键。本文将对数据采集系统设计的基本原则和方法进行详细的解释。 一...
设计原则和设计模式是OOD的核心概念,它们为开发者提供了指导思想和最佳实践,以创建可维护、可扩展和易于理解的代码。在Swift中,遵循这些原则和模式可以帮助我们编写出更加灵活和高效的软件。 面向对象设计的原则...