前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年11月 面向对象设计原则(一)-单一职责原则(Single Responsibility Principle or SRP)

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

原创
作者头像
愚公搬代码
发布2023-11-23 19:15:25
3430
发布2023-11-23 19:15:25
举报
文章被收录于专栏:历史专栏

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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.示例

代码语言:c#
复制
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方法绘制矩形,“计算”和“绘图”两种不同类型的操作耦合在同一个类中,不符合单一职责原则,以下是一个调用方可能的代码。

代码语言:c#
复制
public class CalculatorShapeArea {

    public void CalculateArea(Rectangle rectangle) {
        var area = rectangle.Area();
    }

}
代码语言:c#
复制
public class DrawRectangle {

    public void Draw(Rectangle rectangle) {
        rectangle.Draw();
    }

}
代码语言:c#
复制
public enum DrawType {
    None,
    shadow
}

我们注意到调用方都是通过Rectangle的实例去调用矩形的Area和Draw方法,耦合程度高。当我们有一天准备更改Draw方法时(例如为Draw增加一个名为DrawType的enum参数,以决定是否在绘图时使用阴影效果),Rectangle类发生了变化,因为这个类存在2个引起它变化的因素,即“计算”和“绘图”。在实际开发过程中,Rectangle类可能是一个比较复杂的类,更改了Draw方法需要进行完整的回归测试,以确定更改是否影响到整个Rectangle类的正确性,所以这种更改带来的后果是严重的,其代价是昂贵的。以下给出一个解决方案以供参考:

代码语言:c#
复制
public class Rectangle : Shape {

    public int Height { get; set; }
    public int Width { get; set; }

    public int Area() {
        return Width * Height;
    }

}
代码语言:c#
复制
public class RectangleDraw {

    public void Draw(Rectangle rectangle) {
        Console.WriteLine("Draw Rectangle!");
    }

}
代码语言:c#
复制
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. 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、单一职责原则(Single Responsibility Principle or SRP)
  • 🚀二、使用步骤
    • 🔎1.示例
    • 🚀总结
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档