Модульное проектирование программ
Информатика. Основы объектно-ориентированного программирования. Конспект лекций: учеб. пособие / В. Ю Наумов, Л. Г. Акулов, О. А. Авдеюк, Е. С. Павлова; ВолгГТУ. – Волгоград, 2013. – 249 с.
Содержит начальные сведения по основам объектно-ориентированного программирования. В качестве основного языка программирования выбран С++.
Ил. 115. Табл. 10. Библиогр.: 8 назв.
технический университет, 2013.
В. Ю. Наумов, О. А. Авдеюк, 2013
1. Модульное проектирование программ.. 5
2. Основные возможности C++. 8
3. C++ как Си с классами. 17
4. Определение класса. 19
5. Сокрытие информации. 20
6. Описание член-функций. 22
7. Неявный указатель this 23
8. Конструкторы.. 24
9. Деструктор. 28
10. Пример программы с использованием классов. 30
11. Статические члены класса. 32
12. Объектно-ориентированное программирование. 33
13. Наследование. 36
14. Наследование и доступность. 41
#Архитектура приложения и кода
15. Композиция. 49
16. Динамическое связывание. 52
17. Виртуальные функции. 55
18. Дружественные функции. 61
19. Перегрузка операций. 64
20. Перегрузка операции присваивания. 68
21. Программа для работы с комплексными числами. 72
22. Перегрузка операций и преобразование типов. 74
23. Индексирование. 75
24. Функция operator() 77
25. Операция выбора элемента. 79
26. Перегрузка операций new и delete. 80
27. Ввод и вывод. 83
28. Ввод и вывод встроенных типов. 84
29. Состояние потока. 87
30. Ввод и вывод пользовательских типов. 91
31. Форматированный ввод. 92
32. Шаблоны функций. 98
33. Классы и шаблоны.. 106
Модульное проектирование программ
Модульной называют программу, составляемую из таких частей — модулей, что их можно независимо друг от друга программировать, транслировать, отлаживать (проверять, исправлять). Предполагается, что модули имеют небольшие размеры, четко определенные функции и, кроме того, их связи между собой максимально упрощены, в частности, предполагается, что модули имеют лишь одну точку входа (вначале модуля) и одну точку выхода. Разбиение программы на модули при ее написании позволяет существенно облегчить в дальнейшем работу над программой на других этапах.
После того как в алгоритме выявлены малозависимые друг от друга части, составление программы упрощается, так как при программировании каждой из этих частей почти не приходится заботиться об их взаимодействии с другими частями, что, в свою очередь, способствует уменьшению количества вносимых ошибок. Кроме того, малая зависимость модулей позволяет при необходимости существенно распараллелить составление программы, поручив программирование программистам разного класса, причем, всегда можно найти подходящую работу и для начинающих, и для опытных программистов.
На этапе отладки независимость модулей позволяет отлаживать их в любом порядке, в частности и одновременно. Считается, что усилия, затрачиваемые на отладку модуля, обычно пропорциональны квадрату его длины и поэтому при тестировании небольшие размеры модулей дают возможность поставить задачу о проверке всех ветвей таких модулей, что ведет к увеличению достоверности тестирования. Решение такой задачи является обычно недостижимым по отношению ко всей программе или крупным ее блокам, когда приходится ограничиваться лишь проверкой работы всех линейных участков блока и условий. Разумеется, и наиболее трудная часть отладки — локализация ошибок, проводимая для модулей, при этом значительно упрощается и ускоряется.
Основы программирования контроллеров за 5 минут
В силу минимальности логических связей между модулями облегчается внесение исправлений в алгоритм программы, поскольку меньше приходится заботиться о том, чтобы при изменении одной части программы не испортить работу другой ее части.
Замечание.Серьезной помощью в разработке программ могут стать библиотеки стандартных (типовых) модулей, заранее составленные автором или другими программистами. Применение при разработке ранее многократно опробованных модулей, трудность использования которых сводится только к заданию правильных аргументов, значительно ускоряет составление программы и облегчает ее отладку.
Программы разбивают на модули, чтобы:
1. упростить их разработку и реализацию;
2. облегчить чтение программ;
3. упростить их настройку и модификацию;
4. облегчить работу с данными, имеющими сложную структуру;
5. избежать чрезмерной детализации алгоритмов;
6. обеспечить более выгодное размещение программы в памяти ЭВМ.
1. Модуль — независимая программная единица, обеспечивающая отдельную от других модулей компиляцию.
2. Модуль должен реализовывать единственную функцию.
3. Модуль может вызывается по имени и, следовательно, обращаться к другому модулю.
4. Модуль имеет один вход и один выход.
5. Хороший модуль не использует глобальные переменные для общения с другим модулем, так как потом трудно отыскать, какой из них портит данные.
Подчиненность модулей удобно изображать схемой иерархии.
Рис.1 Схема иерархии.
Схема иерархии отражает только подчиненность модулей, но не порядок их вызова или функционирования программы. Схема иерархии обычно дополняется расшифровкой функций, выполняемых модулями.
Классификация строения программ.
Строение программ можно охарактеризовать следующим образом:
1. Монолитное. Программа написана цельным куском, без выделения каких-либо отдельных независимых частей.
2. Монолитно-модульное. Имеется достаточно большая монолитная главная часть программы, в которой производятся основные вычисления, и из которой происходят последовательные обращения к модулям.
3. Последовательно-модульное. Центральная часть программы состоит из последовательно выполняемых модулей, которые в свою очередь обращаются к другим модулям.
4. Иерархическое. Программа состоит из модулей, связи между которыми подчиняются строгой иерархии: каждый модуль может обращаться только к модулям, которые ему непосредственно подчинены. Возврат всегда должен происходить в вызывающий модуль, даже в том случае, если в вызываемом модуле обнаруживается ошибка, препятствующая дальнейшим вычислениям (правда, не все языки программирования имеют средства для выполнения этого требования).
5. Иерархически-хаотическое. Иерархическая (или последовательная) подчиненность модулей нарушена дополнительными связями.
6. Модульно-хаотическое. Программа состоит из модулей, но связи их между собой не отвечают принципу иерархии (или последовательности).
Последовательно-модульное и иерархическое (для более сложных программ) строение, как наиболее простые по логическим связям, являются теми образцами, к которым необходимо стремиться при разработке программы. Допустимыми вариантами являются иерархически-хаотическое и, может быть, монолитно-модульное.
Помимо модульности другим свойством, которое содействует предупреждению появления в программе ошибок, является структурированность.
Структурированной называется программа, логическая структура которой отвечает некоторым жестко установленным требованиям.
Уже модульную программу можно иногда считать в определенной степени структурированной, поскольку от модульной программы требуется, например, чтобы она состояла только из модулей с одним входом.
— разделяет работу между исполнителями;
— открывает возможности для дальнейших переделок программы.
Структурные программы можно изучать последовательно, читая небольшие сегменты (одностраничные) программного текста. Логика выполнения каждого фрагмента задана в тексте явно и может быть изучена путем чтения сверху вниз.
2. Основные возможности C++
Язык С++ полностью включает в себя язык Си со всеми его ключевыми словами и операциями. Библиотеки языка Си также могут быть подключены к программам написанными на С++.
Язык Си++ является расширением языка Си за счет возможности объектного программирования, поэтому язык Си++ является совершенно новым языком программирования по сравнению с Си. Также в Си++ включены новые возможности, не касающиеся объектного программирования, но делающие написание программ более удобным и комфортным.
1. Комментарии. Введен новый символ комментария //. Вся строка после него считается комментарием.
2. Константы. В C++ для определения символических констант вместо директивы #define рекомендуется использовать объявление переменной с начальным значением и ключевым словом const.
Пример.
Такая переменная не может быть изменена и может использоваться везде, где требуется константа:
3. Встраиваемые функции. В C++ для определения функции, которая должна встраиваться в текст программы, используется ключевое слово inline.
Пример.
inline double SUMMA (double a, double b)
При определении и использовании встраиваемых функций нужно придерживаться следующих правил:
— определение и объявление функции inline должны быть совмещены и располагаться перед первым вызовом этой функции;
— имеет смысл определять с ключевым словом inline только очень маленькие функции;
— ключевое слово inline является только рекомендацией компилятору, что данную функцию надо сделать встраиваемой. Компилятор сам решает, будет функция встраиваемой или нет. В частности компилятор BorlandC++ не разрешает использовать в inline-функциях операторы цикла.
4. Объявление структур, смесей и перечислений. В C++, в отличие от Си, имена типов структур, перечислений и смесей рассматриваются как полноценные типы, определенные пользователем.
Пример.
struct path list;
Тот же фрагмент на C++:
5. Объявление переменных. В C++ разрешено объявлять переменную в любом месте программы, где это необходимо. На объявление переменной накладывается лишь одно требование: переменная должна быть объявлена к моменту ее использования.
Пример.
Переменная видна только в том блоке, в котором объявлена.
6. Новые операции. C++ полностью унаследовал набор и приоритеты языка Си, кроме того, были введены новые операции, расширяющие возможность языка.
1) :: — операция разрешения области видимости, которая позволяет обратиться к глобальной переменной, если видима локальная переменная с тем же именем.
Пример.
printf (“i-строка=%s t i-целое=%d n”, i, ::i);
В результате выполнения программы получим:
i — строка = Hello i — целое =2
Так как эта операция нарушает модульность кода, то ее применение редко бывает оправдано и является плохой практикой. Основная причина ее введения — использование при организации классов.
2) В C++ для работы с динамической памятью введены две новые операции:
— операция new для распределения памяти;
— операция delete для освобождения памяти. Можно распределить память для одиночного объекта или массива объектов любого типа, в том числе и типа, определенного пользователем. Результатом выполнения будет указатель на отведенную память или нулевой указатель в случае ошибки.
Пример.
// Распределение одного элемента типа int
// Распределение массива из 20 элементов типа str
str *pstr=new str[20];
Память, полученная операцией new, будет распределена до тех пор, пока она не будет явно освобождена операцией delete, либо пока указатель не выйдет из области видимости.
Операция delete имеет формат:
delete указатель; // для одиночных переменных
delete []указатель; //для массивов
С помощью операции delete может быть освобождена только память, ранее распределенная операцией new.
Пример.
int *first = new int[5];
//Освобождение памяти из 5 элементов типа int
// Ошибка: mas не распределялась операцией new
7. Ссылки. В C++ введен новый тип данных – ссылка, который позволяет определить альтернативное имя переменной.
Синтаксис объявления ссылки:
Такое объявление фактически назначает переменной с именем «идентификатор1» второе имя «идентификатор2». Ссылка при объявлении всегда должна быть проинициализирована, и затем ее уже нельзя изменить.
Пример.
int // alt является ссылкой на а
Объявление ссылки напоминает объявление указателя, только вместо «*» используется «alt.
Ссылку можно рассматривать как постоянный указатель, который всегда разадресован, и потому для него не надо выполнять операцию разадресации «*». Ссылка не создает копии объекта, а является другим именем объекта.
8. Объявление функций. В языке Си объявление функции перед ее использованием было желательным, но не обязательным условием. В языке C++ все функции должны быть объявлены с полным списком типов формальных параметров и с указанием типа возвращаемого значения, т.е. должны иметь прототип. Компилятор C++ при вызове функции производит контроль на соответствие типов фактических аргументов формальным параметрам, а также преобразование аргументов к требуемому типу, если это возможно. В С++ объявления функций имеют ту же область видимости, что и переменные,. то есть, если функция объявлена в блоке, то это объявление локально для данного блока.
9. Передача аргументов функции по ссылке. Она может быть использована в двух случаях:
— для передачи в функцию больших структур, чтобы избежать копирования в стек;
— для передачи в функцию аргумента, который должен быть изменен функцией.
Можно для обоих случаев воспользоваться указателем, но его использование влечет за собой дополнительные расходы на разадресацию в функции и передачу адреса вместо самого фактического аргумента.
Пример.
void swap (int *a, int *b)
Источник: mydocx.ru
Структурное и модульное программирование
Структурное программирование — парадигма программирования, в основе которой лежит представление программы в виде иерархической структуры блоков.
По своей сути оно воплощает принципы системного подхода в процессе создания и эксплуатации программного обеспечения ЭВМ.
Структурное программирование воплощает принципы системного подхода в процессе создания и эксплуатации программного обеспечения ЭВМ. В основу структурного программирования положены следующие достаточно простые положения:
- алгоритм и программа должны составляться поэтапно (по шагам).
- сложная задача должна разбиваться на достаточно простые части, каждая из которых имеет один вход и один выход.
- логика алгоритма и программы должна опираться на минимальное число достаточно простых базовых управляющих структур.
Структурное программирование иногда называют еще «программированием без go to». Рекомендуется избегать употребления оператора перехода всюду, где это возможно, но чтобы это не приводило к слишком громоздким структурированным программам.
goto (перейти на) — оператор безусловного перехода (перехода к определённой точке программы, обозначенной номером строки либо меткой) в некоторых языках программирования. В некоторых языках оператор безусловного перехода может иметь другое имя (например, jmp в языках ассемблера).
Фундаментом структурного программирования является теорема о структурировании. Эта теорема устанавливает, что, как бы сложна ни была задача, схема соответствующей программы всегда может быть представлена с использованием ограниченного числа элементарных управляющих структур.
Базовыми элементарными структурами являются структуры: следование, ветвление и повторение (цикл), любой алгоритм может быть реализован в виде композиции этих трех конструкций.
Достоинства структурного программирования:
- повышается надежность программ (благодаря хорошему структурированию при проектировании, программа легко поддается тестированию и не создает проблем при отладке);
- повышается эффективность программ (структурирование программы позволяет легко находить и корректировать ошибки, а отдельные подпрограммы можно переделывать (модифицировать) независимо от других);
- уменьшается время и стоимость программной разработки;
- улучшается читабельность программ.
Модульное программирование
Модульное программирование является естественным следствием проектирования сверху вниз и заключается в том, что программа разбивается на части – модули, разрабатываемые по отдельности.
В программировании под модулем понимается отдельная подпрограмма, а подпрограммы часто называются процедурами или процедурами-функциями. Поэтому модульное программирование еще называется процедурным.
Модуль должен обладать следующими свойствами:
- один вход и один выход – на входе программный модуль получает определенный набор исходных данных, выполняет содержательную обработку и возвращает один набор результатных данных, т.е. реализуется стандартный принцип IPO (Input — Process — Output — вход-процесс-выход);
- функциональная завершенность – модуль выполняет перечень регламентированных операций для реализации каждой отдельной функции в полном составе, достаточных для завершения начатой обработки;
- логическая независимость – результат работы программного модуля зависит только от исходных данных, но не зависит от работы других модулей;
- слабые информационные связи с другими программными модулями – обмен информацией между модулями должен быть по возможности минимизирован;
- обозримый по размеру и сложности программный код.
Модули содержат определение доступных для обработки данных, операции обработки данных, схемы взаимосвязи с другими модулями.
Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки.
Принципы модульного программирования программных продуктов во многом сходны с принципами нисходящего проектирования: сначала определяются состав и подчиненность функций, а затем — набор программных модулей, реализующих эти функции.
Источник: it-black.ru
Разработка структуры программы и модульное программирование
Приступая к разработке каждой программы ПС, следует иметь в виду, что она является большой системой, поэтому нужно принимать меры для ее упрощения. Для этого программу разрабатывают по частям, которые называются программными модулями. Такой метод программирования называют модульным программированием.
Модуль — это самостоятельная часть программы, имеющая определенное значение и обеспечивающая заданные функции обработки автономно от других программных модулей. Каждый программный модуль программируется, компилируется и отлаживается отдельно от других модулей программы, и тем самым физически разделен с другими программными модулями. Каждый программный модуль может включаться в состав разных программ, если выполнены условия его использования, описанные в документации по ее использованию. Т.е. хорошо продуманный модуль позволяет избежать дублирования в программировании.
Любое ПС имеет свою структуру, которая разрабатывается для удобства:
- 1. разработки
- 2. программирования
- 3. отладки
- 4. внесения изменений
Также структуризация ПС позволяет:
- 1. распределить работы по исполнителям, обеспечив их загрузку и требуемые сроки разработки
- 2. построить календарные графики проектных работ и осуществлять их координацию в процессе создания ПИ.
- 3. контролировать трудозатраты и стоимость проектных работ.
При создании ПС выделяются многократно используемые модули, их типизируют и унифицируют, за счет чего сокращаются сроки и трудозатраты на разработку ПС в целом.
Некоторые ПС используют готовые модули из библиотек стандартных процедур, функций, объектов и методов обработки данных.
Типовая структура ПС:
носитель отладка программный модуль
Таблица. Типы модулей
Управляет запуском ПС (он в единственном числе)
Обеспечивает вызов других модулей, задает последовательность вызова на выполнение очередного модуля
Выполняют функции обработки
Осуществляют обслуживающие функции
- 1. один вход и один выход — на входе программный модуль получает определенный набор исходных данных, выполняет обработку данных и возвращает результат
- 2. функциональная завершенность — модуль выполняет перечень операций для реализации каждой отдельной функции в полном составе.
- 3. логическая независимость — результат работы модуля зависит только от исходных данных, и не зависит от работы других модулей.
- 4. слабые информационные связи с другими программными модулями — обмен информации между модулями должен быть по возможности минимизирован.
- 5. обозримый по размеру и сложности.
Каждый модуль состоит из спецификации и тела модуля.
Спецификация — правила использования модуля.
Тело — способ реализации процесса обработки.
Принцип модульного программирования ПС:
- 1. Определение состава и подчиненность функций
- 2. определение набора программных модулей, реализующих эти функции
При составлении алгоритма необходимо учитывать:
1. каждый модуль вызывается на выполнение вышестоящим модулем и закончив работу, возвращает управление вызвавшему модулю.
Методы разработки структуры программы.
В качестве модульной структуры программы принято использовать древовидную структуру, включая деревья со сросшимися ветвями. В узлах дерева размещаются модули, а стрелки показывают подчиненность модулей (т.е. в тексте модуля, из которого она исходит, имеется ссылка на модуль, в который она входит).
Модульная структура программы должна включать и совокупность спецификаций модулей, образующих эту программу. Спецификация программного модуля содержит:
- 1. синтаксическую спецификацию его входов, позволяющую построить обращение к нему на используемом языке программирования
- 2. функциональную спецификацию модуля (описание всех функций, выполняемых этим модулем).
Существуют разные методы разработки структуры программы. Обычно используют 2 метода:
- 1. Метод восходящей разработки
- 2. метод нисходящей разработки
Метод восходящей разработки.
Сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модулей самого нижнего уровня, в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке, в каком велось их программирование. На первый взгляд такой порядок разработки программы кажется вполне естественным: каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Не рекомендуется, т.к.:
- 1. для программирования какого-либо модуля совсем не требуется текстов, используемых им модулей — для этого достаточно, чтобы каждый используемый модуль был лишь специфицирован (в объеме, позволяющем построить правильное обращение к нему), а для тестирования его возможно используемые модули заменять их имитаторами (заглушками).
- 2. каждая программа в какой-то степени подчиняется некоторым внутренним для нее, но глобальным для ее модулей соображениям (принципам реализации, предположениям, структурам данных и т.п.), что определяет ее концептуальную целостность и формируется в процессе ее разработки. При восходящей разработке эта глобальная информация для модулей нижних уровней еще не ясна в полном объеме, поэтому очень часто приходится их перепрограммировать.
- 3. при восходящем тестировании для каждого модуля (кроме головного) приходится создавать ведущую программу (модуль), которая должна подготовить для тестируемого модуля необходимое состояние информационной среды и произвести требуемое обращение к нему. Это приводит к большому объему «отладочного» программирования и в то же время не дает никакой гарантии, что тестирование модулей производилось именно в тех условиях, в которых они будут выполняться в рабочей программе.
Метод нисходящей разработки.
Сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), переходя к программированию какого-либо другого модуля только в том случае, если уже запрограммирован модуль, который к нему обращается. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) порядке.
- 1. При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т.е. ликвидируется весьма неприятный источник просчетов при программировании модулей.
- 2. Существенно облегчается и тестирование модулей, производимое при нисходящем тестировании программы. Первым тестируется головной модуль программы, который представляет всю тестируемую программу и поэтому тестируется при «естественном» состоянии информационной среды, при котором начинает выполняться эта программа. При этом все модули, к которым может обращаться головной, заменяются на их имитаторы. Имитатор модуля — простой программный фрагмент, сигнализирующий, о самом факте обращения к имитируемому модулю с необходимой для правильной работы программы обработкой значений его входных параметров и с выдачей, если это необходимо, заранее запасенного подходящего результата. После завершения тестирования и отладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами, если таковые имеются. Для этого имитатор выбранного для тестирования модуля заменяется на сам этот модуль и добавляются имитаторы тех модулей, к которым может обращаться выбранный для тестирования модуль. При этом каждый такой модуль будет тестироваться при «естественных» состояниях информационной среды, возникающих к моменту обращения к этому модулю при выполнении тестируемой программы. Таким образом, большой объем «отладочного» программирования заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для подыгрывания процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами.
Рассмотренные методы называются классическими. В них модульная древовидная структура программы должна разрабатываться до начала программирования модулей. Однако такой подход вызывает ряд возражений: маловероятно, чтобы до программирования модулей можно было разработать структуру программы достаточно точно и содержательно.
При конструктивном и архитектурном подходах к разработке программ модульная структура формируется в процессе программирования модулей.
Конструктивный подход (Модификация нисходящей разработки)
Модульная древовидная структура программы формируется в процессе программирования модуля. Сначала программируется головной модуль, исходя из спецификации программы в целом, причем спецификация программы является одновременно и спецификацией ее головного модуля, так как последний полностью берет на себя ответственность за выполнение функций программы.
В процессе программирования головного модуля, в случае, если эта программа достаточно большая, выделяются внутренние функции, в терминах которых программируется головной модуль. Это означает, что для каждой выделяемой функции создается спецификация реализующего ее фрагмента программы, который в дальнейшем может быть представлен некоторым поддеревом модулей.
Важно заметить, что здесь также ответственность за выполнение выделенной функции берет головной (может быть, и единственный) модуль этого поддерева, так что спецификация выделенной функции является одновременно и спецификацией головного модуля этого поддерева. В головном модуле программы для обращения к выделенной функции строится обращение к головному модулю указанного поддерева в соответствии с созданной его спецификацией. Таким образом, на первом шаге разработки программы (при программировании ее головного модуля) формируется верхняя начальная часть дерева, например, такая, которая показана на рис. 7.1.
Рис. 7.1 Первый шаг формирования модульной структуры программы при конструктивном подходе
Аналогичные действия производятся при программировании любого другого модуля, который выбирается из текущего состояния дерева программы из числа специфицированных, но пока еще не запрограммированных модулей. В результате этого производится очередное деформирование дерева программы, например, такое, которое показано на рис. 7.2.
Архитектурный подход (модификация восходящей разработки)
Модульная структура программы формируется в процессе программирования модуля. Но при этом ставится другая цель разработки: повышение уровня используемого языка программирования, а не разработка конкретной программы. Это означает, что для заданной предметной области выделяются типичные функции, каждая из которых может использоваться при решении разных задач в этой области, и специфицируются, а затем и программируются отдельные программные модули, выполняющие эти функции. Так как процесс выделения таких функций связан с накоплением и обобщением опыта решения задач в заданной предметной области, то обычно сначала выделяются и реализуются отдельными модулями более простые функции, а затем постепенно появляются модули, использующие ранее выделенные функции. Такой набор модулей создается в расчете на то, что при разработке той или иной программы заданной предметной области в рамках конструктивного подхода могут оказаться приемлемыми некоторые из этих модулей.
Это позволяет сократить трудозатраты на разработку конкретной программы путем подключения, к ней заранее заготовленных и проверенных на практике модульных структур нижнего уровня. Так как такие структуры могут многократно использоваться в разных конкретных программах, то архитектурный подход может рассматриваться как путь борьбы с дублированием в программировании. В связи с этим программные модули, создаваемые в рамках архитектурного подхода, обычно параметризуются для того, чтобы усилить применимость таких модулей путем настройки их на параметры.
Рис. 7.2 Второй шаг формирования модульной структуры программы при конструктивном подходе
Метод нисходящей реализации. Каждый запрограммированный модуль начинают сразу же тестировать до перехода к программированию другого модуля.
Источник: vuzlit.com
Что такое модуль в программировании
Модуль в программировании — это построение программного приложения в виде набора отдельных, не зависящих друг от друга блоков, которые принято называть модулями.
Введение
Замечание 1
Под модульным программированием понимается методика формирования программ, при которой всё программное приложение подразделяется на отдельные элементы, которые принято называть модулями. При этом каждый модуль обладает своим контролируемым размером, ясным и чётким предназначением и законченной структурой интерфейса связи с внешней средой.
Естественно, что альтернативным вариантом модульному построению, является программный монолит, то есть единая программа, что не очень удобно. Главной проблемой при модульном построении программы является выбор оптимального критерия подразделения всей программы на отдельные модули.
Решим твою учебную задачу всего за 30 минут
Попробовать прямо сейчас
Принципы модульного программирования
Базовыми принципами модульного программирования являются следующие:
- Информационное утаивание Парнаса. Любой элемент утаивает одно проектировочное решение, то есть предназначением модуля является утаивание информации. Основной момент при проектировании программного продукта состоит в том, что вначале составляется перечень тех решений по проектированию, которые вызывают сомнение и их сложно принять или тех, которые в дальнейшем могут изменяться. Далее назначаются конкретные модули для реализации каждого из решений.
- Модульная аксиома Коуэна. Модулем является не зависящая от других приложений программная единица, которая предназначена для осуществления определённых программных операций и для выполнения взаимодействия с головным участком программы. Эта программная единица обязана выполнять следующие требования:
- Блочная структура, то есть наличие возможности вызова программной единицы из блоков любого уровня вложения.
- Обособленность по синтаксису, то есть модуль выделяется в текстовом оформлении программы компонентами синтаксиса.
- Обладание независимостью по семантике, то есть программная единица должна работать вне зависимости от места, где она вызывается.
- Обладание общностью данных, то есть программная единица должна иметь собственные данные, которые сохраняются при любом её вызове.
- Обладание полным определением, то есть программная единица должна быть самостоятельной.
- Программирование сборкой Цейтлина. Модули являются программными кирпичами, из которых выстраивается весь программный комплекс. Базовыми предпосылками модульного программирования являются:
- Устремлённость выделить независимую единицу программных познаний. Идеальным вариантом является оформление в формате модуля любого алгоритма или идеи.
- Необходимость структурного и организационного разделения больших проектов.
- Наличие возможности параллельных версий модулей (в плане параллельного программирования).
«Что такое модуль в программировании»
Готовые курсовые работы и рефераты
Консультации эксперта по предмету
Помощь в написании учебной работы
Определение и разновидности модулей
Существуют следующие дополнительные определения модуля:
- Модулем является командный набор, который возможно вызвать по его имени.
- Под модулем понимается совокупный набор программных операторов, который имеет граничные компоненты, а также идентификатор, который может быть агрегатным.
Спецификация функций модуля обязательно включает в свой состав:
- Спецификацию синтаксиса входов модуля, позволяющая сформировать на применяемом программном языке корректное по синтаксису обращение к данному модулю.
- Семантическую формулировку функций, которые может выполнить модуль по каждому входу.
Можно выделить следующие модульные разновидности:
- Модули маленьких размеров или функциональные, которые обычно реализуют одну заданную функцию. Базовым и самым простым модулем почти в любом языке программирования считается функция или процедура.
- Модули средних размеров или информационные, которые реализуют обычно небольшой набор функций или операций, используя одну и туже структуру данных. Эта структура, именуемая информационным объектом, не известна за пределами данного модуля. Примерами «средних» модулей в программных языках могут служить:
- Набор задач в программном языке Ada.
- Кластеры в программном языке CLU.
- Набор классов в языках С++ и Java.
- Модули больших размеров или логические, которые объединяют комплект средних или малоразмерных модулей. В качестве примеров таких модулей можно привести:
- Набор модулей в программном языке Modula-2.
- Набор пакетов в программных языках Ada и Java.
Специалистом в области программирования Майерсом были предложены следующие конструктивные характеристики модуля:
- Объём модуля. Модуль должен содержать семь (плюс, минус две) конструкций. Конструкциями могут быть операторы для функций или функции для пакетов. Данное количество взято на основании понятий психологов о среднем размере буфера памяти человеческого мозга.
- Характеристика связности или прочности модуля.
Источник: spravochnick.ru