2012-03-21 31 views
1

Peter Coad在他的书Java Design中指出,子类应该满足的五个标准之一是子类“并不仅仅描述实用类(您希望重用的有用功能)”。对于Java中的一个例子,他说将你的一个域类作为the Observable class的一个子类违反了他的规则:“Observable是一个实用类,一组有用的方法 - 仅此而已。”继承,组合或其他 - 我应该在测试中继承一个实用类吗?

在这种情况下,这里有一些经过实际测试图案的例子测试类,我写了:

class BaseDataGeneratorTestCase (unittest.TestCase): 
    def _test_generate_data(self, generator, expected_value): 
     # Imagine there's a lot more code here, making it 
     # worthwhile to factor this method out. 
     assert generator.generate_data() == expected_value 

class DataGeneratorTests (BaseDataGeneratorTestCase): 
    def test_generate_data(self): 
     self._test_generate_data(DataGenerator(), "data") 

class VariantDataGeneratorTests (BaseDataGeneratorTestCase): 
    def test_generator_data(self): 
     self._test_generate_data(VariantDataGenerator(), 
           "different data") 

虽然这个例子很简单,考虑到实际试验和他们周围的系统当然,更复杂。我认为这个例子可以作为一种工具来尝试和澄清我对继承的正确使用的一些混淆。

是继承BaseDataGeneratorTestCase一个坏主意?它是否符合“有用的功能(我愿意重复使用”)? _test_generate_data应该只是一个函数,而不是任何类?

回答

1

基本上你可以用任何你喜欢的方式解决问题。面向对象只是一个本应该帮助你以更清晰和可维护的方式设计事物的范例。

所以,你应该问自己,你想要使用继承的问题他们有相同的作用,你只是想添加功能?或者你想只使用“基础”类中的好方法?

这只是一个概念问题,在你的小例子中,它可能以任何一种方式,因为它们具有相同的概念,但基本上,你只是使用基类作为工具。

如果您希望基类实际上是一个基类,您应该设计它,以便每个继承类都具有相似的行为。

我的确同意,从概念上讲,对于所有类似工作的测试都有一个单元测试基类是有意义的。

+0

感谢您的回答。太糟糕了,没有更多的人与他人讨论。也许这种品牌的牦牛剃须对少数人有吸引力。 – draebek 2012-03-22 17:15:26