Как выбрать структуру 2d программы?
=====================================

 Нужен совет программистов. Я начал писать программу на c#.   

Суть программы - составить схему пневматический системы из элементов.   

Задать характеристики элементов и программа расчитает выходные параметры.   
  

В процессе написания понял что у меня уже не программа, а комок макарон.   
  

Почитал, про патерны. Применил некоторые, но особо лучше не стало.   
  

Может мне кто нибудь подсказать, есть ли какие нибудь типовые структуры программ с чётким разделением графической или не графической частей?   

Или в таких случаях нужно использовать "движок" (про них я мало, что узнал).   
  

Может где нибудь можно найти похожие проекты.   

Если у кого нибудь есть информация по литературе по данному вопросу, буду очень презнателен если вы ей поделитесь. 

> Я создал класс объектов, (например теплообменник) он имеет свойства на основании которых производится расчёт (например КПД) . И свойства на основании которых происходит отрисовака ( например положение при отображение (коардинаты x, y)) не уверен, что я сделал корректно. 

  

Создаете абстрактный класс "элемент расчета" с общим для всех элементов интерфейсом. Создаете базовый класс "графический элемент" с общим интерфейсом рисования.  

Создаете класс "элемент рисования", свойства которого - координаты и ссылки на элемент расчета и соответствующий ему графический элемент.  

Отрисовщик имеет массив элементов рисования, обходит их и один за другим отрисовывает, вызывая нужные функции графического элемента, который может обратиться за параметрами к элементу расчета. Важно, что элемент расчета ничего не знает ни о каком рисовании, а графический элемент знает не больше, чем нужно для отрисовки именно его картинки.  

Все элементы расчета и рисования представлены в виде классов-наследников тех абстрактных классов и обрабатываются единообразно - отрисовщик вообще не видит между ними различий, они убраны в класс графического элемента.  

Примерно так... 

 Попробуйте описать из каких объектов состоит ваша программа.  

Нарисуйте хоть какую-то схему из ваших классов (я использовал draw.io):  
![5d24716776b95972194416.png](https://habrastorage.org/webt/5d/24/71/5d24716776b95972194416.png)  

Правильнее использовать UML, но это не обязательно.  

Подумайте о пользовательских сценариях:  

Как вы будете получать входные данные?  

Есть ли иерархия элементов (элементы из других элементов)?  

После этого можно будет уже как-то смотреть и улучшать какие-то части. 

 Вроде, на C# уже сделана [Scada+](http://www.scadaplus.ru/)  

Там, правда, нет расчётов, там графический интерфейс и связь с контроллерами.  
[История](https://habr.com/ru/post/124427/), как она проектировалась.