Здесь действительно есть два вопроса. Двусторонняя композиция - или, вообще говоря, двусторонняя ассоциация - сама по себе не является проблемой. Это абсолютно допустимый тип отношений, хотя и несколько непрактичный в реализации. Двусторонняя ассоциация добавляет еще одну зависимость, и каждая дополнительная зависимость увеличивает связь (см. «Низкая связь», объясненная Крейгом Ларманом как часть его принципов GRASP).
Тем не менее, иногда необходимо двустороннее объединение, чтобы отразить тот факт, что два объекта имеют смысл только вместе. Да, вы можете сказать, что у фигуры есть доска, но мы действительно так говорим в реальной жизни? Мы заботимся об этом? С точки зрения домена, это не играет решающей роли, по крайней мере, когда домен просто играет чеки. Возможно, в другой воображаемой области, где мы перемещаем фигуры между многими досками, эта точка зрения может иметь решающее значение, и нам может потребоваться смоделировать ее с помощью двусторонней ассоциации. Теперь, упомянув домены, я не могу не упомянуть классическую книгу Эрика Эванса о доменном дизайне. На самом деле, Эрик прекрасно объясняет все нюансы моделирования доменов с помощью программного обеспечения. В частности, он также объясняет двусторонние (двунаправленные) ассоциации между объектами (стр. 83).
Теперь ко второму вопросу. Необходимость хранить ссылку на доску в вашем случае и поддерживать двустороннюю связь вызвана тем, что вы возложили ответственность за перемещение фигур на неправильный объект. Перемещение фрагментов - это операция, которая может затрагивать несколько фрагментов, поэтому один конкретный фрагмент не может справиться с этим, не нарушив инкапсуляцию. Вместо этого мы должны спросить, кто является тем ответственным объектом, который может наблюдать за всеми частями и управлять ими надлежащим образом в соответствии с правилами домена (правилами игры чеков)? Без добавления каких-либо специальных объектов, из тех, что у нас уже есть, это, кажется, доска. Доска выглядит хорошим местом для хранения логики, которая манипулирует содержимым платы (поэтому мы уважаем инкапсуляцию).
Итак, отвечая на ваш реальный вопрос, было бы лучше поместить метод move () в класс Board и автоматически избавиться от ненужной двусторонней ассоциации. И в качестве продолжения того, что я упомянул о распределении обязанностей, я бы снова упомянул GRASP (что на самом деле означает Принципы общего распределения ответственности) - проверьте его, я уверен, что он очень поможет в этом и подобных случаях.