【愚公系列】2023年10月 面向对象设计原则(一)-单一职责原则(Single Responsibility Princip)

举报
愚公搬代码 发表于 2021/12/02 15:31:17 2021/12/02
【摘要】 面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:

  1. 提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。

  2. 提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。

  3. 提高软件系统的重用性:接口隔离原则可以将接口分解为更小、更专注的部分,提高代码的可读性和可复用性,从而提高软件系统的重用性。

  4. 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见的设计错误,从而提高软件系统的质量和可靠性。

遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用的软件系统。

🚀一、单一职责原则(Single Responsibility Principle or SRP)

单一职责原则(Single Responsibility Principle,SRP)是指一个类或模块应该只有一个功能,且这个功能应该由这个类或模块完全封装起来。也就是说,一个类或模块只应该负责一项职责或功能。其作用是帮助程序员将系统分解为更小、更专注的部分,提高代码的可读性、可维护性和可扩展性,降低不同模块之间的耦合性,并且使得这些部分更加灵活和易于重用。

例如,一个负责存储用户数据的类应该只有存储用户数据的功能,而不应该包含其他的操作,如计算用户积分、发送邮件等,否则这个类就违反了单一职责原则,导致代码耦合度过高、可维护性和可扩展性降低。

遵循单一职责原则的好处有:

  1. 提高代码的可读性和可维护性:单一职责原则可以将复杂的系统分解为更小、更专注的部分,从而降低代码的复杂度,增强代码的可读性和可维护性。

  2. 提高模块的可重用性:单一职责原则使得模块的功能更加明确,更加专注,因此更容易被其他模块重用。

  3. 提高系统的可扩展性:单一职责原则使得系统更易于扩展,因为每个模块都是专注于一项职责,更加灵活,可以更方便地进行扩展和修改。

=单一职责原则是面向对象设计中非常重要的一项原则,能够帮助程序员设计出更好的代码,从而提高软件的质量和可维护性。

🚀二、使用步骤

🔎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. 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
  2. 提高类的可读性。复杂性降低,自然其可读性会提高。
  3. 提高系统的可维护性。可读性提高,那自然更容易维护了。
  4. 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。