В предлагаемом материале рассмотрены следующие положения:
- ооновные свойства шаблона проектирования MVC;
- три составляющих его слоя;
- их взаимодействие между собой и с внешней средой;
- отличительные особенности реализации веб приложений;
- преимущества шаблона.
Предлагаемый материал имеет своей целью рассмотрение в историческом аспекте тех тенденций в программировании, которые обеспечили предпосылки для возникновения объектно-ориентированного программирования.
Его изучение будет способствовать выполнению следующих задач:
Формированию представления об особенностях эволюции типов данных.
Формированию представления о некоторых парадигмах программирования - предшественницах объектно-ориентированного программирования.
Формированию понимания причин, лежащих в основе развития типов данных и смены парадигм
программирования, что, в конечном итоге, привело к возникновению объектно-ориентированного программирования.
Замечание
Данный обзор не претендует на полноту; напротив, из всего исторического
многообразия отобраны лишь те тенденции и явления, которые, по мнению автора, имеют важное значение для понимания закономерности появления ООП.
Эволюция типов данных
Простые типы
Простые, или скалярные, типы (целые и
вещественные числа, логические значения, символы) были доступны уже в самых ранних языках программирования, так как эти типы данных непосредственно поддерживались компьютерами на встроенном уровне. Однако, по мере возрастания сложности задач, которые ставились перед программистами, и увеличением объема данных (особенно, сходных, обрабатываемых единообразно) становилась все более заметной ограниченность этих типов, связанная с тем, что скалярная величина представляет только одно значение.
Действительно,
для того, чтобы задать значения десяти (пятидесяти, ста) переменным нужно было десять (пятьдесят, сто) раз ввести в программу команду присвоения; чтобы возвести эти переменные в квадрат - десять (пятьдесят, сто) раз ввести команду умножения переменной на саму себя; чтобы напечатать результат - столько же раз ввести команду вывода на печать... А если таких переменных были тысячи или десятки тысяч?
Составные
типы
Для облегчения обработки значительных объемов сходных данных достаточно скоро в языки программирования была введена поддержка составных типов - разного рода массивов, структур, объединений, списков и т. п. Средства языка обеспечивали выборочный доступ к отдельным элементам (если это не противоречило свойствам самого типа) и пакетную обработку всех элементов. Это значительно повысило эффективность программирования, но для нас представляет интерес тот момент, что составной тип является
своего рода оболочкой, контейнером для входящих в него элементов, как бы изолируя их от остальной массы данных. Тем самым наметилась определенная тенденция к структуризации данных.
Типы, определенные пользователем
Еще большую гибкость в работе с данными обеспечила появившаяся в некоторых языках возможность объявлять свои собственные типы данных. Хоть эти пользовательские типы и
базировались на стандартных, но примечательным является сам факт снятия жестких рамок, задаваемых при создани языка.
Парадигмы программирования
Последовательное программирование
Первые языки программирования были практически лишены средств
управления потоком выполнения команд. Заданные при написании программы команды выполнялись последовательно одна за другой, и только иногда эта монотонная последовательность нарушалась оператором безусловного (GOTO) или условного (IF GOTO) перехода на определенную строку программы. Весь командный код воспринимался как единый однородный блок.
Безусловно, с ростом сложности и объема решаемых задач такой стиль программирования стал вызывать серьезные проблемы.
Вынужденное использование множества команд перехода приводило к возникновению запутанных цепочек вычислений, в которых подчас было трудно разобраться самому автору программы, не говоря уже о его коллегах. Отладка и сопровождение программ также становилось все более проблематичными.
Структурное программирование
В начале 70-х был предложен иной стиль программирования. Он предполагал
использование контрольных структур ветвления (if..then..else..endif), выбора (switch..case) и повторения (while, for). Одновременно резкой критике было подвергнуто использование оператора GOTO.
Использование нового стиля привело к заметной структуризации кода, облегчило написание, отладку и сопровождение программ.
Функциональное программирование
Если использование контрольных структур обеспечило низкоуровневую структуризацию программного кода, то функции открыли путь к структуризации высокого уровня.
Существенным является отделение пространства данных функций от глобального. Переменные, объявленные внутри функции, не видны ни из других функций, ни из остальной программы.
Модульное программирование
Еще один способ высокоуровневой структуризации - разбиение программного кода на отдельные части (модули). Каждый модуль хранится в отдельном файле. Примечательно, что пространство модуля является локальным уже не только для данных, но даже и для функций. Функции и переменные одного модуля не доступны из других модулей, если только они не будут специально объявлены как глобальные.
Модульность позволила собрать вместе взаимосвязанные между
собой данные и обрабатывающие их части кода, в то же время изолировав их от других данных и кода. Тем самым удалось обеспечить более высокую надежность программ. В частности, снималась проблема случайного совпадения имен переменных и функций при разработке больших приложений коллективом программистов.
Объектно-ориентированное программирование
Таким образом,
в программировании сформировалась отчетливая тенденция к структуризации путем все более тесного объединения взаимосвязанных данных и фрагментов кода в одном блоке при все большем отделении таких блоков друг от друга. В конечном итоге, эта тенденция привела к возникновению объектно-ориентированного программирования, которое в 90-х годах заняло господствующее положение.
С точки зрения ООП, программа представляет собой набор взаимодействующих объектов, моделирующих реальные предметы и явления. Каждый объект
обладает определенными свойствами (так называются принадлежащие объекту переменные) и располагает набором методов (функций) для манипулирования этими свойствами.
Например, объект "Служащий" может обладать следующими свойствами: "фамилия", "имя", "отдел", "должность", "оклад"; а также методами: "прочитать имя и фамилию", "перевести в другой отдел", "выплатить зарплату", "уволить" и т. п.
В развитых языках, реализующих парадигму ООП, доступ к переменным и функциям разграничивается.
Например, некоторые переменные и методы могут быть доступны извне класса (из глобального контекста и из объектов других классов), другие - только из методов самого объекта и т. д.
Контрольные вопросы и задания
Займемся повторением.
Сколько составных типов поддерживает PHP?
Защищены
ли элементы массивов в PHP от случайного изменения?