Модульное программирование – это организация программы как совокупности небольших независимых блоков (модулей), структура и поведение которых подчиняется определенным заранее правилам.
Модулем (в модульном программировании) называется множество взаимосвязанных подпрограмм (процедур) вместе с данными, которые эти подпрограммы обрабатывают.
Модульное программирование предназначено для разработки больших программ.
Разработкой больших программ занимается коллектив программистов. Каждому программисту поручается разработка некоторой самостоятельной части программы. И он в таком случае отвечает за конструирование всех необходимых процедур и данных для этих процедур. Сокрытие данных (запрет доступа к данным из-за пределов модуля) предотвращает их случайное изменение и соответственно нарушение работы программы. Для взаимодействия отдельных частей (модулей) программы коллективу программистов необходимо продумать только интерфейс (взаимодействие) сконструированных модулей в основной программе.
Напомним понятие и структуру модуля в терминах языка Pascal.
Модуль (unit) – программная единица, текст которой компилируется независимо (автономно).
Модуль содержит 4 раздела: заголовок, интерфейсная часть (раздел объявлений), раздел реализации и раздел инициализации.
UNIT <имя модуля>; {заголовок}
INTERFACE {интерфейсная часть}
Uses <используемые модули>;
Const <объявления глобальных констант>;
Type <объявления глобальных типов>;
Var <описание глобальных переменных>;
Procedure <заголовки(!) доступных процедур>;
. . .
Function <заголовки(!) доступных функций>;
. . .
IMPLEMENTATION {раздел реализации}
Uses <используемые при реализации модули>;
Const <объявления скрытых (локальных) констант>;
Type <объявления скрытых (локальных) типов>;
Var <описание скрытых (локальных) переменных>;
Procedure <тела(!) скрытых (локальных) процедур>;
. . .
Function <тела(!) скрытых (локальных) функций>;
BEGIN
<основной блок модуля = раздел инициализации>
END.
Замечание. Различие всех описаний, содержащихся в разделах интерфейса и реализации, заключается в сфере их использования. В интерфейсном разделе – внешние описания, в разделе реализации – внутренние.
Объектно-ориентированное программирование (ООП)
Чтобы написать еще более сложную программу, необходим новый подход к программированию – технология объектно-ориентированного программирования.
OOП включает лучшие идеи, воплощённые как в структурном программировании, так и в модульном. «Является еще более структурным программированием, еще более модульным» (Джеф Дантеманн?).
И, кроме того, ООП сочетает старые принципы с мощными новыми концепциями, которые позволяют оптимально организовывать программы.
Объектно-ориентированное программирование позволяет разложить проблему на составные части. Каждая составляющая становится самостоятельным объектом, содержащим свои собственные коды и данные, которые относятся к этому объекту. В этом случае программирование в целом упрощается, и программист получает возможность оперировать гораздо большими по объёму программами.
Таким образом, ООП – «это методология, основанная на представлении программы в виде совокупности объектов, каждый из которых является реализацией собственного класса» (А.Д. Александровский).
Основным понятием ООП является понятие класса.
Класс – множество объектов, связанных общностью структуры и поведения (класс содержит описание структуры и поведение всех объектов, связанных отношением общности). Любой объект является экземпляром класса.
Методом называется процедура или функция, определенная внутри класса.
Базовые принципы ООП
ООП характеризуется тремя базовыми принципами:
Инкапсуляция
Наследование
Полиморфизм
Инкапсуляция представляет собой комбинирование данных (записи, структуры) с процедурами и функциями для получения нового типа данных.
Здесь проводится аналогия с физическими объектами. Конкретные физические свойства определяются данными различных типов. Кроме того, любой физический объект характеризуется и своим поведением во внешнем мире. Поведение объекта задается процедурами и функциями.
Итак, инкапсуляция означает, что методы (коды) и данные одновременно представлены в одной и той же структуре.
Например,
Type
Coordinates = class
x, y : byte;
procedure Init (Xinit, Yinit: byte);
function GetX : byte;
function GetY : byte;
end;
Наследование служит для использования однажды определенного класса в построении целой иерархии производных классов, каждый из которых наследует доступ к данным и методам работы с ними всех своих «родителей».
То есть, можно построить иерархию классов, которая выражает родословное дерево классов. Классы организованы в единую древовидную структуру с общим корнем. Свойства и методы определенного класса автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
Таким образом, наследование – это особенность ООП, посредством которой класс может быть определен как расширение уже существующего класса.
Например,
Type
Cursor = class (coordinates)
Hidden : Boolean;
end;
Здесь класс «курсор» наследует все свойства и методы предварительно описанного класса «координаты», т.е. для него определены координаты x, y, а также методы «инициализация», «определить координату х», «определить координату y» (см. выше описание класса «координаты»). Кроме того, класс «курсор» обладает собственным методом - «быть невидимым».
Наследование позволяет различным типам данных совместно использовать один и тот же код, приводя к уменьшению его размера и повышению функциональности.
Полиморфизм – это придание действию (методу) одного имени, которое совместно используется объектами всей иерархии класса, причем каждый объект реализует это действие своим собственным, подходящим для него образом.
Другими словами, полиморфизм – это использование одинаковых имен методов на разных уровнях иерархии классов.
Достоинства ООП
С помощью уменьшения взаимозависимости между компонентами программного обеспечения ООП позволяет разрабатывать системы, пригодные для многократного использования. Такие компоненты могут быть созданы и отлажены как независимые программные единицы.
Несколько слов об использовании технологии ООП в среде Delphi на языке Object Pascal.
Для разработки приложений в Delphi используются специальным образом оформленные классы – компоненты.
Компонент обладает набором свойств и методов. Свойства компонента изменяются либо на этапе сборки приложения (под воздействием системы), либо программно, в процессе работы приложения (под воздействием пользователя).
Особым видом свойства компонента является событие. Процедура обработки события – это реакция приложения на изменение свойства компонента под воздействием системы или пользователя (нажатие клавиши, перемещение курсора и т.п.)
В Object Pascal объекты существуют только в динамической памяти (т.е. переменная, являющаяся объектом, по сути является указателем на объект, и содержит адрес объекта).