В своей книге Java Design Питер Коад говорит, что один из пяти критериев, которым должен соответствовать подкласс, состоит в том, что подкласс "не подклассирует то, что является просто служебным классом (полезная функциональность, которую вы хотели быповторное использование) «.Например, в Java он говорит, что превращение одного из классов вашего домена в подкласс 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
быть просто функцией, а не в каком-либо классе?