2012-05-16 105 views
23

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

+0

看看这里:http://stackoverflow.com/questions/659232/it-this-an-example-of-the-single-responsibility原则 –

+0

http://www.phpfreaks.com/tutorial/oo-php-part-2-boring-oo-principles –

+0

顺便说一句,你没有提到一个特定语言的例子,所以什么都行:) –

回答

4

查看Solid description

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

单一职责是一类做一个具体的东西(的责任),而不是试图做更多比它应该,它也被称为高内聚的概念。

班经常不开出低凝聚力,但通常经过几个不同的版本,不同的开发人员加入到他们身上,突然间,你会发现,它成为一个怪物或神级的一些调用它。所以这个类应该被重构。

它很难想出一个很好的例子,但我最近可以想到的是我们有一个类来管理不同的数据包处理阶段,一种类型为Chain of Responsibility。这个类的最初意图是维护一个阶段列表并在它们上协调调用packetProcess()。那么最后呢,每个人都会在处理阶段添加任何东西(因为经理类是访问阶段的一个简单场所),尤其是阶段配置。经理类不再有单一责任,而是负责调用配置更改的阶段:因此凝聚力已经降低。

我们最终不得不重构管理器类,剥开所有阶段的配置,并把它在一个工厂,因此可以使管理者做什么它打算这样做。

+0

你有没有工作中的例子 - 一个真实世界的例子。 –

+4

几周前我遇到了这个问题。我需要一个Object Factory类来创建不同类型的对象的实例,对它们进行序列化,将它们保存到数据库等。我首先想到的是用Serialize方法创建一个Factory类,但是当我读到SRP时,更有意义的是拥有一个专门用于Serialize的类,一个类用于DB中的Persist对象等等。这使得您的应用程序更易于维护和模块化。 –

+0

@SachinKainth,我在我的答案中添加了一个例子。 – Brady

24

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

下面的例子是定义一个人打字稿类,这个类不应该包括电子邮件验证,因为这不是一个人的行为有关:

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类电子邮件验证,并创建一个新的电子邮件类的责任,这将有责任:

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

确保一个类只有一个respon可靠性使其在默认情况下也更容易看到它的作用以及如何扩展/改进它。

+3

那么现在我们会在我们的项目中获得大量的单个methos课程? –

+3

是的,您可以通过撰写非常简单的单一关注实体来创建更复杂的功能。 –

2

单一职责原则(SRP)指出,一类或方法只能做一件事情,不应该是有关的任何做任何事情。一个班级应该只有一个理由要改变。

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

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

Here是这方面的一篇文章。

0

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

该原则规定,如果我们有两个改变类的理由,我们必须将功能拆分为两个类。每个班级将只负责一个责任,如果将来我们需要做出一个改变,我们将在班级中处理它。

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

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

我的博客文章在这:

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

+0

https://www.youtube.com/watch?v=Gt0M_OHKhQE 此视频支持“一个班级只能有一个改变原因” – code90