SRP:为什么使用实例字段值而不是参数?

时间:2010-12-20 15:59:38

标签: c# parameters instance-variables single-responsibility-principle cohesion

我刚读过SRP, as easy as 123…,所有这些都与我产生共鸣,除了一个段落,在一个名为“凝聚力”的部分中(我之前声称要“获得”Cohesion,但这个参数的谈话与实例字段让我暂停......):

  

上课。看看你的方法。   他们有参数还是他们   使用实例字段?如果它们是   使用参数,删除它们。使   他们的实例字段。你结束了吗?   使用只使用其中一个的方法   五个实例?最有可能的是   低凝聚力的警告   存在于该方法与您的方法之间   类。

这种参数的删除仅仅是一个临时练习,可以揭示接近静态能力(低内聚力)的方法,其理念是当你完成时你会返回参数的使用吗?

或者是参数字段优先于参数实际设计技术以保持高内聚力?

我是否以某种方式脱离了背景?

1 个答案:

答案 0 :(得分:2)

CRUD是基于接口的编程的一种真正常见方法。采用两个实现CRUD接口的具体类:Employee和Building。

现在想象一下您的代码看起来如何基于参数:

Employee employeeObj = new Employee();
Building buildingObj = new Building();

string firstName = "Bob";
employeeObj.Create(firstName);

建筑怎么样?

BuildingTypes buildingType = BuildingTypes.One;
building.Create(buildingType);

Woops ...你应该如何用不同的参数实现CRUD接口?创建重载?更多接口?两个参数(名字姓氏)怎么样?

这会变得如此之快......因为只要你使用CRUD界面的参数就有多个理由要改变,这会降低设计的凝聚力。

让我们尝试使用基于对象/实例的参数...

Employee empObj = new Employee();
empObj.FirstName = "Bob";

empObj.Create();

Building buildingObj = new Building();
buildingObj.BuildingType = BuildingTypes.One;

buildingObj.Create();

使用简单的CRUD并且没有参数,甚至可以使用多态:

someObj.Create();

这也会导致胶囊化成分,去耦,SRP等......