普通的一个普通猿 2024-04-13 11:29 采纳率: 84.4%
浏览 1
已结题

描述 SOLID 原则中的单一职责原则(SRP)并给出一个违反该原则的例子?

描述 SOLID 原则中的单一职责原则(SRP)并给出一个违反该原则的例子。

  • 写回答

6条回答 默认 最新

  • 生瓜蛋子 2024-04-13 22:58
    关注

    单一职责原则(Single Responsibility Principle, SRP)是面向对象编程(OOP)领域中SOLID五大设计原则之一,由罗伯特·C·马丁(Robert C. Martin)提出。SRP强调的是一个软件模块(如类、函数或组件)应当只有一个明确的责任或职责,即它应专注于完成一个特定的任务,并且这个任务应该完全由这个模块负责。

    单一职责原则的定义与核心思想

    • 定义:一个类(或模块、方法等)应该仅有一个引起它变化的原因。
    • 核心思想:将相关的责任紧密地封装在一起,而将不相关的责任分离到不同的类或模块中。这样做的目的是使每个类的功能更加专一,职责边界清晰,减少类之间的耦合,增强代码的可读性、可维护性和可扩展性。

    单一职责原则的优点

    1. 高内聚性:单一职责原则确保了类的内部行为高度相关,使得代码更易于理解和管理。
    2. 低耦合度:遵循SRP的类不会涉及与其主要职责无关的功能,从而减少了与其他类之间的依赖,简化了系统架构。
    3. 可维护性提升:当需求变化时,由于类职责单一,改动通常只会影响到一个有限的范围,降低了因修改一处代码而导致其他部分意外失效的风险。
    4. 可测试性增强:职责单一的类更容易被独立测试,不需要复杂的设置或依赖,测试用例也更为明确和简洁。

    违反单一职责原则的例子

    以下是一个常见的违反SRP原则的类设计示例:

    class Rectangle {
        private double width;
        private double height;
    
        public Rectangle(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        // 计算面积
        public double calculateArea() {
            return width * height;
        }
    
        // 绘制矩形到指定的图形界面
        public void draw(Graphics graphics) {
            // 实现具体的绘图逻辑
        }
    }
    

    在这个例子中,Rectangle 类既负责计算矩形的面积(逻辑计算),又负责在图形界面上绘制矩形(图形渲染)。这两个职责显然是不同的业务功能,它们各自的变化原因可能会不同:

    • 计算面积:可能由于算法优化、精度要求变化等原因而需要修改。
    • 绘制矩形:可能由于用户界面样式更新、渲染技术升级、平台兼容性问题等因素而需要调整。

    当这两个职责耦合在一个类中时,问题就出现了:

    • 不必要的代码包含:一个只需要计算面积的应用程序,不得不包含与绘制相关的代码,增加了复杂性和资源消耗。
    • 逻辑上的耦合:对Rectangle类的修改可能会影响到原本无关的功能,比如改进绘制逻辑时不小心影响到了面积计算的准确性。
    • 难以复用:如果只想复用计算面积的部分,或者只想复用绘制矩形的部分,由于职责混杂在一个类中,变得难以实现。

    正确的做法是将这两个职责分离到各自的类中:

    class ShapeCalculator {
        public double calculateRectangleArea(double width, double height) {
            return width * height;
        }
    }
    
    class RectangleRenderer {
        public void drawRectangle(Graphics graphics, double width, double height) {
            // 实现具体的绘图逻辑
        }
    }
    

    通过这样的拆分,ShapeCalculator类专门负责计算各种形状的面积,而RectangleRenderer类专注于矩形的图形渲染。每个类都有清晰的职责,当需求变化时,可以独立地对它们进行修改,而不影响到对方。这就符合了单一职责原则的要求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月13日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改