Архитектура для приложения, которое поддерживает несколько свойств пользовательского ввода - PullRequest
3 голосов
/ 13 сентября 2010

Я ломал голову над тем, как лучше всего спроектировать приложение, над которым я должен начать работу в ближайшее время, и ничего простого не приходит на ум. Может быть, кто-то еще может увидеть то, что мне не хватает.

Цель довольно проста - создать приложение на C # / WinForms, чтобы пользователь мог указать загружаемый файл, затем визуализировать содержимое этого файла в 3D, позволить пользователю настроить некоторые свойства и запустить симуляцию. .

Хитрая часть - это бэкэнд. У меня есть два файла для загрузки.

Первый не указан пользователем, а выходит из более старого приложения C ++ и имеет формат XML и будет загружен автоматически. XML-файл описывает структуру своего объекта - каждый класс, его свойства и соответствующие значения min, max и по умолчанию для этих свойств, а также текстовое поле, документирующее свойство. Этот файл используется для настройки / определения классов / свойств. Этот файл продолжает изменяться довольно регулярно, поэтому целью здесь является импорт этих определений XML, чтобы не связывать этот новый пользовательский интерфейс слишком тесно со старым приложением.

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

Вот и все.

Как я уже сказал, я рассмотрел несколько способов сделать это, но все они кажутся архаичными. Один из методов, о котором я подумал: во-первых, создайте фабрику / диспетчер, который читает и создает класс типа «Загружаемый» для представления тех классов, которые определены в XML; затем создайте универсальное «Свойство» для хранения самих свойств и сохранения их в некоторой коллекции внутри объекта Loadable. Я думаю, что таким образом, я могу ссылаться на эти Loadables позже при загрузке файла пользователя или при перетягивании их в PropertyGrid для редактирования пользователем.

Мысли? Я на трещине? Есть ли более простой способ справиться с этим, которого я не вижу сквозь деревья? Любые комментарии приветствуются.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

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

public class Class {
  public List<Property> Properties;
}

public class Property {
  public string Name;
  public float Min;
  public float Max;
  public float Default;
  public string Documentation;
}

Тогда ваш второй файл - это данные, связанные с этими метаданными, вы можете смоделировать его следующим образом:

public class Instance {
  public Class Class;
  public List<PropertyValue> Values;
}

public class PropertyValue {
  public Property Property;
  public float Value;
}

Примечание: используйте надлежащие конструкции, такие как свойства только для чтения и параметры конструктора, для создания экземпляров ваших объектов, в зависимости от ситуации. (Я использовал поля только в качестве примера.)

0 голосов
/ 13 сентября 2010

Я не уверен, что это то, что вы ищете, но каждый раз, когда я имею дело с файлом настроек XML (к которому в основном сводится ваш первый файл), я просто создаю класс, единственная цель которого в жизни чтобы получить эти значения и вернуть их мне. Таким образом, мне не нужно сразу читать все свойства или настройки, а просто вызвать этот класс, который проверит XML-файл на предмет того, что ему нужно, и передаст его мне прямо сейчас, а затем пусть GC сделает это вещь. Как я уже сказал, я не уверен, что это то, что вы ищете, но моя идея помочь вам немного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...