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