Должен ли я расширить класс только потому, что добавлена ​​одна переменная? - PullRequest
0 голосов
/ 01 сентября 2018

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

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

Альтернативой было бы добавить эту определенную переменную к Person и просто не использовать ее до тех пор, пока она не понадобится «позднее». Это кажется плохим стилем, хотя Наследование существует по определенной причине, и я должен его использовать, подумал я.

Редактировать: Что может быть важно, так это то, что только некоторые Person -объекты становятся LivingBeings, они сосуществуют. Так что было бы легче различать объекты Person и LivingBeing, вместо того, чтобы всегда иметь Person.

1 Ответ

0 голосов
/ 01 сентября 2018

Вообще говоря, на этот вопрос нет конкретных ответов.

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

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

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

Существует множество альтернатив наследования, которые следует учитывать при решении следующих проблем проектирования:

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

  2. Композиция - В композиции класс живого существа будет удерживать класс человека и передавать ему функции. Это обычно чище, чем наследство. https://en.wikipedia.org/wiki/Composition_over_inheritance

  3. Создайте иерархию атрибутов, которая просто представляет дополнительные функции, которые может иметь класс. Затем вы можете сохранить его на некоторой карте / etc внутри класса person. Таким образом, когда вы добавите больше атрибутов, изменения в классе будут ограничены.

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