【愚公系列】2023年10月 面向对象设计原则(一)-单一职责原则(Single Responsibility Princip)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:
提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。
提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。
提高软件系统的重用性:接口隔离原则可以将接口分解为更小、更专注的部分,提高代码的可读性和可复用性,从而提高软件系统的重用性。
提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见的设计错误,从而提高软件系统的质量和可靠性。
遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用的软件系统。
🚀一、单一职责原则(Single Responsibility Principle or SRP)
单一职责原则(Single Responsibility Principle,SRP)是指一个类或模块应该只有一个功能,且这个功能应该由这个类或模块完全封装起来。也就是说,一个类或模块只应该负责一项职责或功能。其作用是帮助程序员将系统分解为更小、更专注的部分,提高代码的可读性、可维护性和可扩展性,降低不同模块之间的耦合性,并且使得这些部分更加灵活和易于重用。
例如,一个负责存储用户数据的类应该只有存储用户数据的功能,而不应该包含其他的操作,如计算用户积分、发送邮件等,否则这个类就违反了单一职责原则,导致代码耦合度过高、可维护性和可扩展性降低。
遵循单一职责原则的好处有:
提高代码的可读性和可维护性:单一职责原则可以将复杂的系统分解为更小、更专注的部分,从而降低代码的复杂度,增强代码的可读性和可维护性。
提高模块的可重用性:单一职责原则使得模块的功能更加明确,更加专注,因此更容易被其他模块重用。
提高系统的可扩展性:单一职责原则使得系统更易于扩展,因为每个模块都是专注于一项职责,更加灵活,可以更方便地进行扩展和修改。
=单一职责原则是面向对象设计中非常重要的一项原则,能够帮助程序员设计出更好的代码,从而提高软件的质量和可维护性。
🚀二、使用步骤
🔎1.示例
public class Rectangle : Shape {
public int Height;
public int Width;
public int Area() {
return Width * Height;
}
public void Draw() {
Console.WriteLine("Draw Rectangle!");
}
}
Rectangle类为矩形类,继承自其抽象基类Shape,矩形类包含2个公开的属性和方法,Area方法计算矩形的面积,Draw方法绘制矩形,“计算”和“绘图”两种不同类型的操作耦合在同一个类中,不符合单一职责原则,以下是一个调用方可能的代码。
public class CalculatorShapeArea {
public void CalculateArea(Rectangle rectangle) {
var area = rectangle.Area();
}
}
public class DrawRectangle {
public void Draw(Rectangle rectangle) {
rectangle.Draw();
}
}
public enum DrawType {
None,
shadow
}
我们注意到调用方都是通过Rectangle的实例去调用矩形的Area和Draw方法,耦合程度高。当我们有一天准备更改Draw方法时(例如为Draw增加一个名为DrawType的enum参数,以决定是否在绘图时使用阴影效果),Rectangle类发生了变化,因为这个类存在2个引起它变化的因素,即“计算”和“绘图”。在实际开发过程中,Rectangle类可能是一个比较复杂的类,更改了Draw方法需要进行完整的回归测试,以确定更改是否影响到整个Rectangle类的正确性,所以这种更改带来的后果是严重的,其代价是昂贵的。以下给出一个解决方案以供参考:
public class Rectangle : Shape {
public int Height { get; set; }
public int Width { get; set; }
public int Area() {
return Width * Height;
}
}
public class RectangleDraw {
public void Draw(Rectangle rectangle) {
Console.WriteLine("Draw Rectangle!");
}
}
var rectangle = new Rectangle();
var area = rectangle.Area();
var rectangleDraw = new RectangleDraw();
rectangleDraw.Draw(rectangle);
将Draw方法重新通过RectangleDraw类封装,使“计算”和“绘图”分离。当我们需要为Draw方法增加参数时,我们只要更改RectangleDraw类的Draw方法即可,不会影响到Rectangle类,即只需要为RectangleDraw类做回归测试即可,降低原Rectangle类中方法的耦合程度,符合单一职责原则的要求。
🚀总结
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。
- 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
- 提高类的可读性。复杂性降低,自然其可读性会提高。
- 提高系统的可维护性。可读性提高,那自然更容易维护了。
- 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)