单一职责原则
面向对象的7条基本原则包括
面向对象的7条基本原则包括
1. 单一职责原则 (Single Responsibility Principle, SRP):一个类只负责单一的功能或任务。
2. 开放封闭原则 (Open-Closed Principle, OCP):软件实体应该对扩展开放,对修改关闭。
3. 里氏替换原则 (Liskov Substitution Principle, LSP):子类应该能够替换其父类,而不影响程序的正确性。
4. 接口隔离原则 (Interface Segregation Principle, ISP):不要强迫客户端依赖它们不需要使用的接口,将接口分割成更小更具体的部分。
5. 依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应该依赖于低层模块,而应该依赖于抽象接口。
6. 迪米特法则 (Law of Demeter, LoD):一个对象应该对其他对象尽可能少的了解,只与最直接的朋友通信。
7. 合成复用原则 (Composition/Aggregation Reuse Principle, CARP):优先使用组合/聚合而不是继承来实现代码重用。
软件设计7大原则
软件设计7大原则
在软件设计领域,有7个基本原则被认为是设计高质量、易于维护的软件的关键。
这些原则被称为SOLID原则,包括以下七个原则:
1. 单一职责原则(SRP):每个类或对象都应该专注于单一的职责,而不是尝试做太多的事情。
这样可以使代码更易于维护,因为更改其中一个职责不会影响其他职责。
2. 开放封闭原则(OCP):软件实体(类、模块等)应该是开放可扩展的,而不是修改已有的代码。
这意味着在修改系统行为时,应该通过添加新代码而不是修改现有代码来实现。
3. 里氏替换原则(LSP):子类应该能够替换它们的基类并保持行为不变。
这意味着子类应该与其基类遵循相同的契约,以确保子类可以无缝地替换基类。
4. 接口隔离原则(ISP):客户端不应该依赖于它们不需要的接口。
这可以通过将接口分解成更小的和更具体的接口来实现,以确保每个客户端只依赖于其需要的接口。
5. 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
这可以通过使用依赖注入、依赖反转和工厂模式等技术来实现。
6. 迪米特法则(LoD):一个对象应该与其他对象之间保持最少的交互。
这可以通过使用中介者模式等来实现。
7. 单元测试原则:每个类都应该有单元测试来确保其行为正确且符合预期。
这些原则可以帮助开发人员编写可扩展、易于维护和可重用的软件。
在实践中,应该尽可能遵循这些原则,但也应该根据特定的情况进行适当地调整。
面向对象五大原则
面向对象五大原则
面向对象的五大原则是:
1、单一职责原则(Single Responsibility Principle):一个类应
该只负责一项职责,不要乱加功能;
2、开放封闭原则(Open Closed Principle):软件实体(类、模块、函数等)应该可以扩展,但不可修改;
3、里氏替换原则(Liskov Substitution Principle):子类必须能
够替换掉基类,而且程序的行为不应该受到影响;
4、依赖倒置原则(Dependency Inversion Principle):高层模块
不应该依赖于低层模块,而是应该依赖于抽象;
5、接口隔离原则(Interface Segregation Principle):客户端不
应该依赖于它不需要的接口;接口本身应该尽可能小,将大的接口分解成
多个接口,这样每个接口的职责就更加明确。
软件设计模式六大原则
软件设计模式六⼤原则⽬录:设计模式六⼤原则(1):单⼀职责原则定义:不要存在多于⼀个导致类变更的原因。
通俗的说,即⼀个类只负责⼀项职责。
问题由来:类T负责两个不同的职责:职责P1,职责P2。
当由于职责P1需求发⽣改变⽽需要修改类T时,有可能会导致原本运⾏正常的职责P2功能发⽣故障。
解决⽅案:遵循单⼀职责原则。
分别建⽴两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。
这样,当修改类T1时,不会使职责P2发⽣故障风险;同理,当修改T2时,也不会使职责P1发⽣故障风险。
说到单⼀职责原则,很多⼈都会不屑⼀顾。
因为它太简单了。
稍有经验的程序员即使从来没有读过设计模式、从来没有听说过单⼀职责原则,在设计软件时也会⾃觉的遵守这⼀重要原则,因为这是常识。
在软件编程中,谁也不希望因为修改了⼀个功能导致其他的功能发⽣故障。
⽽避免出现这⼀问题的⽅法便是遵循单⼀职责原则。
虽然单⼀职责原则如此简单,并且被认为是常识,但是即便是经验丰富的程序员写出的程序,也会有违背这⼀原则的代码存在。
为什么会出现这种现象呢?因为有职责扩散。
所谓职责扩散,就是因为某种原因,职责P被分化为粒度更细的职责P1和P2。
⽐如:类T只负责⼀个职责P,这样设计是符合单⼀职责原则的。
后来由于某种原因,也许是需求变更了,也许是程序的设计者境界提⾼了,需要将职责P细分为粒度更细的职责P1,P2,这时如果要使程序遵循单⼀职责原则,需要将类T也分解为两个类T1和T2,分别负责P1、P2两个职责。
但是在程序已经写好的情况下,这样做简直太费时间了。
所以,简单的修改类T,⽤它来负责两个职责是⼀个⽐较不错的选择,虽然这样做有悖于单⼀职责原则。
(这样做的风险在于职责扩散的不确定性,因为我们不会想到这个职责P,在未来可能会扩散为P1,P2,P3,P4……Pn。
所以记住,在职责扩散到我们⽆法控制的程度之前,⽴刻对代码进⾏重构。
)举例说明,⽤⼀个类描述动物呼吸这个场景:class Animal{public void breathe(String animal){System.out.println(animal+"呼吸空⽓");}}public class Client{public static void main(String[] args){Animal animal = new Animal();animal.breathe("⽜");animal.breathe("⽺");animal.breathe("猪");}}运⾏结果:⽜呼吸空⽓⽺呼吸空⽓猪呼吸空⽓程序上线后,发现问题了,并不是所有的动物都呼吸空⽓的,⽐如鱼就是呼吸⽔的。
跟我学面向对象设计中的五大原则——“单一职责”原则
不管它是不是用到了数据连接功能。 (4)改进的设计方案
我们应该把这两部分适当的分离开来,重新对上面的接口进行设计:
class SomeDBConnectionBean
杨教授大学堂,版权所有,盗版必究。
2/10 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
{ public void ConnectDB() { } public void DisConnectDB() { } //other DB Functions;
杨教授大学堂,版权所有,盗版必究。 3/10 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
们写到同一个类体中,否则代码将会很混乱。 同时,在业务处理层的设计中,我们将各个业务模块中的共同功能要求抽出放到业务
基类中,这样使的各个子类完成其特有的功能。从而分清基类的职责(完成共同的功能实 现)和各个子类的职责(完成各个具体的业务功能实现)。 (2)应用示例代码----没有遵守单一职责原则时的代码 import java.sql.*; import java.io.*; public class JavaJdbc {
this.dbConnection = dbConnection; } }
1.1.2 遵守单一职责原则的应用示例
1、单一职责原则应用示例之一 (1)问题的技术背景
在数据访问层组件的设计中,我们将其拆分为数据实体类、数据访问逻辑组件和数据 连接组件的目的,就是为了能够遵守组件类在设计时的“单一职责愿则”。从而避免将它
try { Class.forName(DBDriver); } catch(ClassNotFoundException e) { System.out.println(e); } try {
类设计的基本原理
类设计的基本原理包括:
1.单一职责原则:一个类只做好一件事情。
单一职责原则可以降低
类的复杂度,提高类的可读性,提高系统的可维护性。
2.开闭原则:一个软件实体应该对扩展开放,对修改封闭。
即软件
实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。
3.里氏替换原则:在软件中,如果S是T的子类型,程序中使用T
类型的对象,可以替换为S类型的对象,而不会产生任何错误或异常。
4.依赖倒置原则:高层模块不应该依赖于低层模块,两者都应该依
赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
5.接口隔离原则:客户端不应该被强制依赖于它不使用的接口,软
件中的每个接口都应该是单一职责的。
设计模式六大原则
设计模式六大原则设计原则是基本的工具,应用这些规则可以使你的代码更加灵活、更容易维护,更容易扩展。
今天店铺分享了设计模式六大原则,一起来了解吧。
设计模式六大原则设计模式原则1:单一职责原则定义:不要存在多于一个导致类变更的原因。
通俗的说,即一个类只负责一项职责。
问题由来:类T负责两个不同的职责:职责P1,职责P2。
当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。
解决方案:遵循单一职责原则。
分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。
这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。
说到单一职责原则,很多人都会不屑一顾。
因为它太简单了。
稍有经验的程序员即使从来没有读过设计模式、从来没有听说过单一职责原则,在设计软件时也会自觉的遵守这一重要原则,因为这是常识。
在软件编程中,谁也不希望因为修改了一个功能导致其他的功能发生故障。
而避免出现这一问题的方法便是遵循单一职责原则。
虽然单一职责原则如此简单,并且被认为是常识,但是即便是经验丰富的程序员写出的程序,也会有违背这一原则的代码存在。
为什么会出现这种现象呢?因为有职责扩散。
所谓职责扩散,就是因为某种原因,职责P 被分化为粒度更细的职责P1和P2。
比如:类T只负责一个职责P,这样设计是符合单一职责原则的。
后来由于某种原因,也许是需求变更了,也许是程序的设计者境界提高了,需要将职责P细分为粒度更细的职责P1,P2,这时如果要使程序遵循单一职责原则,需要将类T也分解为两个类T1和T2,分别负责P1、P2两个职责。
但是在程序已经写好的情况下,这样做简直太费时间了。
所以,简单的修改类T,用它来负责两个职责是一个比较不错的选择,虽然这样做有悖于单一职责原则。
(这样做的风险在于职责扩散的不确定性,因为我们不会想到这个职责P,在未来可能会扩散为P1,P2,P3,P4……Pn。
代码六大原则
代码六大原则在软件开发过程中,编写高质量的代码是非常重要的。
良好的代码可以提高代码的可读性、可维护性和可扩展性,减少代码错误和调试时间。
为了编写高质量的代码,我们可以遵循一些代码编写的原则。
本文将介绍六大原则,帮助我们编写更好的代码。
一、单一职责原则(Single Responsibility Principle,SRP)单一职责原则要求一个类只负责一项职责。
这意味着一个类应该只有一个引起它变化的原因。
这样可以让类的设计更加清晰、简单,并且易于维护和扩展。
如果一个类承担了过多的职责,那么它将变得臃肿而难以理解和修改。
二、开放封闭原则(Open-Closed Principle,OCP)开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
这意味着当需求变化时,我们应该通过扩展已有的代码来实现新的功能,而不是直接修改已有的代码。
这样可以保证已有的功能不受影响,并且减少引入新错误的可能性。
三、里氏替换原则(Liskov Substitution Principle,LSP)里氏替换原则要求子类型必须能够替换掉它们的父类型。
简单来说,子类应该能够在不破坏程序正确性的前提下替换掉父类。
这样可以保证在使用父类的代码的地方,也可以使用子类,而不会引起错误。
符合里氏替换原则的代码设计可以提高代码的复用性和扩展性。
四、依赖倒置原则(Dependency Inversion Principle,DIP)依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
这样可以降低模块之间的耦合度,提高系统的灵活性和可维护性。
通过依赖注入等技术,可以实现依赖倒置原则。
五、接口隔离原则(Interface Segregation Principle,ISP)接口隔离原则要求一个类对其依赖的接口进行细粒度的拆分,而不应该依赖于不需要的接口。
一个类应该只依赖于它需要的接口,而不应该强迫它依赖于不需要的接口。
使用单一职责原则解决实际问题
使用单一职责原则解决实际问题
单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。
这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。
该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:
一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
如果遵循单一职责原则将有以下优点。
降低类的复杂度。
一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
提高类的可读性。
复杂性降低,自然其可读性会提高。
提高系统的可维护性。
可读性提高,那自然更容易维护了。
变更引起的风险降低。
变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
单一职责原则是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模块中。
而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。
下面以大学学生工作管理程序为例介
绍单一职责原则的应用。
软件架构设计原则
软件架构设计原则1. 单一职责原则 (Single Responsibility Principle)一个模块、类或函数应该只负责一项任务。
这个原则强调了高内聚性和低耦合性的重要性。
一个具有单一职责的组件更容易理解、维护和重用。
2. 开闭原则 (Open-Closed Principle)软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这意味着应该通过新增代码来扩展功能,而不是修改已有的代码。
这个原则可以提高软件的稳定性和可扩展性。
3. Liskov替换原则 (Liskov Substitution Principle)子类应该能够替换其父类并呈现相同的行为。
这个原则保证了抽象类型的一致性,子类不应该改变父类的行为,而应该只扩展或实现额外的功能。
4. 接口隔离原则 (Interface Segregation Principle)客户端不应该依赖于它不需要使用的接口。
接口应该根据使用者的需要进行划分,避免接口的臃肿和冗余,提高代码的可重用性和可维护性。
5. 依赖倒置原则 (Dependency Inversion Principle)高层模块不应该依赖于低层模块的具体实现细节,而应该依赖于抽象接口。
这个原则可以减少模块之间的耦合度,提高代码的可测试性和可扩展性。
应优先使用组合或聚合的方式来复用代码,而非继承。
继承是一种强耦合的关系,组合或聚合则提供了更灵活和可维护的复用方式。
7. 最小知识原则 (Law of Demeter)一个对象应该尽可能减少与其他对象交互的数量,只与直接的朋友通信。
这个原则促进了模块之间的松耦合,提高代码的可维护性和可测试性。
以上是一些常见的软件架构设计原则,开发人员可以根据具体情况选择合适的原则应用于软件设计中。
这些原则将有助于构建可靠、可扩展和易于维护的软件系统。
*注意:以上内容仅为一般性原则,并不能覆盖所有软件设计情况。
具体实施过程还需结合具体项目和实际需求进行评估和决策。
单一职责原则
3.
if("鱼".equals(animal)){
4.
System.out.println(animal+"呼吸水");
5.
}else{
6.
System.out.println(animal+"呼吸空气");
7.
}8. }ຫໍສະໝຸດ 9. }2/410.
11. public class Client{
12. public static void main(String[] args){
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多; 提高类的可读性,提高系统的可维护性; 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能
的影响。 需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。 本文作者:zhengzhb
4/4
16.
animal.breathe("猪");
17.
animal.breathe2("鱼");
18. }
19. }
可以看到,这种修改方式没有改动原来的方法,而是在类中新加了一个方法,这样虽然也违背了单一职责原则,但在方 法级别上却是符合单一职责原则的,因为它并没有动原来方法的代码。这三种方式各有优缺点,那么在实际编程中,采用哪 一中呢?其实这真的比较难说,需要根据实际情况来确定。我的原则是:只有逻辑足够简单,才可以在代码级别上违反单一
13.
Animal animal = new Animal();
14.
单一职责原则
单⼀职责原则
单⼀职责原则的优点
单⼀职责原则的核⼼就是控制类的粒度⼤⼩、将对象解耦、提⾼其内聚性。
如果遵循单⼀职责原则将有以下优点。
降低类的复杂度。
⼀个类只负责⼀项职责,其逻辑肯定要⽐负责多项职责简单得多。
提⾼类的可读性。
复杂性降低,⾃然其可读性会提⾼。
提⾼系统的可维护性。
可读性提⾼,那⾃然更容易维护了。
变更引起的风险降低。
变更是必然的,如果单⼀职责原则遵守得好,当修改⼀个功能时,可以显著降低对其他功能的影响。
单⼀职责原则的实现⽅法
单⼀职责原则是最简单但⼜最难运⽤的原则,需要设计⼈员发现类的不同职责并将其分离,再封装到不同的类或模块中。
⽽发现类的多重职责需要设计⼈员具有较强的分析设计能⼒和相关重构经验。
下⾯以⼤学学⽣⼯作管理程序为例介绍单⼀职责原则的应⽤。
【例1】⼤学学⽣⼯作管理程序。
分析:⼤学学⽣⼯作主要包括学⽣⽣活辅导和学⽣学业指导两个⽅⾯的⼯作,其中⽣活辅导主要包括班委建设、出勤统计、⼼理辅导、费⽤催缴、班级管理等⼯作,学业指导主要包括专业引导、学习辅导、科研指导、学习总结等⼯作。
如果将这些⼯作交给⼀位⽼师负责显然不合理,正确的做法是⽣活辅导由辅导员负责,学业指导由学业导师负责,其类图如图 1 所⽰。
单一职责原则(SRP)
单⼀职责原则(SRP)单⼀职责原则(Single Pesponsibility Principle, SRP)单⼀职责有两个含义:⼀个是避免相同的职责分散到不同的类中,别⼀个是避免⼀个类承担太多职责为什么要遵守SRP呢?(1)可以减少类之间的耦合如果减少类之间的耦合,当需求变化时,只修改⼀个类,从⽽也就隔离了变化;如果⼀个类有多个不同职责,它们耦合在⼀起,当⼀个职责发⽣变化时,可能会影响到其他职责。
(2)提⾼类的复⽤性修改电脑⽐修理电视机简单多了。
主要原因就在于电视机各个部件之间的耦合性太⾼,⽽电脑则不同,电脑的内存、硬盘、声卡、⽹卡、键盘灯等部件都可以很容易地单独拆卸和组装。
某个部件坏了,换上新的即可。
上⾯的例⼦就体现了单⼀职责的优势。
由于使⽤了单⼀职责,使得‘组件’可以⽅便地‘拆卸’和‘组装’。
不遵守SRP会影响对类的复⽤性。
当只需要⽤该类的某⼀个职责时,由于它和其他的职责耦合在⼀起,也就很难分离出。
遵守SRP在实际代码开发中有没有什么应⽤?有的。
以数据持久层为例,所谓的数据持久层主要指的是数据库操作,当然,还包括缓存管理等。
这时就需要数据持久层⽀持多种数据库。
应该怎么做?定义多个数据库操作类?想法已经很接近了,再进⼀步,就是使⽤⼯⼚模式。
⼯⼚模式(Faction)允许你在代码执⾏时实例化对象。
它之所以被称为⼯⼚模式是因为它负责‘⽣产对象’。
以数据库为例,⼯⼚需要的就是根据不同的参数,⽣成不同的实例化对象。
最简单的⼯⼚就是根据传⼊的类型名实例化对象,如传⼊MySQL,就调⽤MySQL类并实例化,如果是SQLite,则调⽤ SQLite的类并实例化,甚⾄还可以处理TXT、Execl等‘类数据库’。
⼯⼚类也就是这样的⼀个类,它只负责⽣产对象,⽽不负责对象的具体内容。
以下是⽰例定义⼀个适配器的接⼝interface Db_Adpater{/*** 数据库连接* @param $config 数据库配置* @return mixed resource*/public function connect($config);/*** 执⾏数据库查询* @param $query 数据库查询的SQL字符串* @param $handle 连接对象* @return mixed*/public function query($query,$handle);}定义⼀个实现了DB_Adpater接⼝的MySQL数据库操作类class Db_Adapter_Mysql implements Db_Adpater{private $_dbLink; //数据库连接字符串标识/*** 数据库连接函数* @param $config 数据库配置* @return resource* @throws Db_Exception*/public function connect($config){if($this->_dbLink = @mysql_connect($config->host . (empty($config->port) ? '' : ':' . $config->prot) ,$config->user, $config->password, true)){if(@mysql_select_db($config->database, $this->_dbLink)){if($config->charset){mysql_query("SET NAME '{$config->charset}'", $this->_dbLink);}return $this->_dbLink;}}throw new Db_Exception(@mysql_error($this->_dbLink));}/*** 执⾏数据库查询* @param $query 数据库查询SQL字符串* @param $handle 连接对象* @return resource*/public function query($query,$handle){if($resource = @mysql_query($query,$handle))return $resource;}}定义⼀个实现了DB_Adpater接⼝的SQLite数据库操作类class Db_Adapter_sqlite implements Db_Adpater{private $_dbLink; //数据库连接字符串标识public function connect($config){if($this->_dbLink = sqlite_open($config->file, 0666, $error)){return $this->_dbLink;}throw new Db_Exception($error);}public function query($query, $handle){if($resource = @sqlite_query($query,$handle)){return $resource;}}}现在如果需要⼀个数据库操作的⽅法怎么做,只需定义⼀个⼯⼚类,根据传⼊不同的⽣成需要的类即可class sqlFactory{public static function factory($type){if(include_once 'Drivers/' . $type . '.php'){$classname = 'Db_Adapter_'.$type;return new $classname;}elsethrow new Exception('Driver not found');}}调⽤时,就可以这么写$db = sqlFactory::factory('MySQL');$db = sqlFactory::factory('SQLite');我们把创建数据库连接这块程序单独拿出来,程序中的CURD就不⽤关⼼什么数据库了,只要按照规范使⽤对应的⽅法即可。
名词解释 单一职责原则
名词解释单一职责原则单一职责原则是面向对象编程的一个基本原则,它要求一个类或方法只负责一项职责,即一个类或方法只应该有一个引起它变化的原因。
本文将对单一职责原则进行详细解释。
1. 什么是单一职责原则?单一职责原则即SRP(Single Responsibility Principle),是指一个类或方法应该只有一个责任和任务。
这个原则强调了代码应该结构清晰、可维护、可扩展,并且易于理解。
一个类或方法只关注于一个任务,可以降低代码的耦合度,使其更加可靠和可扩展。
2. 为什么要遵守单一职责原则?遵守单一职责原则可以使代码更加清晰、简单、易于维护和修改。
当一个类或方法承担了多个职责时,代码会变得复杂混乱,不可预测,修改起来也会非常困难。
而当代码遵守单一职责原则时,每个类或方法都只关注与一个任务,容易理解,更加可靠,也更容易被复用和扩展。
3. 如何遵守单一职责原则?遵守单一职责原则的关键是要识别和区分不同的职责。
在设计和实现类或方法时,需要考虑一个类或方法的作用和职责,确保它只有一个引起它变化的原因。
例如,一个类或方法应该只关注于一个方面的业务逻辑,而不是处理多个业务逻辑。
如果一个类或方法需要处理多个职责,可以考虑将其分解为多个小的类或方法,每个类或方法都只关注于一个职责。
4. 单一职责原则的优点遵守单一职责原则可以带来许多优点,包括:(1)提高代码的可读性和可维护性,因为代码结构清晰明了,易于理解。
(2)降低代码的耦合性,因为每个类或方法只负责一个职责,不会与其他类或方法产生过多的关联和依赖。
(3)提高代码的灵活性和可扩展性,因为每个类或方法都只负责一项职责,更容易被重构和扩展。
5. 总结单一职责原则是面向对象编程的基本原则之一,它要求一个类或方法只负责一个职责,从而使代码更加清晰、简单、易于维护和扩展。
在实践中,我们应该识别和区分不同的职责,确保每个类或方法只有一个引起它变化的原因。
遵守单一职责原则可以提高代码的可读性、可维护性、灵活性和可扩展性。
srp单一职责原则
srp单一职责原则SRP单一职责原则是面向对象编程中的一个重要原则,它指出一个类或模块应该只有一个职责,即只负责一项功能。
这个原则的核心思想是将一个复杂的系统分解成多个简单的部分,每个部分只负责一项职责,这样可以提高系统的可维护性、可扩展性和可重用性。
SRP单一职责原则的实现需要遵循以下几个原则:1. 每个类或模块只负责一项职责,不要将多个职责混合在一起。
2. 如果一个类或模块需要实现多个职责,应该将其拆分成多个类或模块,每个类或模块只负责一项职责。
3. 每个类或模块的职责应该尽可能的独立,不要依赖其他类或模块的实现细节。
4. 如果一个类或模块需要依赖其他类或模块的实现细节,应该通过接口或抽象类来实现依赖关系,而不是直接依赖具体的实现类。
SRP单一职责原则的好处是显而易见的。
首先,它可以提高系统的可维护性。
因为每个类或模块只负责一项职责,所以当需要修改某个功能时,只需要修改对应的类或模块,而不会影响到其他功能的实现。
这样可以减少代码的耦合度,提高代码的可读性和可维护性。
SRP单一职责原则可以提高系统的可扩展性。
因为每个类或模块只负责一项职责,所以当需要添加新的功能时,只需要添加对应的类或模块,而不会影响到其他功能的实现。
这样可以减少代码的复杂度,提高代码的可扩展性和可重用性。
SRP单一职责原则可以提高系统的可测试性。
因为每个类或模块只负责一项职责,所以可以更容易地编写单元测试,测试每个功能的正确性和可靠性。
这样可以提高代码的质量和稳定性,减少系统的错误和故障。
SRP单一职责原则是面向对象编程中的一个重要原则,它可以提高系统的可维护性、可扩展性和可测试性,是编写高质量代码的重要保证。
单一职责原则
下面通过一个简单实例来进一步分析单一职责原则:
Sunny软件公司开发人员针对某CRM(Customer Relationship Management,客户关系管理)系统中客户信息图形统计模块提出了如图1所示初始设计方案:
图1 初始设计方案结构图
在图1中,CustomerDataChart类中的方法说明如下:getConnection()方法用于连接数据库,findCustomers()用于查询所有的客户信息,createChart()用于创建图表,displayChart()用于显示图表。
现使用单一职责原则对其进行重构。
(2) CustomerDAO:负责操作数据库中的Customer表,包含对Customer表的增删改查等方法,如findCustomers();
(3) CustomerDataChart:负责图表的生成和显示,包含方法createChart()和displayChart()。
使用单一职责原则重构后的结构如图2所示:
图2 重构后的结构图。
soild原则
soild原则
答:soild原则是:
SOLID原则是面向对象设计的五大基本原则,具体如下:
•单一职责原则:一个类或者一个方法只做一件事。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化就可能抑制或者削弱这个类完成其他职责的能力。
•开闭原则:对扩展开放,对修改关闭。
意为一个类独立之后就不应该去修改它,而是以扩展的方式适应新需求。
•里氏替换原则:所有基类出现的地方都可以用派生类替换而不会程序产生错误。
•接口隔离原则:类不应该依赖不需要的接口,知道越少越好。
•依赖倒置原则:是过程式设计与面向对象设计的分水岭,同时它也被用来指导接口隔离原则。
se基本原则
se基本原则:
SE基本原则是指面向对象编程中的五个基本原则,包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。
1.单一职责原则:一个类应该只有一个职责,即只做一件事情。
这样可以提高类的内
聚性,减少类的耦合度,降低类的复杂性。
2.开放封闭原则:一个软件实体应该对扩展开放,对修改封闭。
这意味着软件的设计
应当是可扩展的,不需要经常修改,而封闭性则是指软件主体不应被随意修改。
3.里氏替换原则:任何使用基类的地方都可以使用其子类,而不需要修改代码。
这要
求子类必须能够完全替代基类,并且不会带来额外的效果。
4.依赖倒置原则:高层模块不应该依赖于低层模块,它们都应该依赖于抽象。
具体实
现应当依赖于抽象,而不是抽象依赖于具体实现。
这样可以降低类之间的耦合度,提高代码的可维护性和可复用性。
5.接口隔离原则:客户端不应该依赖于它不使用的接口,一个类对另一个类的依赖性
应当是最小的。
这可以提高类的内聚性,减少依赖和耦合度。
六大设计原则
六⼤设计原则六⼤设计原则1. 单⼀职责原则:对于⼀个类,应该只有⼀个引起它变化的原因;【功能内聚】2. ⾥⽒代换原则:⼦类必须能够替换掉它们的⽗类型;【减⼩继承耦合】3. 开放-封闭原则:对于扩展是开放的;对于修改是封闭的。
4. 依赖倒置原则:程序的⾼层模块不应该依赖于底层模块,两者应依赖于抽象;抽象不应该依赖于具体斜街,⽽细节应该依赖于抽象。
【⾯向接⼝编程,⽽不是针对实现编程】【耦合具有⽅向性差异,稳定与变化之间的耦合,接⼝稳定⽽具体易变化】5. 合成/聚合复⽤原则:尽量不使⽤类继承,⽽尽量使⽤合成/聚合【避免类爆炸】6. 迪⽶特法则:如果两个类之间不必直接通信,则这个类不应该发⽣直接相互作⽤。
如果其中⼀个类需要调⽤另⼀个类的某个⽅法,可以通过第三⽅转发这个调⽤。
【体现在顺序图中,跨“朋友/友元”调⽤“陌⽣”对象,进⾏改进】⼀、单⼀职责原则举例:超⼈只维护世界原因:易于维护和⾼度的可复⽤性是⾯向对象开发的⽐较突出的两个优点。
若职责过于庞⼤,则维护困难,可复⽤性也随之降低,与⾯向对象的思想背道⽽驰。
好处:降低类的复杂度,⼀个类只负责⼀项职责,其逻辑肯定⽐负责多项职责简单;提⾼类的可读性,提⾼系统的可维护性。
⼆、⾥⽒代换原则举例:超⼈只维护世界符合:鲨鱼是鱼,⽼⽊匠徒弟替⽼⽊匠打家具;违反:正⽅形是长⽅形【如何修改,构造⼀个抽象的四边形类】作⽤:使得使⽤⽗类类型的模块在⽆需修改的情况下,就可以通过使⽤不同的⼦类拓展。
⾥⽒代换规则是对实现抽象化的具体步骤的规范。
【⾥⽒代换原则是对开闭原则的进⼀步规范】三、开放-封闭原则(OCP)----⾯向对象设计的主要⽬标原因:封装变化、降低耦合效果:开闭原则提供了⼀个使系统在⾯对需求变更时,可以保持系统相对稳定的解决⽅案。
举例:符合:动物-猫-咪咪(继承/多态复⽤,并拓展)对⽐:1. 银⾏业务员(存款、取款、转账、进⾏基⾦申购)2. 银⾏业务员接⼝,存款业务员、取款业务员、负责转账业务员、基⾦业务员//其实这⾥的改写也体现了单⼀职责原则,依赖于抽象的银⾏业务员接⼝利于扩展核⼼思想:只依赖于抽象,⾯向抽象编程,⽽不是⾯向具体编程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 问题由来:
之所以会出现单一职责原则就是因为在 软件设计时会出现以下类似场景: T负责两个不同的职责:职责P1,职责 P2。当由于职责P1需求发生改变而需要修改 类T时,有可能会导致原本运行正常的职责P2 功能发生故障。也就是说职责P1和P2被耦合 在了一起。
• 产生原因:
没有任何的程序设计人员不清楚应该写 出高内聚低耦合的程序,但是很多耦合常常 发生在不经意之间,其原因就是: 职责扩散:因为某种原因,某一职责 被分化为颗粒度更细的多个职责了。
• 解决办法: 遵守单一职责原则,将不同的职 责封装到不同的类或模块中。
下面以一个用户管理为例演示单一职责原则。在业务逻辑层 上定义类UserManager,在数据访问层定义类UserDao,在体 对象层定义类User,每个类具有不同的职责和功能。
• • • • • • • • • • • • • • • • • • • • • • • • • • private String username; private String userpass; private int role; //………….各个属性的get、set方法 } public class UserDao extends BaseDao { //返回所有用户 public List<User> getAllUser() { List<User> userList = new ArrayList<User>(); ......//访问数据库 return userList; } //根据用户名查找用户 public User getUserByName(String name) { User user=null; String sql="SELECT * FROM userdetail WHERE username=?"; ...//查找相应用户名的用户 return user; } //添加新用户 public boolean addUser(User user) { //返回true 表示成P)
• 单一职责,强调的是职责的分离,在某种 程度上对职责的理解,构成了不同类之间 耦合关系的设计关键,因此单一职责原则 或多或少成为设计过程中一个必须考虑的 基础性原则。
• 关于单一职责原则,其核心的思想是:
一个类,最好只做一件事,只有一个引起它变 化的原因。
• 原理:
如果一个类承担的职责过多,就等于把 这些职责耦合在一起了。一个职责的变化可 能会削弱或者抑制这个类完成其他职责的能 力。这种耦合会导致脆弱的设计,当发生变 化时,设计会遭受到意想不到的破坏。而如 果想要避免这种现象的发生,就要尽可能的 遵守单一职责原则。此原则的核心就是解耦 和增强内聚性。
• • • • • • • • • • • • • • • • • • • • • • •
public class UserManager { private UserDao userDao = new UserDao(); //验证用户名和密码 public boolean CheckUser(String name,String pass) { boolean flag=false; User user =userDao.getUserByName(name); if(user!=null&&user.getUsername().equals(pass)) { flag=true; } return flag; } //注册新用户 public void registUser(User user) { if(userDao.getUserByName(user.getUsername()) !=null) { System.out.println("用户名已存在"); return; } if(UserDao.addUser(user)) { //注册成功 }else { //注册失败 } }