Это «лучший» дизайн?
Это похоже на причудливый дизайн вокруг. При моделировании реальных вещей в программном обеспечении платит дивиденды, чтобы модель отражала реальность; такие модели легче понять, поддерживать и расширять.
Во-первых, дом - это не то, что покупает человек. Человек - это то, что покупает дом. Метод «купить» должен быть «лицом», а не «домом».
Во-вторых, дом - это не то, что определяет, можно ли купить дом. владелец дома - это лицо, которое определяет, можно ли его купить. (Почему возникает ошибка «уже принадлежит»? Конечно, дом уже принадлежит. Кто-то владеет им.)
В-третьих, вам, возможно, придется подумать о том, что происходит в мире, где несколько покупателей могут пытаться купить дом одновременно. На самом деле продавец собирает различные предложения и делает встречные предложения, продажи могут зависеть от других событий и так далее. Должны ли все эти вещи присутствовать в модели? Если да, то где? Вероятно, в состоянии объекта, представляющего владельца, так как с владельцем является предметом, о котором договариваются.
В-четвертых, в действительности в сделках по покупке жилья обычно участвуют доверенные третьи стороны для условного депонирования, а также различные другие стороны, такие как кредиторы продавца и покупателя, которые могут предоставлять средства или держать залоговое удержание. Отражены ли эти партии в этой модели?
В-пятых, если вы намерены добавить к своей модели «причины, по которым вы не можете купить этот дом», тогда вы описываете систему политики . В этом случае представьте политики как первоклассные объекты в вашей системе, чтобы ими можно было манипулировать, как и любыми другими объектами. Владельцы имеют политику о том, на каких условиях они будут продавать. У банков есть политика относительно условий, при которых они будут кредитовать. И так далее.
В этой модели ваша проблема становится «спросить механизм разрешения политики, если покупатель соблюдает все необходимые условия, наложенные деревьями политики каждого соответствующего агентства для покупки данного дома». Другими словами, вопрос "может ли X купить Y?" не для X или Y, чтобы выяснить; дело в том, что механизм разрешения политики должен сработать, и именно это возвращает вам список политик, которые X не смог выполнить, чтобы купить Y у Z.
Имеет смысл?