Способы модульного программирования на с. Модульное программирование. Концепция модульного программирования

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

Мне всегда кажется целесообразным изучить альтернативные методы программирования, воплощенные на других языках. Джон Хейз работает в Лаборатории прикладной физики Университета Джона Хопкинса. Он разрабатывает встроенные системы для космических аппаратов в течение почти двух десятилетий.

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

Концепции модульного программирования. В основе модульного программирования лежат три основных концепции:

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

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

Подробнее о стилях цитирования. Сайт дает вам возможность ссылаться на эталонные записи и статьи в соответствии с общими стилями из Ассоциации современного языка, «Руководство по стилю Чикаго» и Американской психологической ассоциации. Затем скопируйте и вставьте текст в свою библиографию или список цитируемых работ. Поскольку каждый стиль имеет свои собственные нюансы форматирования, которые меняются со временем, а не вся информация доступна для каждой ссылки или статьи, сайт не может гарантировать, что каждая цитата, которую он создает.

Аксиома модульности Коуэна. Модуль - независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:

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

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

· синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами;

· семантическая независимость, т. е. независимость от места, где программная единица вызвана;

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

· полнота определения, т. е. самостоятельность программной единицы.

Набор связанных процедур с данными, которыми они управляют, часто называют модулем. Парадигма программирования становится такой. Решите, какие модули вы хотите; Разделите программу так, чтобы данные были скрыты внутри модулей. Эта парадигма также известна как принцип скрытия данных. Там, где нет группировки процедур со связанными данными, достаточно процедурного стиля программирования. Кроме того, методы для разработки «хороших процедур» теперь применяются для каждой процедуры в модуле. Наиболее распространенным примером модуля является определение стека.

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

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

Минимизации количества передаваемых параметров

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

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

· потребность организационного расчленения крупных разработок;

· возможность параллельного исполнения модулей (в контексте параллельного программирования).

Определения модуля и его примеры. Приведем несколько дополнительных определений модуля.

· Модуль - это совокупность команд, к которым можно обратиться по имени.

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

Однако это имеет большое практическое значение. Наилучший подход - максимизировать модульность, представлять логически модульность языковые функции, а затем использовать физическую модульность через файлы для эффективной отдельной компиляции. Когда программа спроектирована как набор модулей, в этих модулях должна учитываться обработка ошибок. Какой модуль отвечает за обработку ошибок? Часто модуль, который обнаруживает ошибку, не знает, какое действие следует предпринять. Действие восстановления зависит от модуля, который вызывал операцию, а не от модуля, который обнаружил ошибку при попытке выполнить операцию.

· Модуль - это совокупность операторов программы, имеющая граничные элементы и идентификатор (возможно агрегатный).

Функциональная спецификация модуля должна включать:

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

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

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

· описание семантики функций, выполняемых модулем по каждому из его входов.

Разновидности модулей. Существуют три основные разновидности модулей:

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

Процесс проектирования не прост, но сложный, громоздкий и расстраивающий многие кривые на пути успешного дизайна. Структурное программирование Модульное проектирование сверху вниз Проектирование снизу вверх Проектирование объектно-ориентированного программирования. Целью разработки Программы являются.

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

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

a)задачи в языке программирования Ada;

b)кластер в языке программирования CLU;

Материал из ПИЭ.Wiki

Производительность: новая система установлена ​​для повышения производительности компании или организации. Конкуренция: новая система также относится к статусу. В эпоху ревущих соревнований, если организация не справляется с модемными технологиями, не может столкнуться с соревнованиями.

Техническое обслуживание: новая система необходима для поддержания статуса организации. Это первый подход к программированию, широко используемый в начале. Профессор Эдсберг Вибе Дийкстра мотивирует термин «Структурное программирование». Он часто рассматривается как «беззаботное» программирование, потому что его избегают программисты. Программа разделена на несколько базовых структур. Эти структуры называются строительными блоками.

c)классы в языках программирования C++ и Java.

3) "Большие” (логические) модули , объединяющие набор "средних" или "маленьких" модулей. Примеры "больших" модулей в языках программирования:

a)модуль в языке программирования Modula-2;

b)пакеты в языках программирования Ada и Java.

Набор характеристик модуля предложен Майерсом [Майерс 1980]. Он состоит из следующих конструктивных характеристик:

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

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

  • Программа легко кодируется с использованием модулей.
  • Низкая стоимость разработки программы.
  • Более высокая производительность, высокое качество программной продукции.
Требуется больше места в памяти.

1) размера модуля;

В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в "чанки" - наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обрабатывать не более 7 чанков.

Когда количество модулей выходит за пределы определенного диапазона, производительность программы не является удовлетворительной. Когда мы изучаем философию образования, концепция модуляции может быть понятной без какой-либо двусмысленности. Рене Декарт из Франции дал концепцию реконструкции наших знаний по частям. Кусок ничего, но это модуль контекста программирования модема.

В модульном подходе большая программа делится на множество небольших дискретных компонентов, называемых модулями. В языке программирования для этого используются разные имена. Это логически отделимая часть программы. Модули независимы и легко управляемы. Обычно модули с 20-50 линиями считаются хорошими модулями при увеличении линий, управление модулем становится сложным.

Модуль (функция) не должен превышать 60 строк. В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора.

2) прочности (связности) модуля;

Существует гипотеза о глобальных данных, утверждающая, что глобальные данные вредны и опасны. Идея глобальных данных дискредитирует себя так же, как и идея оператора безусловного перехода goto. Локальность данных дает возможность легко читать и понимать модули, а также легко удалять их из программы.

Модули отлаживаются и тестируются отдельно и объединяются для создания системы. Верхний модуль называется корневым или босс-модулем, который заряжает управление всеми подмодулями сверху вниз. Управление проходит сверху вниз, но не снизу вверх. Оценка моделирования называется связью и связностью. Сочетание модулей обозначает количество взаимосвязей между модулями и связью модулей, что показывает взаимосвязь между данными или элементами внутри модуля.

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

Связность (прочность) модуля (cohesion) - мера независимости его частей. Чем выше связность модуля - тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить типы связности, приведенные ниже.

Функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же типами связностей.

Сначала тестируется верхний модуль, а затем подмодули объединяются один за другим и тестируются. При таком подходе проектирование начинается снизу и продвигается ступенчато вверх. Вначале разработаны и протестированы модули нижнего слоя, модули второго уровня разработаны и объединены с нижним слоем и объединены модули. При разработке программного обеспечения не используется только метод «сверху вниз» или «снизу вверх». Гибридный тип подхода рекомендуется многими дизайнерами, в которых сверху вниз и снизу вверх, используются оба подхода. Таким образом, проектирование и тестирование продвигались снизу вверх. . В объектно-ориентированном программировании программа разделяется на набор объектов.

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

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

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

3) сцепления модуля с другими модулями;

Сцепление (coupling) - мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы сцепления.

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

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

· Сцепление по простым элементам данных.

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

4) рутинности (идемпотентность, независимость от предыдущих обращений) модуля.

Рутинность - это независимость модуля от предыдущих обращений к нему (от предыстории). Будем называть модуль рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений).

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

· В большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений.

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

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

Модульное программирование работает по принципу «разделяй и властвуй». Стоит разобраться.

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

Сам термин «модуль» начал использоваться в программировании в связи с внедрением модульного принципа при написании программ. В семидесятых годах модулем называли какую-то функцию или процедуру, которая была написана по определенным правилам. Так как на тот момент не было сформировано общепризнанных требований, то модулем называли любую процедуру, чей размер составлял до пятидесяти строк. Парнасом были сформированы первые конкретизированные требования к модулю: « Для формирования одного модуля должно быть достаточно самых минимальных знаний о содержании другого». Получается, именно Парнас впервые сформировал концепцию скрытия информации в программировании. Его определение приводит нас к тому, что модулем может называться любая отдельная процедура как самого нижнего, так и самого верхнего уровня иерархии. Надежно скрытие информации нельзя было обеспечить посредством использования конструкций, существующих в то время, так как они было подвержены сильному действию глобальных переменных, а их поведение в сложных программах предсказать весьма сложно. Необходимо было создать конструкцию, изолированную от этих переменных. Именно ее и назвали модулем, а на его основе и зародилось модульное программирование.

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

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