Слайд 1Программирование
на ЭВМ
Лекция 7. Основные методологии программирования. Модульное программировние
Доцент, к.
т. н. Исаев А. В.
avisz@yandex.ru
Ауд. 7 или 234
Слайд 2Основные современные методологии программирования
Структурное программирование;
Объектно-ориентированное программирование;
И другие
Слайд 3Структурное программирование
Структурное программирование — методология разработки программного обеспечения, в основе
которой лежит представление программы в виде иерархической структуры блоков. Предложена
в 70-х года XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.
В соответствии с этой методологией, любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:
последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).
В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде подпрограмм (процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется команда вызова подпрограммы. При выполнении такой команды (инструкции) выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы.
Слайд 4Структурное программирование
Следование принципам структурного программирования сделало тексты программ, даже довольно
крупных, нормально читаемыми. Серьёзно облегчилось понимание программ, появилась возможность разработки
программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты. Это позволило разрабатывать достаточно крупные для того времени (1970-е гг.) программные комплексы силами коллективов разработчиков, и сопровождать эти комплексы в течение многих лет, даже в условиях неизбежной ротации кадров.
Слайд 5Структурное программирование
Основные достоинства структурного программирования:
Структурное программирование позволяет значительно сократить число
вариантов построения программы по одной и той же спецификации, что
значительно снижает сложность программы и, что ещё важнее, облегчает понимание её другими разработчиками;
В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные — дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой);
Сильно упрощается процесс тестирования и отладки структурированных программ.
Слайд 6Объектно-ориентированное программирование
Объектно-ориентированное программирование (ООП) — методология программирования, в которой основными
являются понятия объектов и классов.
Основные концепции объектно-ориентированного подхода:
Система состоит из объектов;
Объекты
некоторым образом взаимодействуют между собой;
Каждый объект характеризуется своим состоянием и поведением;
Состояние объекта задаётся значением полей данных;
Поведение объекта задаётся методами.
Кроме того, в современном объектно-ориентированном программировании часто большое значение имеют понятия события (так называемое событийно-ориентированное программирование) и компонента (компонентное программирование).
Слайд 7Объектно-ориентированное программирование
Языки объектно-ориентированного программирования принято делить на объектные, в которых
существуют классы и объекты, и собственно объектно-ориентированные, в которых программист
может не только пользоваться предопределёнными классами, но и задавать собственные пользовательские классы.
Объектное и объектно-ориентированное программирование возникло в результате развития идеологии структурного программирования, где данные и подпрограммы их обработки формально не связаны.
Объектно-ориентированное программирование в настоящее время является абсолютным лидером в области прикладного программирования (языки Java, C#, C++, JavaScript и др.). В то же время в области системного программирования до сих пор лидирует парадигма процедурного программирования.
Слайд 8Модульное программирование
Модульное программирование – это организация программы как совокупности небольших
независимых блоков, называемых модулями.
Использование модульного программирования позволяет упростить тестирование программы
и обнаружение ошибок.
Основным принципом модульного программирования является принцип «разделяй и властвуй».
Слайд 9Основные принципы модульного программирования
Основной принцип программного модуля сформулировал Д. Парнас
(D Parnas):
Для написания одного модуля должно быть достаточно минимальных
знаний о тексте другого
Таким образом, была выдвинута концепция скрытия информации (information hiding) в программировании. Для реализации этой концепции и были разработаны модули, основной особенностью которых является неподверженность влиянию глобальных переменных.
Изначально предполагалось, что при реализации сложных программных комплексов модуль должен использоваться наравне с процедурами и функциями как конструкция, объединяющая и надежно скрывающая детали реализации определенной подзадачи.
Слайд 10Основные принципы модульного программирования
Общее количество модулей, используемых в программе, должно
определяться декомпозицией поставленной задачи на независимые подзадачи.
В предельном случае
модуль может использоваться даже для заключения в него всего лишь одной процедуры, если необходимо, чтобы выполняемое ею локальное действие было гарантировано независимым от влияния других частей программы при любых изменениях.
Слайд 11Program primer;
Uses
modul1, modul2, modul3
…
{в программе
можно использовать
процедуры и функции, описанные
в подключенных модулях}
Unit modul1;
{описание процедур, функций}
Unit modul2;
{описание процедур, функций}
Unit modul3;
{описание
процедур, функций}
Слайд 12Место модулей в технологии разработки программного проекта
Слайд 13Модули в Pascal
Подключаемый модуль — это файл, содержащий исходный текст
на языке Pascal, имеющий определенную структуру, предназначенный для использования как
в главной программе, так и в других подключаемых модулях.
Слайд 14Общая структура модуля
Общая структура модуля в Pascal:
unit ;
interface
implementation
end.
Структурно в
подключаемом модуле можно выделить три раздела:
1) Интерфейсный раздел interface (должен
быть объявлен, но может быть пустым);
2) Раздел реализаций implementation (должен быть объявлен, но может быть пустым);
3) Тело модуля, заключенное между словами begin и end. (может отсутствовать).
Слайд 15Модули в Pascal
Имя модуля должно совпадать с именем файла, в
который помещается исходный текст модуля. Если, например, есть заголовок модуля
unit
primer;
то исходный текст этого модуля должен размещаться на диске в файле primer.pas (или с другим расширением, в зависимости от типа компилятора Pascal).
Слайд 16Общая структура модуля. Интерфейсный раздел
Интерфейсный раздел — область модуля, начинающаяся
с ключевого слова interface, которая может содержать:
- список подключаемых модулей;
-
константы;
- пользовательские типы данных;
- переменные;
- прототипы процедур и функций,
доступные из места подключения данного модуля (программы или другого модуля).
Основное назначение интерфейсного раздела — определять общедоступные данные/функционал для применения из программы или модуля, использующих данный модуль.
Замечание 1: Переменные, объявленные в интерфейсном разделе, являются глобальными — то есть доступны в любом месте программы, к которой подключен данный модуль, в том числе в разделе реализации самого модуля.
Замечание 2: Как и в программе, вышеперечисленные секции (объявления констант, переменных и др., за исключением секции uses) в данном разделе могут быть расположены в любой последовательности и в любом количестве.
Замечание 3: Если в данном разделе объявляются прототипы (предварительные объявления, без подробного описания) процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation.
Слайд 17Общая структура модуля.
Раздел реализаций
Раздел реализаций — область подключаемого модуля,
начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если
таковое имеется) или ключевым словом end с точкой, означающим конец модуля.
Основное назначение раздела реализаций: реализация процедур и функций, описанных ранее в секции interface.
Замечание: при реализации процедур и функций, описанных в интерфейсной секции, их заголовки могут быть описаны в сокращенной форме (исключение — PascalABC: при использовании переменных).
Слайд 18Общая структура модуля.
Тело модуля
Тело модуля — необязательная область подключаемого
модуля, образуемая парой ключевых слов begin и end. В теле
модуля можно размещать программный код аналогично главной программе.
Если тело модуля отсутствует, то ключевое слово begin не пишется.
Основное назначение тела модуля: инициализация переменных модуля, выделение ресурсов, необходимых для его работы и т. д.
Слайд 19Использование модуля
Использование модуля заключается в его подключении к программе или
другому модулю в разделе uses:
Uses ;
— список
модулей, с которыми устанавливается связь; имена модулей в списке перечисляются через запятую.
Если в программе (или в модуле) используются модули, то часть uses <список модулей> должно стоять сразу после заголовка программы , т. е. должно открывать раздел описаний основной программы.
В модулях Паскаля могут использоваться другие модули. В модулях предложение uses <список модулей> может стоять сразу после слова interface или сразу после слова implementation. Допускается и два предложения uses, т. е. оно может стоять и там, и там.
Слайд 20Дополнительные разделы модуля
Компиляторы Free Pascal (используемый, в частности, в среде
Lazarus), Pascal ABC, Pascal ABC.Net допускают в описании модулей, помимо
перечисленных выше разделов, еще два раздела:
раздел инициализации (начинается со слова initialization)— область модуля, размещаемая после раздела реализаций implementation, заканчивающаяся разделом финализации finalization, если
таковой имеется, или ключевым словом end с точкой, назначение аналогично телу модуля.
раздел финализации (начинается со слова finalization) — область модуля, размещаемая по окончании раздела инициализации initialization, если таковой имеется, или по окончании раздела реализаций implementation, и заканчивающаяся ключевым словом end с точкой. Основное назначение: освобождение ресурсов, выделенных для работы модуля.
Слайд 21Компиляция модулей
Каждый подключаемый модуль компилируется отдельно, а результат компиляции зависит
от используемого компилятора.
Компиляция в Turbo Pascal.
Результат компиляции — *.tpu -
файл (Turbo Pascal Compiled Unit).
Компиляция в Free Pascal.
Результат компиляции — два файла: *.ррu — файл, содержащий интерфейсную часть модуля, и файл *.о — объектный файл, содержащий часть реализаций, причем последний необходим для компоновки приложения.
Компиляция в Pascal ABC. Net.
В отличие от перечисленных выше, Pascal ABC.Net в процессе компиляции модуля не генерирует код на машинном языке. Компилятор данной среды завершает свою работу после выполнения семантического анализа, сохраняя семантическое дерево модуля в промежуточный формат — *.рсu - файл, который в первом приближении можно считать результатом компиляции с обозначенными ограничениями.
Слайд 22Ускорение компиляции программ
На этапе компоновки приложения компоновщик собирает исполняемый модуль,
принимая на вход объектные модули. Таким образом, имея уже откомпилированные
подключаемые модули, компиляция программ с их использованием ускоряется, так как они уже обработаны. Данное справедливо для Turbo и Free Pascal.
В Pascal ABC.Net ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ.
Вывод: откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.
Слайд 23Пример модуля
unit Mymatem;
Interface // интерфейсный раздел
function pwr(a,b:real):real;//объявляем «прототипы» подпрограмм модуля
function
tg(a:real):real;
Implementation // раздел реализаций
function power(a,b:real):real; //расписываем каждую из объявленных подпрограмм
begin
if (a=0) and (b=0) then power:=1 else
if a=0 then power:=0 else
if (a<0) and (not odd(round(b))) then power:=exp(b*ln(abs(a))) else
if (a<0) and (odd(round(b))) then power:=-exp(b*ln(abs(a))) else
if a>0 then power:=exp(b*ln((a)))
end;
function tg(a:real):real;
begin
if cos(a)=0 then writeln('Error!') else
tg:=sin(a)/cos(a);
end;
end. // конец модуля. Слово end. (с точкой) пишется в конце модуля, даже если перед ним не было слова begin!!!
Слайд 24Пример программы, использующей написанный модуль
program project1;
uses
mymatem;//подключаем наш модуль к
программе
var
a,b:real;
begin
writeln('Vvedite a,b:');
readln(a,b);
writeln(power(a,b));//и используем
функцию из модуля!
writeln('Vvedite ugol v radianah:');
readln(a);
writeln(tg(a));//и используем другую функцию из модуля!
readln;
end.