2012-03-21 58 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