Здесь я вижу два вопроса для обсуждения:
People --- Order
и
People --- Order --- Product
1). Должны ли мы открывать как People.getOrders (), так и Order.getOrdersForPerson (p)?
2). Должны ли мы выставлять People.getProductsOrdered ()?
Инстинктивно, после того, как много лет занимался ОО, я ответил бы «нет» на оба вопроса. Но могу ли я это оправдать? Какая эвристика будет направлять нас? Некоторые предложения:
а). Меньше, тем лучше. Каждый метод стоит. Время разработки, тестирование, документация. Чем больше у вас методов, тем сложнее найти нужный.
б). Единственные обязанности. Если мы примем это, выставив оба People.getOrders () и Order.getOrdersForPerson (p) os overkill, какой объект действительно отвечает за отношение People-Order. Я бы сказал, что это природа Приказов, чтобы связать Заказчика, поэтому Орден должен владеть отношениями.
с). Развязка. Занятые люди заказывают много вещей. Вы, вероятно, в конечном итоге имеете метод getOrders (), который принимает дополнительные критерии, например, при заказе или размере заказа. Выставить, что вы используете атрибуты заказов. Таким образом, People.getOrders (критерии) теперь выражается в деталях содержимого заказа. Если вы измените Порядок, вам нужно изменить Люди. Сцепление это плохо! Этот пункт касается вопроса о продукте. Понятно, что заказы по сути должны знать о продуктах и иметь определенный уровень связи с ними. У людей нет таких внутренних отношений, поэтому не связывайте их с продуктами.
г). Масштаб. Люди делают много вещей. Они не просто размещают заказы. Будете ли вы менять класс людей на каждую новую вещь, которую они делают? Добавьте People.getTrips () People.getExpenseReimbursements (), People.getHeathCareClaims (). Конечно, нет.
Не поддавайтесь аргументу "о, это легко реализовать в SQL", на этом уровне обсуждения мы больше озабочены разработкой хороших интерфейсов и четким разделением обязанностей.