单一责任原则的实施

时间:2009-01-17 02:06:13

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

如果我将我的对象分解为“单一责任”,是否有一个基本的想法是,对象是应该共存还是分开,例如,如果我有

class Employee_DataProvider() : IEmployee_DataProvider { ... };
class Employee_Details() : IEmployee_Details { ... };
class Employee_Payroll() : IPayroll() { ... };
class Employee_LeaveProcessing() : ILeaveProcessing_Client { ... };
...

让所有这些生活在里面,但通过接口,一个拥有的员工类松散耦合是难闻的气味:

class Employee
{
    IEmployee_DataProvider _dataProvider;
    IEmployee_Details _details;
    IPayroll _payroll;
    ILeaveProcessing_Client _leaveProcessing;

    //My functions call the interfaces above

}

或者更多地考虑在代码中将这些类完全分开(或者至少尽可能单独分开)?或者这两种方法都是SRP的有效用法吗?

编辑:我不想对示例中给出的对象的可行性进行批评,我只是用它来说明问题。我同意数据,休假和工资核算处理不属于员工类的域。

虽然SRP要求我作为真实世界表示对象作为围绕单个功能概念的属性和方法从对象移开

2 个答案:

答案 0 :(得分:4)

回到OOP基础:Employee对象应该有反映它的功能的方法,而不是对它做了什么。

答案 1 :(得分:2)

虽然还没有人解决我关于原则本身的实际问题,而不是我给出的一个有点差的例子,一个对过程影响它的过程了解太多的员工对象,对那些显然对这个问题感兴趣的人(虽然我希望进行更多的讨论,但我还有2个“最爱”明星。我已经做了更多的阅读。

我认为目前的两个答案试图说的是,责任分离应该能够独立存在,而我的榜样就是不应该做的事情的完美例子。我非常乐意接受这一点。

来自ObjectMentor(Uncle Bob的网站)的段落有一个示例,它将Connection和DataReader对象(之前存在于调制解调器类中的两个对象然后分离出来)组合成一个ModemImplementation,但是状态为

  

然而,请注意我已经重新连接   把这两个责任合二为一   ModemImplementation类。这不是   可取,但可能是必要的。   经常有理由,不得不这样做   与硬件或细节   操作系统,迫使我们结合事物   我们宁可不情侣。然而,   通过分离我们的接口   将概念分解为   关于申请的其余部分。

     

我们可能会查看ModemImplementation   阶级是kludge,或疣;然而,   注意所有依赖关系都会消失   从中。没有人需要依赖于此   类。没有人除了主要需要   知道它存在。因此,我们已经把   围栏后面的丑陋的一点。它的   丑陋不需要泄漏和污染   申请的其余部分。

我认为“注意到所有依赖关系都离开它”这一行很重要