Я строю систему управления для установки оборудования (система циркуляции воды). Я разработал его в два слоя: слой описания оборудования и уровень управления.
+----------------------------------------------+
| Control (enables manipulation of devices) |
+----------------------------------------------+
| uses (decorates)
v
+---------------------------------------+ (de)serialize +------------+
| HW Description |<--------------->| Files / DB |
| (stores physical layout, cabling etc) | +------------+
+---------------------------------------+
Уровень описания аппаратного обеспечения содержит карту аппаратного обеспечения, описывающую, как трубы подключены к теплообменникам и другому оборудованию. Данные для этого слоя настраиваются для каждой установки и будут считываться во время выполнения. Поэтому все классы в слое описания оборудования должны быть так или иначе сериализуемы (через Hibernate / сериализацию в XML или около того).
Уровень управления украсит классы слоя описания аппаратных средств интеллектом, поэтому, например, теплообменник получит связанный с ним HeatExchangerController.
В этой системе объектам на уровне управления, возможно, придется искать своих ближайших соседей по описанию оборудования, поэтому контроллер теплообмена может сделать что-то вроде
HeatExchangerController neighbour = this.getHeatExchanger().getInputPipe().getOtherSide().getHeatExchanger().getController();
neighbour.notify(highLoadAlert);
Проблема заключается в том, что нижний уровень (аппаратный уровень) осознает уровень интеллекта над ним (своего контроллера (ов)). Это не только нарушает правило односторонней зависимости между уровнями, но так как все классы описания аппаратного обеспечения должны быть сериализуемыми, это усложняет код, поскольку все ссылки на более высокие уровни должны быть необязательными, объявлены переходными и т. Д.
Теперь я немного застрял, пытаясь решить, является ли хорошей или плохой идеей сделать элемент управления доступным через слой описания HW, как этот, или есть ли альтернативные подходы. Я могу думать только об одном методе, который включал бы зеркалирование и делегирование почти всего слоя описания HW, который кажется навязчивым, чтобы быть хорошим.
Так что мой вопрос, если кто-нибудь из вас признает эту ситуацию и есть какие-либо советы / опыт. У него есть имя? Существуют ли какие-либо хорошие образцы / лучшие практики для этого, и есть ли какие-либо другие известные библиотеки / структуры, которые также имели и работали в этой ситуации?
Спасибо.