单一责任原则的例子是什么?

时间:2012-05-16 13:51:24

标签: oop definition solid-principles single-responsibility-principle design-principles

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

4 个答案:

答案 0 :(得分:35)

将应用程序分解为创建GOD类的最有效方法。这些类可以跟踪大量信息并具有多种职责。一个代码更改很可能会影响类的其他部分,因此间接影响使用它的所有其他类。这反过来会导致更大的维护混乱,因为除了为其添加新功能之外,没有人敢做任何改变。

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

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!");
    }
}

确保一个类只有一个责任,因此默认情况下也更容易看到它的作用以及如何扩展/改进它。

答案 1 :(得分:4)

查看Solid description

除非你要求更具体的内容,否则很难提供更多帮助。

单一责任是一个阶级做一个特定事物(责任)的概念,而不是试图做更多的事情,这也被称为高凝聚力。

课程通常不会以低凝聚力开始,但通常在几个版本和不同的开发人员加入它们之后,突然你会注意到它变成了一个怪物或神级,就像有人称之为。所以课程应该重构。

很难想出一个很好的例子,但我最近能想到的是一个管理不同数据包处理阶段的类,Chain of Responsibility。这个类的初衷是维护一个阶段列表并协调调用它们的packetProcess()。好吧,它最终表明每个人都在处理阶段(因为经理类是访问阶段的一个容易的地方)添加了与此经理类相关的任何内容,尤其是阶段配置。经理类不再具有单一责任,而是负责调用阶段进行配置更改:因此Cohesion已经减少。

我们最终不得不重构经理类,删除所有阶段配置并将其放入工厂,从而让经理去做它想要做的事情。

答案 2 :(得分:2)

单一责任原则(SRP)规定,一个类或一个方法应该只做一件事,不应该做任何相关的事情。一堂课应该只有一个改变的理由。

一个典型的例子可以是EmailSender类:

  • 这应该只是处理发送电子邮件。
  • 这不应该对从数据库加载电子邮件内容甚至格式化要发送的电子邮件内容负责。

Here是一篇关于此的文章。

答案 3 :(得分:1)

一个班级应该只有一个改变的理由。

这个原则指出,如果我们有两个理由要改变一个类,我们必须将功能分成两个类。每个类只处理一个责任,如果将来我们需要进行一个更改,我们将在处理它的类中进行。

如果有两个不同的原因需要改变,可以想象两个不同的团队可能出于两个不同的原因处理相同的代码。每个人都必须部署其解决方案,在编译语言(如C ++,C#或Java)的情况下,可能会导致与其他团队或应用程序的其他部分不兼容的模块。

这一原则与耦合和凝聚的概念密切相关。耦合指的是应用程序的不同方面如何不可分割地联系起来,而内聚指的是特定类或包的内容可能有多紧密相关。单个类的所有内容紧密耦合在一起,因为类本身是[单个单元] [1],必须完全使用或根本不使用。

我的博客文章:

http://javaexplorer03.blogspot.in/2016/12/single-responsibility-principle.html