2011-05-03 46 views
0

我一直在努力解决设计问题。我有一个对象Foo与一个对象数组Bar。有一系列与Foo完全耦合的计算方法,并且依赖于Bar数组的完整知识。所以我应该:两个共享对另一个对象的依赖关系的对象的正确设计是什么?

  • 做一个Calculator类并传入Bar对象的数组。这对我来说似乎很糟糕,因为我无法将Calculator作为独立单元进行测试,因为Foo和Calculator都依赖于相同的Bar数组。

  • 做一个计算器模块,并以某种方式扩展Foo,使其包括计算器?我还没有找到一个好的方法来做到这一点,计算器自动拥有它所需的所有Foo知识。这可能吗?

  • 只是保持计算器在美孚,因为它是如此耦合到它。

回答

2

您的架构不应该依赖于对象类,而应该依赖于接口。

Foo的实例应该在构造函数中需要一个实现接口iCalculator的参数。你的方法addBar应该只要求你传入一些实现接口的东西。而计算器对象(它传递给Foo)应该能够在iBar对象的任何实例上执行calculate方法。

现在,您可以单独测试所有三个对象,如果您提供具有相同接口的Mocks。

的“解决方案”实际上是Dependency inversion principle只是应用程序,是的是的SOLID原则一一/

+0

这里是一个视频,解释这个原理:http://www.youtube.com/watch ?v = tvFK_BXv3P4 – 2011-05-03 21:18:50

+0

“Foo'的实例应该在构造函数中需要一个实现接口'iCalculator'的参数” - 在Ruby中,'iCalculator'是类还是模块? – 2011-05-03 23:03:32

+0

@ Andrew-Grimm afaik,ruby并没有真正的接口,但最接近的是模块。但我想,你**可以**使用特定的类,只是它会更努力。 – 2011-05-03 23:11:14