为什么类现在往往被定义为接口?
去年这2-3个,我看到的许多项目,如Cuyahoga开源C#CMS,倾向于将持久性和非持久性类定义为
Interface
。为什么?有充分的理由吗? TDD?惩戒?一个设计模式? ...
没有找到相关结果
已邀请:
5 个回复
抽法
最初,您的设计只有一个类BenefitCalculator。但后来,事实证明你需要不止一个课程,例如因为软件的不同部分应该使用不同的算法(可能支持不同的国家,或者因为算法应该是用户可配置的......)。在这种情况下,不是膨胀现有的BenefitCalculator实现,而是创建新的类是有意义的,例如, BenefitCalculatorFrance,或BenefitCalculatorSimple等。 现在,如果您使用签名
,你有点搞砸,因为你不能提供不同的实现。但是,如果你使用 calculateSalary(... IBenefitCalculator bc,...) 你可以让所有类实现接口。 这实际上只是“松耦合”的一个特例:需求尽可能少来自代码的其他部分。在这种情况下,不要求某一类;而只是要求存在某些方法,这正是接口的作用。
镀建啼
然后,每当有人添加新的交易类型时,您必须修改您的类。或者,您可以:
现在,您无需修改代码即可处理新类型的事务。你只需要人们创建自己的类来实现ITransaction,你的类将“只处理它”。 这允许您根据需要交换接口的实现。它还支持依赖注入和模拟框架以进行单元测试。 但总的来说,它实际上只是让代码更灵活的另一种方式。
锹缄
佩疵瓦
为陡土
在这种情况下,每次对B进行内部更改时,编译器都需要重新评估A以确定是否需要重新编译。 相反,我们使用接口:
在这种情况下,A仅取决于IB。对B的更改不需要在编译时考虑A。 在规模上,这种对短路依赖性评估的影响可以显着加速大型代码库的编译。当有很多类依赖于单个类改变很多时,它特别强大。 显然,只有当类对实现类没有静态依赖时,此编译时权益才有效。执行以下操作将完全失败这一好处:
这就是Dependency Injection的用武之地.DI容器会构造一个B并将其作为IB提供给A,因此A不需要具有静态依赖性。