Короче говоря
По сути, в этом вопросе нет универсального правильного или неправильного решения. Все зависит от обязанностей, которые вы хотите возложить на свои классы в их сотрудничестве. Но в большинстве случаев нет!
Плюсы - Когда это делать?
Если единственная ответственность за изменение цвета лежит на Person
, и никто другой не должен заботиться о House
, тогда ваш дизайн имеет смысл. Его преимущество заключается в сокрытии делегирования, как уже хорошо объяснил SDJ.
Но это не единственный способ распределить обязанности между классами, и есть много причин оставить дизайн более открытым, например: Что, если Person
не покрасит свой дом сама, а попросит Painer
сделать эту работу? от ее имени? Что, если бы, гипотетически, мэр деревни имел право принимать решение об изменении цвета и посылал своих маляров через деревню?
Минусы - по возможности избегайте!
В вашей конструкции есть большой недостаток. Это связано с принципом единой ответственности (SRP) а>:
У класса должна быть только одна причина для изменения
Добавление changeHouseColor
означает, что Person
имеет несколько причин для изменения: во-первых, оно может измениться вместе с самой концепцией Person. Но тогда, возможно, его также придется изменить в результате изменений в House
. Например, если завтра в интерфейсе House
потребуется дополнительный параметр толщины для changeColor
, изменится не только ваша реализация Person
(предоставляя дополнительный параметр в вызове делегирования), но и интерфейс Person
должен будет измениться, так что указана и толщина. Таким образом, небольшое изменение в House
распространится на весь класс, использующий Person
. Скрытая связь может быстро превратиться в технический долг.
Если вы начнете реплицировать каждый метод в каждом классе, который может получить к нему удаленный доступ, вы в дальнейшем столкнетесь с комбинаторным расширением в своих интерфейсах, которое быстро заморозит эволюцию любого интерфейса из-за риска распространения изменений.
Вывод
Разделение задач должно управлять вашим дизайном. Если понятие Person
не зависит от понятия House
, не связывайте их без необходимости. Делайте это только в случае крайней необходимости (например, если дом частный и никто ничего о нем знать не должен).
Кроме того, в UML нет необходимости добавлять метод changeHouseColor()
, чтобы показать, что человек может изменить цвет дома. Простая ассоциация между Person
и House
показывает, что Person может вызывать любой общедоступный метод House
.
Если вы предоставите getHouse()
в личном кабинете или добавите публичный +myHouse
в конец ассоциации, вы также сообщите, что другие классы могут получить доступ к House
Person
.
person
Christophe
schedule
05.01.2020
person.getHouse().changeColor(color)
? - person Mr. Polywhirl   schedule 02.01.2020House
напрямую изPerson
, это допустимо. - person Mr. Polywhirl   schedule 02.01.2020person.getHouse().changeColor(color)
но это не показывает, что класс человека меняет цвет - person Susantha7   schedule 02.01.2020person
класс - person Susantha7   schedule 02.01.2020