Наследование, состав или что-то еще - я должен подкласс служебного класса в моих тестах? - PullRequest
1 голос
/ 21 марта 2012

В своей книге 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 быть просто функцией, а не в каком-либо классе?

1 Ответ

1 голос
/ 21 марта 2012

В принципе, вы можете решить проблему любым удобным вам способом. ООП - это просто парадигма, которая должна помочь вам разрабатывать вещи более понятным и понятным способом.

Итак, вопрос, который вы должны задать себе каждый раз, когда хотите использовать наследование, они имеют одинаковую роль, и вы просто хотите добавить функциональность? или вы хотите просто использовать хорошие методы в "базовом" классе?

Это просто вопрос концепции, и в вашем небольшом примере это может пойти в любую сторону, потому что у них одна и та же концепция, но в основном вы просто используете базовый класс в качестве утилиты.

Если вы хотите, чтобы базовый класс действительно являлся базовым, вы должны создать его таким образом, чтобы каждый унаследованный класс вел себя одинаково.

Я согласен, что концептуально было бы целесообразно иметь базовый класс модульных тестов для всех тестов, которые работают аналогично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...