Должен ли я использовать наследование? - PullRequest
8 голосов
/ 22 июля 2010

Это более субъективный вопрос, поэтому я собираюсь предварительно пометить его как вики сообщества.

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

Я чувствую, что проделал хорошую работу по логическому разделению информации, и недавно я проделал хорошую работу по изоляции зависимостей между классами с помощью методов DI / IoC, но я боюсь, что что-то упустил. Я склонен связывать поведение в интерфейсах, но я просто не делаю подкласс.

Я легко могу понять подклассы с точки зрения традиционных примеров, таких как class Dog : Animal или class Employee : Person, но у меня просто нет ничего настолько очевидного, с чем я имею дело. И вещи редко бывают такими четкими, как class Label : Control. Но когда дело доходит до фактического моделирования реальных сущностей в моем коде как иерархии, я понятия не имею, с чего начать.

Итак, я думаю, мои вопросы сводятся к следующему:

  1. Можно ли просто не наследовать или наследовать? Должен ли я быть обеспокоен вообще?
  2. Какие у вас есть стратегии для определения объектов, которые могут получить выгоду от наследования?
  3. Допустимо ли всегда наследовать на основе поведения (интерфейсов), а не фактического типа?

Ответы [ 11 ]

0 голосов
/ 22 июля 2010

Ответ на каждый из ваших 3 вопросов: «Это зависит». В конечном итоге все будет зависеть от вашего домена и того, что ваша программа делает с ним. Много раз я обнаружил, что шаблоны проектирования, которые я выбрал для использования, действительно помогают найти точки, где наследование работает хорошо.

Например, рассмотрим «преобразователь», используемый для преобразования данных в желаемую форму. Если вы получаете 3 источника данных в виде CSV-файлов и хотите поместить их в три разные объектные модели (и, возможно, сохранить их в базе данных), вы можете создать базу 'csv transformer', а затем переопределить некоторые методы при наследовании из нее в Для того, чтобы обрабатывать различные конкретные объекты.

«Приведение» процесса разработки к языку шаблонов поможет вам найти объекты / методы, которые ведут себя аналогичным образом, и поможет в сокращении избыточного кода (возможно, посредством наследования, возможно, с помощью разделяемых библиотек - в зависимости от того, что лучше всего подходит для ситуации). 1005 *

Кроме того, если вы будете хранить свои слои отдельно (бизнес, данные, презентация и т. Д.), Ваша диаграмма классов будет проще, и тогда вы сможете «визуализировать» те объекты, которые должны быть унаследованы.

...