Какой дизайн класса лучше? [закрытый]

Возвращая сам объект base, вы отбрасываете любую ссылку на него, начиная с derived, а затем повышая (и копируя).

Так эффективно, что вы ищете, не сработает.


Если вам действительно «нужно это вернуть объект», я рекомендую тонкую оболочку

struct karls_return_object {
    // ... stuff ...

    Base *b;
};
30
задан Sander 2 September 2008 в 04:46
поделиться

9 ответов

На вопрос просто отвечают путем распознавания, что наследование моделирует отношения "ISA", в то время как отношения моделей a "HAS - A" членства.

  • сотрудник ЯВЛЯЕТСЯ пользователем
  • , у сотрудника ЕСТЬ userinfo

, Какой корректен? Это - Ваш ответ.

53
ответ дан 27 November 2019 в 22:57
поделиться

Мне не нравится ни один. Что происходит, когда кто-то - и участник и сотрудник?

18
ответ дан 27 November 2019 в 22:57
поделиться

Я не думаю, что состав всегда лучше, чем наследование (просто обычно). Если Сотрудник и участник действительно являются Пользователями, и они являются взаимоисключающими, то первый дизайн лучше. Рассмотрите сценарий, где необходимо получить доступ к UserName Сотрудника. Используя второй дизайн Вы имели бы:

myEmployee.UserInfo.UserName

, который плох (закон Demeter), таким образом, Вы осуществили бы рефакторинг к:

myEmployee.UserName

, который требует, чтобы маленький метод на Сотруднике делегировал к Пользовательскому объекту. Всего из которого избегает первый дизайн.

12
ответ дан 27 November 2019 в 22:57
поделиться

Спросите себя следующее:

  • Вы хотите смоделировать, Сотрудник Пользователь? Если так, выбрал наследование.
  • Вы хотите смоделировать, Сотрудник ИМЕЕТ информация о Пользователе? Если так, используйте состав.
  • виртуальные функции, включенные между Пользователем (информация) и Сотрудником? Если так, используйте наследование.
  • у Сотрудника может быть несколько экземпляров Пользователя (информация)? Если так, используйте состав.
  • имеет смысл присваивать объект Сотрудника Пользователю (информация) объект? Если так, используйте наследование.

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

15
ответ дан 27 November 2019 в 22:57
поделиться

Реальные вопросы:

  • , Каковы бизнес-правила и пользовательские истории пользователя?
  • , Каковы бизнес-правила и пользовательские истории сотрудника?
  • , Каковы бизнес-правила и пользовательские истории участника?

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

5
ответ дан 27 November 2019 в 22:57
поделиться

Утверждение Вашего требования/спецификации могло бы помочь достигнуть 'лучшего дизайна'.
Ваш вопрос также 'subject-to-reader-interpretation' в данный момент.

3
ответ дан 27 November 2019 в 22:57
поделиться

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

Первый Подход иначе Наследование

Профессионалы:

  • Позволяет полиморфное поведение.
  • первоначально просты и удобны.

Недостатки:

  • May становится сложной или неуклюжей со временем , если [еще 115] поведение и отношения добавляются.

Второй Подход иначе Профессионалы Состава

:

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

Недостатки:

  • Никакой полиморфизм поэтому менее удобно использовать сопутствующую информацию и поведение

Списки как они + вопросы , Jon Limjap упомянутый поможет Вам принять решения и начать - затем можно найти, каковы право ответы должны были быть ;-)

12
ответ дан 27 November 2019 в 22:57
поделиться

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

Тем не менее второй лучше, потому что он способствует составу по наследованию.

4
ответ дан 27 November 2019 в 22:57
поделиться

Вот сценарий, о котором необходимо думать:

Состав (2-й пример) предпочтителен, если тот же Пользователь может быть и Сотрудником и участником. Почему? Поскольку для двух экземпляров (Сотрудник и участник), которые представляют того же Пользователя, если Пользовательские данные изменяются, Вы не должны обновлять их в двух местах. Только Пользовательский экземпляр содержит всю информацию о Пользователе, и только это должно быть обновлено. И начиная с классы Сотрудника и начиная с участника содержат тот же Пользовательский экземпляр, они будут автоматически оба содержать обновленную информацию.

2
ответ дан 27 November 2019 в 22:57
поделиться