Александр Опарин,
Для начала, объектам надо знать, какие у них соседи.
Например, коннектор должен понимать, куда и откуда он ведёт, нет ли уже таких коннекторов. Коннектор должен лечь на схему так, чтобы по возможности не наложиться на существующие элементы на схеме.
Уже как бы контейнер для экземпляров напрашивается, каким естественным образом является поле.
У меня был проект, в котором надо было рисовать электрические схемы на поле.
Вполне очевидная архитектура:
class Field {
class fieldObj {
}
class connector{
}
}
Очень удобно с точки зрения того, что поле должно знать, что на нём рисуют, а блоки и коннекторы должны знать, что происходит с полем. Да сам Макконелл рекомендует вкладывать классы, если реальные объекты содержат друг друга.
Всё хорошо, но блоки и коннекторы бывают разные - плодится иерархия. У них сложные правила поведения, плодится код методов.
В результате архитектурно - ок, исходный код ужасен.