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)
确保一个类只有一个责任,因此默认情况下也更容易看到它的作用以及如何扩展/改进它.
查看实体描述。
除非您要求更具体的内容,否则将很难提供更多帮助。
单一责任是一个类的概念,即班级只做一件特定的事情(责任),而不是尝试做更多的事情,这也被称为高凝聚力。
上课通常不是从低凝聚力开始的,但是通常在发布了多个版本并且添加了不同的开发人员之后,突然间您会注意到它变成了某些人所说的怪物或上帝课程。因此,应该重构该类。
很难想到一个很好的例子,但是我最近想到的一个例子是我们拥有一类管理不同数据包处理阶段的类Chain of Responsibility。该类的最初目的是维护一个阶段列表,并安排对它们的调用packetProcess()。嗯,最终,每个人都为此处理程序类添加了任何与处理阶段有关的内容(因为管理类很容易访问这些阶段),尤其是阶段配置。经理类不再具有单一职责,而是还负责对配置更改的各个阶段进行调用:因此降低了内聚性。
最后,我们不得不重构经理类,删除所有阶段配置并将其放置在工厂中,从而让经理去做打算做的事情。