有人可以举一个单一责任原则的例子吗?我试图理解,在实践中,一个班级有一个单一的责任,因为我担心我可能每天都违反这条规则。
答案 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)
除非你要求更具体的内容,否则很难提供更多帮助。
单一责任是一个阶级做一个特定事物(责任)的概念,而不是试图做更多的事情,这也被称为高凝聚力。
课程通常不会以低凝聚力开始,但通常在几个版本和不同的开发人员加入它们之后,突然你会注意到它变成了一个怪物或神级,就像有人称之为。所以课程应该重构。
很难想出一个很好的例子,但我最近能想到的是一个管理不同数据包处理阶段的类,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