КЛАССИЧЕСКИЕ МЕТОДЫ ПРОЕКТИРОВАНИЯ ПРОГРАММ КАК СОСТАВИТЬ МОДУЛЬНУЮ ПРОГРАММУ

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

Дост-ва:
1) Упрощение
разработки и реализации программ.
2) Облегчение
чтения программ.
3) Упрощения
настройки и модификации программ.
4) Облегчение
работы с данными, имеющими сложную
структуру.
5) Исключение
чрезмерной детализации алгоритмов.

Недост-ки:
1) Модульность
требует большей дополнительной работы
программиста и определенных навыков
проектирования программ.

Методы дел на 3
группы:

На практике обычно
применяются различные сочетания этих
методов.

Нисходящее проектирование программ и его стратегии. Стратегия, основанная на использовании псевдокода. Достоинства и недостатки. Пример.

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

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

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

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

Существуют
различные способы реализации пошагового
уточнения. В данном учебном пособии
рассмотрены два из них:

1) кодирование
программы с помощью псевдокода и
управляющих
конструкций структурного
программирования;

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

программы
обеспечивало читабельность всей
программы.

Преимущества
метода пошагового уточнения:

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

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

Пусть программа
обрабатывает файл дат. Необх отделить
правильные даты от неправильных,
отсортировать правильные даты, перенести
летние и зимние даты в выходной файл и
вывести исправленные даты.

Первый этап
пошагового уточнения. Задается
заголовок программы, соответствующий
ее основной функции.

Второй этап
пошагового уточнения

Третий этап
пошагового уточнения.

Под модуляризацией понимается разделение
программы на части по некоторым
установленным правилам.

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

Признаки модульности программы:

Достоинства модульного проектирования:

Методы проектирования модульных программ
делятся на 3 группы:

1.методы нисходящего проектирования.

2. Методы расширения ядра.

3. Методы восходящего проектирования.

Служить средством разбиение большой
задачи на меньшие подзадачи так, чтобы
каждую задачу можно было рассматривать
независимо.

Суть метода: в начальном шаге в соответствии
с функцией всей программы продумывается
общая структура всего алгоритма без
детальной обработки его отдельных
частей.

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

Метод основан на двух стратегиях:

При пошаговом уточнении на каждом
следующем этапе декомпозиции определяются
программные фрагменты очередного более
низкого уровня.

Существуют 2 способа реализации пошагового
уточнения:

Кодирование программы с помощью
псевдокода и управляющих конструкций
структурного программирования

Общее правило записи текста программы:

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

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

1 этап: programобработка_пакетов;

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

Преимущества метода пошагового уточнения:

Использование комментариев для
описания обработки данных.

Существуют следующие виды комментариев.

4-5 строк комментария заголовка на каждую
подпрограмму или блок и по 1 комментарию
на каждые 2-3 строки исходного текста
для построчных комментариев.

Про ГИС СОЛО:  Молотычевская школа электронный журнал

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

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

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

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

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

Модуль является одним из средств, облегчающих верификацию программ. Модуль, как средство создания абстракции, выделяет спецификацию и локализует сведения о реализации.

Модули служат также целям создания проблемно-ориентированного контекста и локализации машинной зависимости.

Концепция модульного программирования

Концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений:

·Функциональная декомпозиция задачи- разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач — модулей. Модули связаны между собой только по входным и выходным данным.

·Модуль — основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой «черный ящик» с одним входом и одним выходом. Модульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение. Дополнительно модульный подход позволяет разрабатывать части программ одного проекта на разных языках программирования, после чего с помощью компоновочных средств объединять их в единый загрузочный модуль.

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

Назначение всех переменных модуля должно быть описано с помощью комментариев по мере их определения.

Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.

В соответствии с данной методологией:

-Последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

-Ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

-Цикл— многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

Разработка программы ведётся пошагово, методом «сверху вниз».

Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «затычки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.

Про ГИС СОЛО:  НАПРАВЛЕНИЯ РАЗВИТИЯ ВОСПИТАНИЯ ДО 2025 ГОДА

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

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

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

Теорема о структурном программировании

Любую схему алгоритма можно представить в виде композиции вложенных блоков begin и end, условных операторов if, then, else, циклов с предусловием (while) и может быть дополнительных логических переменных (флагов).

Эта теорема была сформулирована итальянскими математиками К. Бомом и Дж. Якопини в 1966 году и говорит нам о том, как можно избежать использования оператора перехода goto.

Достоинства структурного программирования:

Объектно-ориентированное программирование (сокращенно ООП) является методом программирования, имитирующим то, как человек выполняет какую-либо работу. Объектно-ориентированное программирование — результат естественной эволюции более ранних методологий программирования: оно более структурировано и более модульное и абстрактное, чем традиционное программирование. Эта технология является по существу прагматическим воплощением к 1980 году идеи абстрактных типов данных как идеальной основы в программной индустрии в наше время.

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

Основные признаки характеризуют объектно-ориентированную технологию программирования:

Первым «настоящим» объектно-ориентированным языком программирования принято считать Смолтолк, разработанный в лаборатории компании Ксерокс. Затем появились и другие ОО языки (Си++, Паскаль, CLOS, Эйффель, Java и др.).

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

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

Объектно-ориентированное проектирование состоит в описании структуры и поведения проектируемой системы, то есть, фактически, в ответе на два основных вопроса:

— Из каких частей состоит система;

— В чём состоит ответственность каждой из частей.

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

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

Про ГИС СОЛО:  КУРСКАЯ ВОЛОСОВСКАЯ РАЙОННАЯ ШКОЛА

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

Компонентное программирование — следующий этап развития ООП; прототип- и класс — ориентированное программирование — разные подходы к созданию программы, которые могут комбинироваться, имеющие свои преимущества и недостатки.

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

Прототипное программирование, сохранив часть черт ООП, отказалось от базовых понятий — класса и наследования.

— Вместо механизма описания классов и порождения экземпляров язык предоставляет механизм создания объекта (путём задания набора полей и методов, которые объект должен иметь) и механизм клонирования объектов.

— Каждый вновь созданный объект является «экземпляром без класса». Каждый объект может стать прототипом — быть использован для создания нового объекта с помощью операции клонирования. После клонирования новый объект может быть изменён, в частности, дополнен новыми полями и методами.

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

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

Соответственно в языках, основанных на понятии «класс», все объекты разделены на два основных типа — классы и экземпляры. Класс определяет структуру и функциональность (поведение), одинаковую для всех экземпляров данного класса. Экземпляр является носителем данных — то есть обладает состоянием, меняющимся в соответствии с поведением, заданным классом. В класс — ориентированных языках новый экземпляр создаётся через вызов конструктора класса (возможно, с набором параметров). Получившийся экземпляр имеет структуру и поведение, жёстко заданные его классом.

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

Как правило, объектно-ориентированный язык (ООЯ) содержит следующий набор элементов:

— Объявление классов с полями (данными — членами класса) и методами (функциями — членами класса).

— Механизм расширения класса (наследования) — порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка. Большинство ООЯ поддерживают только единичное наследование.

— Полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов.

— Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООЯ все методы классов являются виртуальными.

Некоторые языки добавляют к указанному минимальному набору те или иные дополнительные средства. В их числе:

— Конструкторы, деструкторы, финализаторы.

— Свойства (аксессоры).

— Средства управления видимостью компонентов классов (интерфейсы или модификаторы доступа, такие как public, private, protected, feature и др.).

Одни языки отвечают принципам ООП в полной мере — в них все основные элементы являются объектами, имеющими состояние и связанные методы. Примеры подобных языков — Smalltalk, Eiffel. Существуют гибридные языки, совмещающие объектную подсистему в целостном виде с подсистемами других парадигм как «два и более языка в одном», позволяющие совмещать в одной программе объектные модели с иными, и размывающие грань между объектно-ориентированной и другими парадигмами за счёт нестандартных возможностей, балансирующих между ООП и другими парадигмами (таких как множественная диспетчеризация, параметрические классы, возможность манипулировать методами классов как самостоятельными объектами, и др.). Примеры таких языков: CLOS, Dylan, OCaml, Python, Ruby, Objective-C. Однако, наиболее распространены языки, включающие средства эмуляции объектной модели поверх более традиционной императивной семантики. Алан Кэй назвал такие языки «склеиванием возможностей» (англ. agglutination of features) в противовес «чистоте стиля» (англ. crystalization of style) языков, воплощающих некую парадигму непосредственно. Примеры таких языков — Симула, C++, Visual Basic, Delphi, Модула, Модула-2, Java, C#, PHP.

Оцените статью
ГИС Соло