当前位置: 首页 > news >正文

01.单一职责原则

单一职责原则

概述

简单来说就是一个类只描述一件事, 比如我们熟知的 userDao.java 只负责 用户域功能。如果userDao既操作user表又操作order表,这显然不合理。正确的做法是让orderDao.java去操作order表。
对类来说的,一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。

代码分析

反例

public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("汽车");vehicle.run("轮船");vehicle.run("飞机");}
}//交通工具类
//1.在方式1中的run方法,违反了单一职责原则
//2.解决方法非常简单,根据交通方案的不同 ,分解成不同的类即可
class Vehicle{public void run (String vehicle){System.out.println(vehicle+"在公路上运行......");}
}

正例

public class SingleResponsibility2 {public static void main(String[] args) {RoadVehicle roadVehicle = new RoadVehicle();roadVehicle.run("汽车");AirVehicle airVehicle = new AirVehicle();airVehicle.run("飞机");WaterVehicle waterVehicle = new WaterVehicle();waterVehicle.run("轮船");}}//交通工具类
//1.遵守单一职责原则
//2.但是这样改动很大,即将类分解,同时修改了客户端
//3.改进: 直接修改Vehicle类,改动的代码会比较少 => 方案3
class RoadVehicle{public void run (String vehicle){System.out.println(vehicle+"在公路上运行......");}
}class AirVehicle{public void run (String vehicle){System.out.println(vehicle+"在天空上运行......");}
}class WaterVehicle{public void run (String vehicle){System.out.println(vehicle+"在水里上运行......");}
}

优化

public class SingleResponsibility3 {public static void main(String[] args) {Vehicle2 vehicle = new Vehicle2();vehicle.run("汽车");vehicle.runWater("轮船");vehicle.runAir("飞机");}
}//交通工具类
//1.这种修改方式没有对原来的类做大的修改,只是增加了方法
//2.虽然没有在类这一级别上遵守单一职责原则,但是在方法级别上,仍然是遵守了单一职责
class Vehicle2{public void run (String vehicle){System.out.println(vehicle+"在公路上运行......");}public void runAir (String vehicle){System.out.println(vehicle+"在天空上运行......");}public void runWater (String vehicle){System.out.println(vehicle+"在水中上运行......");}
}

一些细节

  1. 降低类的复杂度,一个类只负责一项职责;
  2. 提高类的可读性,可维护性;
  3. 降低变更引起的风险(假想,现在需求变更,要求汽车只能在7点~21点在公路上运行而飞机每半小时只能起飞一架,比较以下三种方式实现变更的代码修改量);
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中的方法数量足够少,才可以在方法级别保持单一职责原则;

关注我,共同进步,每周至少一更。——Wayne

http://www.lryc.cn/news/225553.html

相关文章:

  • RT-Thread上部署TinyMaix推理框架,使MCU赋予AI能力
  • 设计模式 -- 策略模式(Strategy Pattern)
  • Spring Boot 集成 ElasticSearch
  • 百度智能云正式上线Python SDK版本并全面开源!
  • LeetCode(3)删除有序数组中的重复项【数组/字符串】【简单】
  • 前端视角中的微信登录
  • Python 中使用 Selenium 隐式等待
  • GEE:基于 Landsat 计算的 kNDVI 应用 APP
  • Spring 缓存注解
  • 微信小程序前端开发
  • C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
  • 无需开发,精臣云可轻松连接用户运营、广告推广等行业应用
  • 第三阶段第一章——PySpark实战
  • Python数据容器(字符串)
  • Python---练习:把8名讲师随机分配到3个教室
  • python+requests接口自动化测试
  • 【T3】畅捷通T3采购管理模块反结账,提示:本年数据已经结转,不能取消结账。
  • 线性代数(五) | 矩阵对角化 特征值 特征向量
  • 读书笔记:彼得·德鲁克《认识管理》第12章 服务机构的绩效管理
  • 基于FPGA的模板匹配红外目标跟踪算法设计
  • ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR
  • 用于强化学习的置换不变神经网络
  • 【华为OD题库-008】座位调整-Java
  • 4 Paimon数据湖之Hive Catalog的使用
  • Verilog刷题[hdlbits] :Bcdadd100
  • Flink—— Data Source 介绍
  • 树之二叉排序树(二叉搜索树)
  • 管易云与电商平台的无代码集成:实现API连接与用户运营
  • ElementUI的el-upload上传组件与表单一起提交遇到的各种问题以及解决办法(超详细,每个步骤都有详细解读)
  • python flask_restful “message“: “Failed to decode JSON object: None“