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

Sac*_*nth 34 oop single-responsibility-principle definition design-principles solid-principles

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

Rem*_*sen 41

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

以下示例是一个定义a的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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过从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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 那么现在我们的项目中会得到大量的单一方法? (6认同)
  • 是的,您通过编写非常简单的单一关注实体来创建更复杂的功能. (6认同)

Bra*_*ady 5

查看实体描述

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

单一责任是一个类的概念,即班级只做一件特定的事情(责任),而不是尝试做更多的事情,这也被称为高凝聚力。

上课通常不是从低凝聚力开始的,但是通常在发布了多个版本并且添加了不同的开发人员之后,突然间您会注意到它变成了某些人所说的怪物或上帝课程。因此,应该重构该类。

很难想到一个很好的例子,但是我最近想到的一个例子是我们拥有一类管理不同数据包处理阶段的类Chain of Responsibility。该类的最初目的是维护一个阶段列表,并安排对它们的调用packetProcess()。嗯,最终,每个人​​都为此处理程序类添加了任何与处理阶段有关的内容(因为管理类很容易访问这些阶段),尤其是阶段配置。经理类不再具有单一职责,而是还负责对配置更改的各个阶段进行调用:因此降低了内聚性。

最后,我们不得不重构经理类,删除所有阶段配置并将其放置在工厂中,从而让经理去做打算做的事情。

  • 几周前我遇到了。我需要一个Object Factory类,该类将创建不同类型的对象的实例,对其进行序列化,将其持久化到DB等。我的第一个想法是使用Serialize Method创建Factory类,但是当我阅读有关SRP的内容时,拥有专门用于序列化的类,针对数据库中的Persist对象的类等的更多意义。这使您的应用程序更易于维护和模块化。 (5认同)
  • 您仍然没有提供很好的解释...您甚至似乎自己都不了解这个概念... Remo的答案应该是选定的,而不是您含糊的答案。同样,“除非您要求更具体的内容,否则将很难提供更多帮助”,这是一个全面的解决方案,根本没有帮助,他足够具体,在课堂上举例说明了SRP。唯一可以解决此问题的方法是将您的示例转换为伪代码mve。 (3认同)