单一责任原则的例子是什么? [关闭]

2024-02-11

有人可以给我一个单一责任原则的例子吗?我试图理解在实践中,一个班级承担单一责任意味着什么,因为我担心我可能每天都会违反这条规则。


破坏应用程序的最有效方法是创建GOD http://en.wikipedia.org/wiki/God_object类。这些类跟踪大量信息并承担多项职责。一项代码更改很可能会影响该类的其他部分,从而间接影响使用该代码的所有其他类。这反过来又导致了更大的维护混乱,因为除了添加新功能之外没有人敢做任何改变。

以下示例是一个 TypeScript 类,它定义了Person,此类不应包含电子邮件验证,因为这与个人行为无关:

class Person {
    public name : string;
    public surname : string;
    public email : string;
    constructor(name : string, surname : string, email : string){
        this.surname = surname;
        this.name = name;
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
    greet() {
        alert("Hi!");
    }
}

我们可以通过从 Person 类中删除电子邮件验证的责任并创建一个新的来改进上面的类Email将承担该责任的类:

class Email {
    public email : string;
    constructor(email : string){
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }        
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
}

class Person {
    public name : string;
    public surname : string;
    public email : Email;
    constructor(name : string, surname : string, email : Email){
        this.email = email;
        this.name = name;
        this.surname = surname;
    }
    greet() {
        alert("Hi!");
    }
}

确保一个类具有单一职责,使其在默认情况下也更容易看到它的作用以及如何扩展/改进它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单一责任原则的例子是什么? [关闭] 的相关文章

随机推荐

  • 为 html 元素添加点击处理程序?

    我有一个使用 html 预先生成的页面 它看起来像一个可滚动的 div 列表 类似于 div div Item A div div div div Item B div div 我想在我的入口点方法中获取它们 并为每个添加一个单击处理程序
  • 在 Windows 上正确设置 DJANGO_SETTINGS_MODULE

    我有关于这个查询的帖子 但大多数都是针对 Linux 的 没有一个明确适用于 Windows 在我的应用程序中 我正在设置数据库 sqlite3 Django 中的默认值 编辑我的应用程序 mysite 的setting py文件后 DAT
  • 类在目标中被链接多次

    我有两个目标app and appTests 我也有课Wine和框架Realm和 RealmSwift 它们链接到这两个目标 当我使用类时也不例外Wine在目标中app 但是当我想运行测试时 appTests swift 22行 impor
  • 如何销毁由 resque 工作人员排队的工作?

    我在 Rails 3 项目上使用 Resque 来处理计划每 5 分钟运行一次的作业 我最近做了一些事情 使这些工作岗位的创造如滚雪球般增长 目前该堆栈已达到 1000 多个工作岗位 我修复了导致许多作业排队的问题 现在我遇到的问题是由错误
  • ReferenceError:ReactJS Build 中未定义 localStorage

    我在 React 应用程序中的经过身份验证的组件上大量使用 localStorage 以从本地存储获取用户详细信息并在登录时存储它们 当我构建我的应用程序时 它会抛出ReferenceError localStorage is not de
  • RxJava API 和 Java 9 Flow API 之间的区别

    在过去几个主要版本的 Java 的每次迭代中 似乎都有一致的新方法来管理并发任务 在 Java 9 中 我们有Flow API https docs oracle com javase 9 docs api index html java
  • R dplyr mutate_at 访问 colnames

    如何访问正在处理的列名dplyr mutate at 假设我们想要将数据框的列转换为因子 其级别存储在单独的列表中 df lt data frame C1 c A B C C2 c D E F df C1 C2 1 A D 2 B E 3
  • suffix(from:) 和 dropFirst(_:) 之间有什么区别吗?

    我突然想到 在 Swift 中处理子序列时 func suffix from Int 似乎与刚才相同dropFirst 显然 对于长度为 10 的数组 只需将输入值从 3 更改为 7 即可 只是重复一遍 所以 当然 对于一系列的说法长十 我
  • Python 中 switch/case 的语法等价物是什么? [复制]

    这个问题在这里已经有答案了 Programming languages like C C C Java JavaScript and Pascal Reference https en wikipedia org wiki Switch s
  • 删除 Github 上使用 提交的

    我在 github 上有一些提交 如下所示 有没有一种方法可以重新设置基准 以便我可以摆脱这个问题并简单地将提交标记为由我标记 首先我会检查你的 git 是否配置了正确的用户信息 跑步git config list以验证一切是否正确 您还可
  • 自动部署到 F5 负载平衡环境

    我们目前正在使用 TeamCity 进行 CI 构建 并且我们也在尝试设置自动化部署 我当前尝试部署的项目是位于 F5 负载均衡器下的 Windows 服务 将来 我们还希望自动化部署同样位于 F5 下的 IIS 网站 从 TeamCity
  • jquery mobile 外部面板不采用样式

    我正在尝试实现 jQuery mobile 1 4 rc1 中提供的新外部面板 我能够让面板按其应有的方式在所有页面上输入和关闭 但是面板不会继承默认主题 c 的样式 如果使用 data theme a 定义主题也不会继承样式 面板将加载无
  • 从剪贴板保存图像

    我想将 winrt 中剪贴板内的一张图像保存到文件中 但我没有找到办法 你能帮忙吗 var dataPackage Clipboard GetContent var t await dataPackage GetBitmapAsync va
  • 使用 jquery 的 ajax 调用中未设置 HTTP_X_REQUESTED_WITH

    我正在使用 Django 开发一个新网站 我遇到了 ajax 请求的问题 我一直在谷歌上搜索并阅读了很多帖子和文章 大多数都解释相同 问题 ajax 调用已执行 我在视图中收到了请求 但 request is ajax 返回 false 据
  • Vagrant、VirtualBox - 找不到适配器?

    输入 vagrant up 时获取以下日志转储 已尝试在 VirtualBox 上没有任何混乱 并且还手动添加端口转发规则 主机 IP 127 0 0 1 主机端口 2222 访客端口 22 Bringing machine polecat
  • OpenCV.js - 检测MultiScale“无法捕获此异常”

    我正在尝试通过 OpenCV js 使用面部识别 但是当我调用detectMultiScale 的方法CascadeClassifier对象我收到错误 未捕获 6446128 异常捕获已禁用 无法捕获此异常 使用 s DISABLE EXC
  • 使用 Spring Profile 加载 util:properties 会导致 ID 多次出现

    我正在使用 Spring 3 1 配置文件通过 util properties 加载属性文件
  • 如何重启BluetoothLeScanner?

    我正在使用 Android 端的 BluetoothLeScanner 将 Android 设备连接到 iOS 第一次一切都完美无缺 问题是 在我连接到其中一台已发现的 iOS 设备后 我停止扫描 stopScan scanCallback
  • 如何将集合转换为 pandas 中的列表? [复制]

    这个问题在这里已经有答案了 我有这样的数据 name SF a 1 23 4 5 b 1 3 43 5 c 1 23 24 5 d 1 23 54 15 我想让SFset to list我期望的输出是 name SF a 1 23 4 5
  • 单一责任原则的例子是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人可以给我一个单一责任原则的例子吗 我试图理解在实践中 一个班级承担单一责任意味着什么 因为我担心我可能每天都会违反这条规则 破坏应