@Urukhayy

Как лучше решить эту ООП задачу?

Есть классы: University и Professor.
University содержит множество экземпляров Professor.
У Professor должен быть метод getUniversity, возвращающий University.

Как можно правильно по ООП решить эту задачу? При этом, Professor не должен хранить в себе ссылку на экземпляр университета, ведь это агрегация, и профессор может существовать в отсутствие университета, поэтому ссылка на университет может быть всегда пустой. Более того, нарушается принцип SOLID (OCP): если в будущем мы захотим добавить College и профессор должен будет работать сразу в двух учебных заведениях.
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
А ваш метод GetUniversity у профессора не нарушит SOLID и агрегацию? По моему тут обычный DI - инжектируйте зависимость в профессора, просто не через конструктор, а через поле, раз профессор может туда-сюда бегать из университета в колледж.
Ответ написан
customtema
@customtema
arint.ru
University содержит множество экземпляров Professor.


В смысле? Университет может порождать множество экземпляров университетов, а профессор - профессоров. И они не могут наследовать - профессор не имеет ни свойств, ни методов университета.

Как верно подсказал коллега выше, принадлежность к университету - обычное свойство профессора, причем может быть многие-ко-многим. Следовательно, ответ на ваш вопрос: обычный геттер.
Ответ написан
@asd111
1 . Делать отдельный массив из словарей university - professor. Когда появятся College, то нужен будет ещё один массив college-professor. Для поиска нужно будет обходить весь массив. Менять класс профессора не понадобится при появлении коледжей.
2. Хранить массив профессоров в каждом универе и массив универов в каждом профессоре. При добавлении колеждей нужно будет менять класс профессора.

Первое решение универсальнее, соответствует нормальным формам проектирования БД и часто используется при проектировании БД, т.е. когда появится БД, а она судя по всему появится, то перенести все в БД будет просто.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы