Расширение класса: делать это внутри класса или использовать наблюдателей? - PullRequest
0 голосов
/ 07 сентября 2010

Мне нужно расширить класс (в C ++, но я думаю, что этот вопрос не зависит от языка), с функциональностью, которая может быть реализована двумя различными способами:

  • , просто добавив логику всам класс
  • путем добавления логики наблюдателя к классу и помещения логики в наблюдателя вне класса

В обеих альтернативах есть свои преимущества и недостатки:

  • , поскольку код может использоваться и для других классов, представляется более логичным добавить логику в наблюдателя.Тогда будущие классы будут нуждаться только в поддержке наблюдателей.
  • С другой стороны, влияние наблюдателей на код с интенсивными вычислениями предвидеть сложно.Новые наблюдатели, добавленные позже в коде, могут оказать негативное влияние на код с интенсивными вычислениями.

Имеет кто-нибудь четкие правила о том, когда добавлять новые функции в классе, а не помещать его внаблюдатель вне класса?

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Популярным способом расширения функциональности является шаблон Extension Interface , как описано в POSA1 .

Другой шаблон, который вы можете рассмотреть, - это шаблон Proxy.Если логика дискретная , вы можете связать прокси-объекты друг с другом и ссылаться на них только через интерфейс.Это должно позволить вам красиво распределить логику по нескольким независимым и взаимозаменяемым объектам.

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

1 голос
/ 07 сентября 2010

Я думаю, что в этом случае (как и у многих) - это зависит.Это тот случай, когда вы знаете, что уместно в контексте проблемы, которую вы решаете.

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

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

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

Итак, отвечая на ваш вопрос: нет - я, честно говоря, не думаю, что кто-то может сказать, что существуют четкие правила.

У людей могут быть предпочтения, и они могут быть более или более применимыми.Но я сомневаюсь, что они когда-нибудь станут универсальными.

Тебе придется подумать об этом - но это то, что делает это забавным!

...