воскресенье, 24 февраля 2013 г.

Урок 9. Как программировать на iOS - О парадигме MVC

Всем привет!

Кажется, самое время для нового урока.
В прошлых уроках мы говорили о языке Objective-C, о том, что все в нем - объекты, мы поговорили про то, как описывать свои объекты и так далее.

Сегодня мы поговорим о парадигме MVC - по сути, это такая организация кода, которую чаще всего придерживаются при разработке для iOS.


Итак, что такое MVC?

Теория


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

Но профессиональные программисты используют другой подход.
По сути, в любой программе любой код можно разделить на три части:
1) код, который отвечает за логику работы программы, так называемую "бизнес-логику".
например, в программа для управления расписанием автобусов, этот код должен понимать понятия "автобус", "водитель", "рейс", этот код должен уметь назначать водителей на рейсы, манипулировать данными по автобусам и т.д. - грубо говоря, это весь код, который мы используем для описания предметной области
2) код, отвечающий за вывод данных на экран - то есть код, который нарисует кнопочки, напишет все необходимые надписи и заполнит их фамилиями водителей, нарисует диаграммы и т.д., словом - код, отвечающий за отображение
3) код, который связывает пункты 1 и 2 и контролирует логику программы в зависимости от работы пользователя на экране (грубо говоря - нажал пользователь кнопочку, отрисованную на экране - и нам необходимо вызвать код, который добавил в базу нового водителя, нажал другую кнопочку - добавили автобус)

Разделение всего кода на три минимально зависящие от друг друга части, упомянутые выше - это и есть парадигма MVC, которая также расшифровывается как Model-View-Controller (Модель - Вид - Контроллер).

Модель "знает" бизнес-логику, Вид знает, как нарисовать данные на экране, Контроллер знает, что делать, если произошло то или иное событие (какой процесс в модели запустить, какие данные от нее запросить и передать для отображения виду).

Чем полезно данное разделение? Данное разделение полезно тем, что, например, если к вам пришел заказчик вашего приложения и попросил переделать те или иные виды отображения, то вы четко знаете, что вам придется только лезть в код "Вида" - поскольку вид слабо связан с моделью, то модель не пострадает и даже не будет знать, что код отображения изменился.
Или появился новый метод расчета зарплат водителям.
Вы лезете в модель, исправляете алгоритм - при этом, вы совершенно не трогаете ни контроллер, ни отображение - они не знают, что внутри модели что-то изменилось, поскольку они с ней слабо связаны.

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

Практика

Я обещал, что мы наконец-то начнем практиковаться - и я держу слово :)

Давайте применим наши знания и создадим настоящее MVC приложение - Калькулятор! :) Я знаю, что можно было бы создать что-нибудь покруче, но для начала и калькулятор пойдет.

Создайте новый проект в XCode - обычное Single View Application и назовите его Calculator.
Я делаю его для айфонов, но если есть желание - можете делать универсальное или для айпадов.
В данном проекте мы не будем использовать Story Boards, но будем использовать Automatic Reference Counting, чтобы доверить компилятору всю работу с памятью.
Юнит-тесты я также не включал.
Если вы не знаете, как создавать проект - советую обратиться к предыдущим урокам.

Итак, вот мой проект:

В этом уроке мы только создадим простейшую модель.
Для создания модели калькулятора, создайте класс CalculatorModel (в прошлом уроке я рассказывал, как создается класс).

Как я писал выше, модель должна содержать всю "бизнес-логику" приложения. В нашем случае, бизнес-логика ограничивается (по-крайней мере, для начала) сложением, вычитанием, умножением и делением двух чисел.
Но давайте подумаем, какие методы мы создадим?
С одной стороны, можно создавать четыре метода, в которые мы будем передавать два числа, а получать на выходе одно. С другой стороны - калькулятор работает не совсем так.
У калькулятора есть одно "активное" число, находящееся на экране. Затем, когда мы нажимаем знак (+, -, *, /), активное число "запоминается", а мы вводим новое число, жмем = и получаем результат. Далее мы можем либо начать ввод заново, очистив текущее число, либо нажать знак и ввести новое число.


К сожалению, на этом я прерву урок - больше написать не успеваю, но уж лучше делать чаще и понемного, чем редко, но много)
В следующем уроке мы подробно разберем код модели калькулятора и задизайним его.
Кстати, если хотите развлечься - можете открыть ваш ViewController.xib и нарисовать с помощью кнопок UIButton интерфейс нашего будущего калькулятора - на нем надо разместить кнопки 0-9, +, -, *, /, =, Clear (для очистки).

До новых встреч!

Комментариев нет:

Отправить комментарий