Монолитное наследование против ООП на основе модульных элементов - PullRequest
3 голосов
/ 17 декабря 2009

Мне трудно принять проектное решение

У меня есть класс в python, который обрабатывает данные формы, эти данные очень похожи на другие данные формы, и поэтому я реорганизую их в свой собственный объект, чтобы их могли использовать другие классы.

Делима - это погода, чтобы сделать этот процессор членом класса или родителем классов.

Пожалуйста, поправьте меня, если эта терминология неверна, вот что я разрываюсь между:

классы на основе монолитного наследования:

class FormProcessor(object):
    def post(self):
        # ... process form data

class PageHandler(RequestHandler,FormProcessor):
    def get(self):
        # show page

или более модульные классы на основе членов:

class FormProcessor(object):
    def process(self):
        # ... process form data

class PageHandler(RequestHandler):
    def __init__(self):
        self.processor = FormProcessor()
    def get(self):
        # show page

    def post(self):
        self.processor.process(self.postdata)

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

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

с нетерпением ждем любых советов по этому вопросу

1 Ответ

7 голосов
/ 17 декабря 2009

Определенно перейдите на модульный подход. Некоторые из преимуществ использования модульного подхода:

  • Это делает ваш код более читабельным, то есть более понятным, что делают PageHandler и FormProcessor
  • Это облегчает и делает более эффективным написание модульных тестов на обоих ваших классах
  • Позволяет изменить поведение PageHandler на более позднем этапе, используя другую реализацию PageHandler

В общем, придерживайтесь идеи, что один класс делает одно; легче понять, с чем вы работаете, при обслуживании программного обеспечения, а также облегчить написание (тогда вам нужно думать только об одном контексте).

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