Реализация Образцового Контроллера Представления правильный путь

C#?? пустой оператор объединения -

Едва ли скрытый, но редко используемый. Вероятно, потому что много разработчиков выполняет милю, когда они видят условное выражение? оператор, таким образом, они работают два, когда они видят этого.Б/У:

string mystring = foo ?? "foo was null"

, а не

string mystring;
if (foo==null)
    mystring = "foo was null";
else
    mystring = foo;
21
задан Sneakyness 26 July 2009 в 14:19
поделиться

5 ответов

Возможно, вас заинтересует презентация, которую я сделал для ACCU '09 - « Внедрение Model-View-Controller в Cocoa и Objective-C ».

Где находится это начало? С контроллер? Это, кажется, делает самый разумный для меня, но как это начато?

Создайте новый проект приложения Какао, и вы увидите, что уже существует класс контроллера, предоставленный шаблоном - это класс делегата приложения. Теперь заглянем в MainMenu.xib . Есть экземпляр делегата приложения, который подключен к выходу делегата объекта «Владелец файла» . В этом случае NSApplication является владельцем файла; это то, что требовало распаковки MainMenu . Итак, это действительно делегат приложения.

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

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

Как мне настроить игровой мир? я в настоящее время используются два массива, один для мир (стены, полы, двери, вода, Лава и т. Д.), И один для предметов (Я добавлю третий для символы). Карта (.plist) загружены, а затем объекты создал и добавил в массив его принадлежит. Куда деваются массивы? В прототип, они также являются частью вид, так что я думаю, вы могли бы сказать, что я объединил два (View и Controller) вместе. Будет ли объект Map создано для каждой карты? Будет ли Объект Maps, содержащий все maps?

Мы можем определить, какие объекты мы моделируем, проанализировав ваше утверждение выше - вы можете этого не осознавать, но вы набросали спецификацию :-). Есть мир, в котором есть стены, двери и т. Д., Поэтому мы знаем, что для них нам нужны объекты, и что они должны принадлежать объекту World. Но у нас также есть предметы и персонажи - как они взаимодействуют с миром? Может ли место содержать воду и характер? Если это так, возможно, мир состоит из локаций, и у каждой локации может быть стена, дверь или что-то еще, а также предметы и персонажи. Обратите внимание: если я напишу это так, кажется, что элемент принадлежит местоположению, а не местоположению элемента. Я бы сказал, что «на циновке есть кошка», а не «у кошки есть циновка под ней».

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

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объекты. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

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

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объекты. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

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

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объекты. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

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

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объекты. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

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

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объекты. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

Как все это работает вместе? В и ищите глаголы и существительные, как я сделал в предыдущем абзаце.

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объектов. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

Как все это работает вместе? В и ищите глаголы и существительные, как я сделал в последнем абзаце.

Теперь некоторые из ваших существительных станут объектами в программе, некоторые станут атрибутами других объектов. Глаголы будут действиями (т.е. методами). Но в любом случае будет легче подумать, если вы сначала рассмотрите то, что вы пытаетесь моделировать, вместо того, чтобы сразу переходить к программному обеспечению.

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

Мне нравится следовать политике «скажи, не спрашивай», которая гласит, что вы приказываете объекту что-то сделать, а не просите его предоставить вам информацию для принятия решения. Таким образом, если поведение изменится, вам нужно будет изменить только объект, о котором идет речь. Для вашего примера это означает, что View обрабатывает событие нажатия клавиши (это происходит потому, что они обрабатываются NSControl ), и сообщает контроллеру, что это событие произошло. Допустим, View получает нажатие клавиши «стрелка влево», и контроллер решает, что это означает, что игрок должен двигаться влево. Я бы просто сказал игроку «двигайся влево» и позволил бы игроку разобраться, что происходит, когда движение влево означает столкновение со стеной или монстром.

Чтобы объяснить, почему я хочу сделать это таким образом, представьте, что вы добавляете в игру 1.1 возможность плавать. Теперь у игрока есть свойство ableToSwim , поэтому вам нужно сменить игрока. Если вы говорите игроку двигаться влево, вы обновляете его, чтобы он знал, что означает движение, оставшееся над водой, в зависимости от того, умеют ли они плавать. Если вместо этого Контроллер спрашивает игрока о движении влево и принимает решение, тогда Контроллер должен знать, чтобы спросить о способности плавать, и должен знать, что это означает возле воды. Как и любой другой объект контроллера в игре, который может взаимодействовать с игроком, как и контроллер в игре для iPhone; -).

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

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

17
ответ дан 29 November 2019 в 21:32
поделиться

Похоже, ваша главная проблема заключается в том, как все устроено во время запуска приложения. Многие люди зацикливаются на этом, потому что кажется, что происходит что-то волшебное, но позвольте мне посмотреть, смогу ли я сломать это.

  1. Приложение запускается пользователем
  2. C вызывается функция main ()
  3. main () вызывает NSApplicationMain ()
  4. NSApplicationMain () загружает MainMenu.nib (или другой наконечник, указанный в info.plist)
  5. Загрузка наконечника инициализирует все объекты, определенные в наконечнике (включая делегат приложения)
  6. Загрузка пера делает все соединения, определенные в пике.
  7. Загрузка пера вызывает awakeFromNib для всех только что созданных объектов
  8. -applicationWillFinishLaunching: вызывается в делегате приложения.
  9. NSApplication (или подкласс, указанный в Info.plist) инициализируется
  10. -applicationDidFinishLaunching: вызывается в делегате приложения.

Обратите внимание, что делегат приложения инициализируется ДО (под) класса NSApplication. Вот почему приложение (Will | Did) FinishLaunching: принимает уведомление, в отличие от NSApplication, делегатом которого оно является.

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

принимает уведомление в отличие от NSApplication, делегатом которого оно является.

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

принимает уведомление в отличие от NSApplication, делегатом которого оно является.

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

7
ответ дан 29 November 2019 в 21:32
поделиться

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

Все дело в том, что модели и представления должны быть повторно использованы. Классы модели должны работать с любым графическим интерфейсом (и, возможно, даже с консолью или командной строкой). Классы представлений должны иметь возможность использовать с другими похожими играми. Модели и представления должны быть полностью разделены.

Затем контроллер заполняет пробел. Он реагирует на ввод пользователя, просит классы модели выполнить определенный игровой ход и запрашивает представления, чтобы показать новую ситуацию. Не предполагается, что контроллер будет многоразовым. Это клей, который скрепляет игру. Контроллер гарантирует, что классы моделей и классы представлений остаются независимыми и могут использоваться повторно.

Кроме того, не пытайтесь сделать дизайн идеальным с самого начала. Не бойтесь провести рефакторинг в любое время. Чем быстрее будет исправлено плохое дизайнерское решение, тем меньше вреда оно нанесет. Проектирование всего заранее означает, что плохие дизайнерские решения вообще не будут исправлены, если вы не сделаете идеальный дизайн заранее, что просто непреодолимо даже с десятилетиями опыта.

Всегда помните третье правило дизайна системы X Window: «Единственное, что хуже обобщения на одном примере, - это вообще не обобщать никаких примеров»

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

Всегда помните третье правило дизайна системы X Window: «Единственное, что хуже обобщения на одном примере, - это вообще не обобщать никаких примеров»

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

Всегда помните третье правило дизайна системы X Window: «Единственное, что хуже обобщения на одном примере, - это вообще не обобщать никаких примеров»

4
ответ дан 29 November 2019 в 21:32
поделиться

Эта статья Введение в проектирование MVC с использованием C # может оказаться полезной. Хотя пример написан на C #, принцип должен применяться.

0
ответ дан 29 November 2019 в 21:32
поделиться

Для вашей игры модель будет включать такие вещи, как текущее положение персонажа, количество очков здоровья и другие значения, которые связаны с «состоянием» игры. Он будет уведомлять представление всякий раз, когда что-то меняется, чтобы представление могло обновиться. Представление было бы просто кодом, необходимым для отображения всего пользователю. Контроллер отвечает за реакцию на ввод данных пользователем и обновление модели, когда это необходимо.

Контроллер является центральным компонентом в этом, и он должен создавать экземпляр модели и представления.

Когда игрок нажимает клавишу, представление должно просто передать эту команду контроллеру, который решает, что делать.

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

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

0
ответ дан 29 November 2019 в 21:32
поделиться