【程序设计】6大设计原则之单一职责

简介: 【程序设计】6大设计原则之单一职责

概念:


有且仅有一个原因引起类的变化,也就是一个类只负责一项职责的原则。


方案介绍:


如果在设计之初定义一个类中有多项职责,则应该考虑重新设计将类的粒度进行分解为多个子类,每个子类职责单一。


案例分析:


完整代码地址:CodeSendBox


需求1.0讲解:

在国庆来临之际我们要对优质客户进行促销回馈活动,会员1级的用户8折出售,会员2级的用户7折出售。


代码实现:

export class Product {
  // 不同等级的会员享有的折扣不同
  sell(member: number, discount: number): void {
    if (member === 1) {
      console.log("国庆热卖,尊贵的1级会员");
      if (discount === 8) {
        console.log("8折出售了~");
      }
    } else if (member === 2) {
      console.log("国庆热卖,尊贵的2级会员");
      if (discount === 7) {
        console.log("7折出售了~");
      }
    }
  }
}
// 两个因素影响产品类;
import { Product } from "./v1";
new Product().sell(1, 8);
new Product().sell(2, 7);


说明:通过上面代码的实现可以看出,我们的商品类在进行出售的时候有两个可变因素,一个是会员等级,另一个是享受折扣。


需求迭代1.1讲解:

在原有的基础上还允许我们的用户使用手中的优惠券进行折上折活动,但是不同的会员等级也是有不同优惠券额度的限制,1级会员最高20元,2级会员最高50元。


代码实现:

export class Product {
  // 不同等级的会员在原有折扣的基础上享有不同额度的优惠券使用服务
  sell(member: number, discount: number, coupons: number): void {
    if (member === 1) {
      console.log("国庆热卖,尊贵的1级会员");
      if (discount === 8) {
        console.log("8折出售了~");
        if (coupons <= 20) {
          console.log("使用优惠券最高再减20~");
        }
      }
    } else if (member === 2) {
      console.log("国庆热卖,尊贵的2级会员");
      if (discount === 7) {
        console.log("7折出售了~");
        if (coupons <= 50) {
          console.log("使用优惠券最高再减50~");
        }
      }
    }
  }
}
import { Product } from "./v2";
new Product().sell(1, 8, 20);
new Product().sell(2, 7, 50);


功能复盘:

通过第一版的代码实现和第二版的迭代,我们将成功的出售的函数变得更加庞大,按次方法迭代下去,这个方法的复杂度不可估计,每次上线也将变得心惊肉跳的有没有。其实问题的原因就是在设计之初没有考虑好将来的变化为违反了单一职责的原因。


代码重构:

6.png


重新设计后的产品类:
export class Product {
  service: IProductService;
  constructor(service: IProductService) {
    this.service = service;
  }
  sell() {
    this.service.member();
    this.service.discount();
    this.service.coupons();
  }
}

定义产品出售的影响因素接口:
interface IProductService {
  member(): void;
  discount(): void;
  coupons(): void;
}
复制代码

原来的产品类按会员等级分解为两个会员客户类:

每个等级的客户单独维护与自己紧密相关的因素

export class Level1Customer implements IProductService {
  member(): void {
    console.log("国庆热卖,尊贵的1级会员");
  }
  discount(): void {
    console.log("8折出售了~");
  }
  coupons(): void {
    console.log("使用优惠券最高再减20~");
  }
}
export class Level2Customer implements IProductService {
  member(): void {
    console.log("国庆热卖,尊贵的2级会员");
  }
  discount(): void {
    console.log("7折出售了~");
  }
  coupons(): void {
    console.log("使用优惠券最高再减50~");
  }
}

客户端实现:
import { Product, Level1Customer, Level2Customer } from "./v3";
new Product(new Level1Customer()).sell();
new Product(new Level2Customer()).sell();

再次复盘:

重构后客户端的改造量最少,产品类的拆分导致代码量直线上涨,但是我们的类将变得各司其职,在增加新的售卖方案条件时将对以前版本的侵入变得更少,扩展变得简单,易于维护。



相关文章
|
运维 Java 程序员
Spring5深入浅出篇:Spring切入点详解
该文档是关于Spring框架中切入点的详细解释。切入点是AOP(面向切面编程)的核心概念,用于定义通知(如日志、事务管理)应该附加到代码的哪些位置。文档主要介绍了切入点表达式的不同类型: 1. 方法切入点表达式:使用`execution()`定义匹配的方法,星号`*`代表任意返回值和方法名,`(..)`表示任意参数。 2. 类切入点:指定特定类以应用额外功能,可以精确到类中的所有方法,或者只包含特定包的类。 3. 包切入点表达式:适用于整个包或包及其子包内的所有类和方法。
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
489 45
|
自然语言处理 IDE 测试技术
灵动指间,快码加编,你的智能编码助手 ——通义灵码
通义灵码是一款强大的智能编码辅助工具,具备优秀的代码补全、快速生成、全面功能、强兼容性和企业私域知识库支持等优点。它能显著提升开发者的编码效率,减少错误,支持200多种编程语言,兼容主流IDE,是现代编程的理想助手。
472 0
|
5月前
|
运维 监控 Linux
WGCLOUD运维平台的分布式计划任务功能介绍
WGCLOUD是一款免费开源的运维监控平台,支持主机与服务器性能监控,具备实时告警和自愈功能。本文重点介绍其计划任务功能模块,可统一管理Linux和Windows主机的定时任务。相比手动配置crontab或Windows任务计划,WGCLOUD提供直观界面,通过添加cron表达式、执行指令或脚本并选择主机,即可轻松完成任务设置,大幅提升多主机任务管理效率。
|
8月前
|
人工智能 算法 物联网
“同西游,见万相” 主题LoRA风格挑战赛来袭!万元奖金池+猫超卡+限定周边来赢!
在通义万相Wan2.1的文生视频模型的基础上训练LoRA模型,以《西游记》的经典人物或故事为背景,描绘一个创作者心中的西游场景。参赛者根据自己的创意自定义故事内容,选择用任意的视觉风格和叙事手法进行演绎,展现 AI 在风格迁移、内容创意和叙事变化上的可能性。
164 10
|
消息中间件 监控 负载均衡
中间件故障转移与容错
【7月更文挑战第23天】
286 1
|
SQL 测试技术 Python
SqlAlchemy 2.0 中文文档(四十三)(6)
SqlAlchemy 2.0 中文文档(四十三)
205 0
|
存储 算法 程序员
操作系统(11)----内存管理5
操作系统(11)----内存管理
448 1
操作系统(11)----内存管理5
|
IDE 编译器 Shell
运行C程序的步骤与方法
C语言是一种通用、过程式的计算机编程语言,广泛应用于系统软件与应用软件的开发中。本文将详细介绍如何编写、编译和运行一个简单的C程序,并附上相应的代码示例。
541 0
|
传感器 语音技术
受蜘蛛感知系统启发的超灵敏机械裂缝传感器-阅读笔记
文章仿生蜘蛛的缝感受器,设计制造了高灵敏度的应变传感器(GF>2000,0.2%)。