2014-01-16 3 views
1

У меня возник вопрос о дизайне:Идиома для интерфейса между монитором и контроллером

Я использую шаблон проектирования MVC. Но View в моем проекте является частью I/O. Это означает, что часть, которая записывает/считывает данные на/с жесткого диска или печатает что-то на экране.

Я упоминал, что «вид» также должен выполнять операции чтения/записи. Наша программа нуждается в некоторых входных данных для выполнения требуемого численного расчета. И поскольку эти входные данные также должны быть доступны для редактирования вручную, мы решили сделать эти входные данные как xml.

Затем контроллер запрашивает «представление» для чтения этих входных данных xml, чтобы модель могла быть заполнена.

Эта ситуация выглядит следующим образом:

        Controller 
           / \ 
           /   \ 
          /    \ 
          View    Model 
         / \ 
        /  \ 
        /    \ 
       xml reader   xml data 

Так что вопрос теперь в том, что перейти от View к контроллеру, когда он читал входные данные?

Если представление создает экземпляр классов из модели и заполняет их входными данными и передает эти экземпляры контроллеру.

Или должен ли он передавать перечисления и поплавки контроллеру, чтобы он мог инициировать необходимые классы и давать поплавки конструкторам?

Какой дизайн лучше, и почему?

Редактировать: Причина, по которой мы думали, что представление должно содержать загрузку входных данных (теперь реализованных как I/O в файл), заключается в том, что в будущей версии кода мы хотим иметь gui, где пользователь может указать, чтобы создать входные данные. И тогда представление получает точные данные (но затем из gui, а не из файла) и должен передать его контроллеру. Итак, теперь это просто самый простой «вид» (как может взаимодействовать пользователь с xml). Это правильное понимание MVC?

Edit 2: Мы реализовали численный метод, как FEM. Таким образом, модель содержит две вещи: с одной стороны, она содержит данные (которые частично могут быть представлены с помощью xml), т. Е. Представление конечных элементов и т. Д. И, с другой стороны, он содержит логику, то есть дифференциальные уравнения с частными производными, параметры которых также должны храниться в xml. Таким образом, входные данные необходимы для логики модели, а не для представления.

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

Большое спасибо заранее!

+1

Я не уверен, правильно ли вы поняли модель. Модель должна содержать (и, скорее всего, также читать) любые данные, необходимые, и представление должно быть только для представления этих данных пользователю. – arne

+0

@arne: Я также не уверен, правильно ли я понял это. Итак, вопрос может быть расширен до этой части: «К чему относится I/O в MVC?» –

ответ

2

Согласно Gang of Four, если я не ошибаюсь, класс Model является тем, кто должен выполнять операции ввода-вывода. Вид представляет собой презентацию и позволяет пользователю или контроллеру выполнять модификации модели, но не должен заряжаться операциями ввода-вывода, поскольку это нарушает инкапсуляцию, подвергая внутреннее представление модели.

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

+0

см. Мое редактирование исходного сообщения. Сохраняя это (факты, которые я написал в редактировании), вы бы порекомендовали поместить ввод-вывод в модель? –

+0

Хорошо Edit2, безусловно, подтверждает мое мнение; поскольку логика сложна, поскольку сериализация, выполненная в том же классе, позволяет упростить процесс сериализации/десериализации классов. Edit1 может быть разрешен (если я его правильно понимаю!), Используя статический завод на модели, который может использоваться контроллером через данные, доступные в представлении. Наличие IO в представлении также означает, что вам придется дублировать (или наследовать), что при создании другого представления; и изменение внутреннего представления модели заставит вас изменить представление и наоборот. – Calimar41

+0

Судя по комментариям к другому ответу, я, возможно, пропустил вашу мысль. Я думаю, что Модель должна иметь методы для построения себя из данных в потоке - xml и в противном случае; контроллер должен ... управлять внешними ресурсами и передавать потоки для используемой модели. В принципе, представление и модель очень специфичны: представление представляет собой презентацию; модель - внутренняя логика; контроллер занимается взаимодействием между этими двумя и остальным миром. – Calimar41

1

Если я правильно понимаю, у вас есть две модели данных, в этом случае вы должны последовательно следовать шаблону MVC. Разделение компонентов происходит по какой-то причине, это особенно поможет, если вы захотите переключить xml для gui позже:

Модель имеет дело с данными, просмотр позволяет взглянуть на нее через собственную линзу 'и контроллер позволяет вам манипулировать моделью.

Если вашему представлению нужны какие-то входные данные, вы можете реализовать второй MVC под этим. Вы получите вторую модель (model2: ваши данные xml) плюс второй контроллер. Прямо сейчас ваш контроллер - это «ручное редактирование» вашей второй модели. Позже ваш контроллер станет частью GUI, который также будет иметь второе представление на вашей второй модели).

Примечание: см. Обсуждение в комментариях.

+0

Это то, о чем я думал: реализовать представление как на MVC. Вот почему я помещал слово «просмотр» в кавычки. Но я думаю, у меня были другие причины, кроме вас ... Я не совсем понимаю, что вы имеете в виду под «двумя моделями данных»? Моя модель содержит данные (которые частично могут быть представлены с помощью xml) и бизнес-логики, которая делает вычисления. Само представление не нуждается в входных данных. Это логика, в которой она нуждается.Кроме того, вы оставили основной вопрос без ответа: когда я создаю представление собственного MVC, должен ли я передавать перечисления или объекты в контроллер? Или я неправильно понял вас? –

+0

Хорошо, я неправильно понял ваш вопрос. У вас только один MVC. Если вы правильно следуете шаблону MVC, ваше представление НЕ загружает данные (оно отображает только вашу модель), модель представляет данные. Модель делает ввод/вывод (читает xml или текст или из базы данных) и представляет его таким образом, чтобы вид и контроллер могли его обрабатывать. Взгляните на эту статью из QT: https://qt-project.org/doc/qt-4.8/model-view-programming.html. Возможно, после этого ситуация станет более ясной. – count0

+0

Хорошо, давайте предположим, что я бы реализовал модель таким образом, чтобы она загружала данные из xml-файла. Как бы я позже реализовал способ, чтобы эти данные, которые ранее были переданы через xml-файл, были построены через gui? Тогда gui, который является точкой зрения, должен передать эту информацию модели (возможно, через контроллер, верно?). Поэтому мне кажется, что я должен реализовать построение модели дважды (после чтения из xml и некоторого другого времени, создающего его через представление). И я понял, что реализация чего-то дважды - это действительно плохо, не так ли? –

Смежные вопросы