Как Вы реализовали бы MVC в приложении Windows Forms?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

64
задан Peter Mortensen 4 May 2015 в 04:13
поделиться

6 ответов

То, что я сделал в прошлом, является использованием что-то подобное, Образцовый Предъявитель Представления .

[ПРИМЕЧАНИЕ: Эта статья раньше имелась в сети. Для наблюдения его теперь необходимо будет загрузить CHM, и затем просмотреть свойства файла и нажать Unblock. Тогда можно открыть CHM и найти статью. Миллион благодарностей, Microsoft! вздох ]

форма является представлением, и у меня есть интерфейс IView для него. Вся обработка происходит в предъявителе, который является просто классом. Форма создает нового предъявителя и передает себя как IView предъявителя. Здесь тестирование Вас может передать в поддельном IView вместо этого, и затем отправить команды в него от предъявителя и обнаружить результаты.

, Если бы я должен был использовать законченный Образцовый Контроллер Представления, я предполагаю, что сделал бы это этот путь:

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

Это соответствовало бы классическая схема MVC. Самый большой недостаток - то, что с событиями, может быть трудно сказать, кто подписывается на какой. Шаблон MVP использует методы вместо событий (по крайней мере, способ, которым я реализовал его). Когда форма/представление генерирует событие (например, someButton. Нажмите), форма просто называет метод на предъявителе для выполнения логики для него. Представление и модель не имеют никакого прямого подключения вообще; они оба должны пройти предъявителя.

40
ответ дан Ryan Lundy 24 November 2019 в 15:59
поделиться

Windows Forms не разработаны с нуля для использования MVC. У Вас есть две опции.

Первый, Вы можете реализация самокрутки MVC.

Второй, можно использовать платформу MVC, разработанную для Windows Forms.

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

Для кого-либо начинающего, я предложил бы пропустить Windows Forms и разработать против WPF, если у Вас есть опция. Это - намного лучшая платформа для создания UI. Существует много платформ MVC, разрабатываемых для WPF, включая этот и что один .

17
ответ дан Ahmed Abdelhameed 24 November 2019 в 15:59
поделиться

Ну, реализации на самом деле Windows Forms "вольная" версия MVC, во многом как некоторые фильмы реализуют некоторую дрянную "вольную" интерпретацию некоторых классических книг (Romeo & Juliet приходит на ум).

я не говорю, что реализация Windows Form плоха, это просто... отличается.

при использовании Windows Forms и надлежащих методов ООП, и возможно ORM как EntitySpaces для доступа к базе данных, тогда Вы могли сказать что:

  1. инфраструктура ORM/OOP является Моделью
  2. , Формами являются Представления
  3. , обработчиками событий является Контроллер

, Хотя наличие и Представление и Контроллер, представленный тем же объектом, делает разделение кода из представления путем более трудный (нет никакого простого способа к плагину "представления GTK +" в классе, полученном из Microsoft. Windows. Формы. Форма).

, Что можно сделать, если Вы достаточно осторожны. Содержание Ваш код формы полностью отдельный от Вашего контроллера/типового кодекса только пишущий связанному с GUI материалу в конечном счете обработчики и всю другую бизнес-логику в отдельном классе. В этом случае, если бы Вы когда-нибудь хотели использовать GTK + для записи другого уровня View, необходимо было бы только переписать код GUI.

19
ответ дан dguaraglia 24 November 2019 в 15:59
поделиться

Зарегистрируйтесь Блок приложений Процесса интерфейса пользователя (UIP). Я не знаю много об этом, но посмотрел на него несколько лет назад. Могут быть более новые версии, проверить вокруг.

"Блок приложений UIP основан на шаблоне образцового контроллера представления (MVC)".

2
ответ дан Jason Bunting 24 November 2019 в 15:59
поделиться

По данным Microsoft, "заархивирован" Блок приложений UIP, упомянутый @jasonbunting. Вместо этого посмотрите Умный Блок Клиентского приложения или еще более новое Умная Фабрика клиентского программного обеспечения , который поддерживает и WinForms и WPF SmartParts.

4
ответ дан aridlehoover 24 November 2019 в 15:59
поделиться

Смотрите на Шаблоны MS и Методы Умный блок Клиентского приложения, который имеет некоторое руководство и классы, которые идут, Вы посредством реализации образцовой скороговорки предъявителя представления в формах окон - смотрите на включенное эталонное приложение.

Для WPF это - superseced призма проект

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

1
ответ дан Richard 24 November 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: