Автор работы: Пользователь скрыл имя, 17 Марта 2013 в 13:01, курсовая работа
Машинно-ориентированное программирование появилось одновременно с созданием электронных вычислительных машин. Сначала это были программы в машинных кодах, затем появился язык программирования Assembler (Автокод), который немного «очеловечил» написание программы в машинном коде. Этот стиль программирования предполагает доскональное знание возможностей конкретной архитектуры ЭВМ и операционной системы и используется до сих пор тогда, когда другие стили бессильны, или нужно получить максимальное быстродействие в рамках той или иной операционной системы с использованием архитектуры данной ЭВМ.
Введение …………………………………….....…………………………...3
1. Теоретические аспекты модульного программирования ………………..….6
1.1 Цель модульного программирования ………………………………...…..6
1.2 Основные характеристики программного модуля ……………………..14
1.3 Проектирование модуля ……………………………………………….........21
1.3.1 Функциональная декомпозиция ……………………………………….....22
1.3.2 Минимизации количества передаваемых параметров ………………….24
1.3.3 Минимизации количества необходимых вызовов …………..…….25
1.4 Методы разработки структуры модульной программы ...………….....….27
1.5 Контроль структуры модульной программы ...…………………..…34
2. Практическая часть. Код программы "Блокиратор рабочего стола" …….35
Заключение ……………………………………………………………….38
Список исползуемых источников …...………………………..………....39
- по образцу: один модуль посылает другому составной информационный объект (запись, структура). Это один из допустимых типов связанности модулей.
- по управлению: один модуль посылает другому информационный объект – флаг, предназначенный для управления его внутренней логикой. Это один из допустимых типов связанности модулей.
- по общей области данных: модули ссылаются на одну и туже область глобальных данных. Это нежелательный тип сцепления модулей, так как, во-первых, ошибка в модуле, использующем глобальную область, может неожиданно проявиться в любом другом модуле; во-вторых, такие программы сложны для понимания, так как программисту трудно определить, какие именно данные используются конкретным модулем.
- по содержимому: один из модулей ссылается внутрь другого. Это недопустимый тип сцепления, противоречащий принципу модульности, то есть представления модуля в виде «черного ящика».
Связность модуля – мера прочности соединения функциональных и информационных объектов внутри него. Это степень взаимосвязи элементов и направленности модуля на решение определенной задачи. Чем выше связность модуля, тем меньше «ручек управления» на модуле и тем он проще. При проектировании модулей нужно стремиться к высокой связности, так как чем выше связность, тем лучше спроектирован модуль. Размещение сильно связанных элементов в одном модуле уменьшает межмодульные связи и, соответственно, взаимовлияние модулей. В то же время помещение сильно связанных элементов в разные модули не только усиливает межмодульные связи, но и усложняет понимание их взаимодействия. Объединение слабо связанных элементов также уменьшает технологичность модулей, так как такими элементами сложнее мысленно манипулировать.
Виды связности модулей в порядке убывания уровня:
- функциональная: все объекты модуля предназначены для выполнения одной функции; операции, объединяемые для выполнения одной функции, или данные, связанные с одной функцией. Модуль, элементы которого связаны функционально, имеет четко определенную цель, при его вызове выполняется одна задача, например, подпрограмма поиска минимального элемента массива. Такой модуль имеет максимальную связность, следствием которой являются его хорошие технологические качества: простота тестирования, модификации и сопровождения. Именно с этим связано одно из требований структурной декомпозиции «один модуль – одна функция».
- последовательная: объекты модуля выполняют подзадачи, для которых выходные данные одной из подзадач являются входными для другой (открыть файл, прочитать запись, закрыть файл).
- информационная, или коммуникативная: модуль содержит объекты, обрабатывающие одни и те же данные. Несмотря на объединение нескольких функций, информационно связанный модуль имеет неплохие показатели технологичности. Это объясняется тем, что все функции, работающие с некоторыми данными, собраны в одно место, что позволяет при изменении формата данных корректировать только один модуль. Информационно связанными также считают данные, которые обрабатываются одной функцией.
- процедурная: объекты модуля включены в различные подзадачи, в которых управление переходит от одной подзадачи к следующей. В отличие от последовательно связанного модуля, в котором осуществляется передача данных, в процедурно связанном модуле выполняется передача управления. При процедурной связности отдельные элементы модуля связаны крайне слабо, так как реализуемые ими действия связаны лишь общим процессом.
- временная: объекты модуля привязаны к конкретному промежутку времени (например, модуль, осуществляющий инициализацию процесса). Элементы модуля связаны только тем, что они должны выполняться в определенное время.
- логическая связность: данные или функции объединены в одну логическую группу. В качестве примера можно привести функции обработки текстовой информации или данные одного и того же типа. Модуль с логической связностью функций часто реализует альтернативные варианты одной операции, например, сложение целых чисел и сложение вещественных чисел. Из такого модуля всегда будет вызываться одна какая-либо его часть, при этом вызывающий и вызываемый модули будут связаны по управлению.
- случайная (по совпадению): связь между элементами модуля мала или отсутствует. Такой модуль имеет самые низкие показатели технологичности.
В программных
системах должны присутствовать модули,
имеющие следующие три меры связности:
функциональная, последовательная и
информационная, так как другие типы
связности крайне нежелательны и
осложняют понимание и
Как правило,
при хорошо продуманной декомпозиции
модули верхних уровней иерархии
имеют функциональную или последовательную
связность функций и данных. Для
модулей обслуживания данных характерна
информационная связность функций.
Данные таких модулей могут быть
связаны по-разному. Так, модули, содержащие
описание классов при объектно-
Как разработать хороший модуль, который действительно будет способствовать упрощению программы?
В литературе приводятся различные критерии оценки приемлемости модуля. Были предложены следующие критерии:
• хороший модуль снаружи проще, чем внутри;
• хороший модуль проще использовать, чем построить.
Предлагается
использовать следующие характеристики прог
Размер модуля измеряется числом содержащихся в нем операторов. Модуль не должен быть слишком маленьким или слишком большим. Большие модули, как правило, сложны для понимания и неудобны для внесения изменений, они могут существенно увеличить суммарное время повторных трансляций программы при отладке. Маленькие модули усложняют общую структурную схему программы и могут не окупать накладных расходов, связанных с их оформлением. Обычно рекомендуются программные модули размером от нескольких десятков до нескольких сотен операторов.
Прочность модуля — это мера его внутренних связей. Чем выше прочность модуля, тем больше связей скрыто от внешней по отношению к нему части программы и, следовательно, тем проще сама программа. Самой слабой степенью прочности обладает модуль, прочный по совпадению. В данном случае в программный модуль оформляется повторяющаяся в нескольких местах программы последовательность операторов. Если вдруг возникнет необходимость изменения этой последовательности в одном из контекстов, придется изменять сам модуль, что может сделать его использование в других контекстах ошибочным. Такой класс программных модулей не рекомендуется для использования.
Функционально прочный модуль — это модуль, реализующий одну какую-либо определенную функцию. При этом он может использовать и другие модули. Такой вид прочности модулей рекомендуется для использования.
Высшей степенью прочности обладает информационно прочный модуль — это модуль, выполняющий несколько операций над одной и той же структурой данных, которая неизвестна вне этого модуля. Для каждой из этих операций в таком модуле имеется свой вход со своей формой обращения к нему.
Информационно прочный модуль может реализовывать, например, абстрактный тип данных.
Сцепление модуля — это мера его зависимости по способу передачи данных от других модулей. Чем слабее сцепление модуля с другими модулями, тем сильнее его независимость от других модулей. Для оценки степени сцепления существует шесть видов сцепления модулей по:
• данным;
• образцу;
• управлению;
• внешним ссылкам;
• общей области данных;
• содержимому.
Худшим
видом сцепления модулей
Не рекомендуется использовать также сцепление по общей области — это такое сцепление модулей, когда несколько модулей используют одну и ту же область памяти.
Сцепление по образцу предполагает, что модули обмениваются данными, объединенными в структуры. Этот тип обеспечивает неплохие характеристики по сравнению с предыдущими.
Недостаток
заключается в том, что конкретные
передаваемые данные «спрятаны» в структуры,
и потому уменьшается «прозрачность»
связи между модулями. Кроме того,
при изменении структуры
При сцеплении по управлению один модуль посылает другому некоторый информационный объект (флаг), предназначенный для управления внутренней логикой модуля. Таким способом часто выполняют настройку режимов работы программного обеспечения. Подобные настройки также снижают наглядность взаимодействия модулей и потому обеспечивают не лучшие характеристики технологичности разрабатываемого программного обеспечения.
Сцепление по внешним ссылкам предполагает, что модули ссылаются на один и тот же глобальный элемент данных.
Единственным видом сцепления модулей, который рекомендуется для использования современной технологией программирования, является сцепление по данным (параметрическое сцепление) — это случай, когда данные передаются модулю либо при обращении к нему как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Такой вид сцепления модулей реализуется на языках программирования при использовании обращений к процедурам (функциям).
Рутинность модуля — это его независимость от предыстории обращений к нему. Модуль будем называть рутинным, если результат обращения к нему зависит только от значений его параметров и не зависит от результатов предыдущих обращений к нему. Модуль будем называть зависящим от предыстории, если результат обращения к нему зависит от внутреннего состояния этого модуля, хранящего следы предыдущих обращений к нему.
В книге
Майерса не рекомендуется использовать
зависящие от предыстории модули,
так как они провоцируют
• всегда следует использовать рутинный модуль, если это не приводит к плохим сцеплениям модулей;
• зависящие
от предыстории модули следует использовать
только в случае, когда это необходимо
для обеспечения параметрическ
• в спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость таким образом, чтобы было возможно прогнозировать поведение данного модуля при разных последующих обращениях к нему.
Связность
модулей — мера прочности соединения функцион
Размещение сильно связанных элементов в одном модуле уменьшает межмодульные связи, в то время как помещение сильно связанных элементов в разные модули не только усиливает межмодульные связи, но и усложняет понимание их взаимодействия. Объединение слабо связанных элементов также уменьшает технологичность модулей, делая их сложнее для понимания.
Различают следующие виды связности (в порядке убывания уровня):
• функциональную;
• последовательную;
• информационную (коммуникативную);
• процедурную;
• временную;
• логическую;
• случайную.
При функциональной связности модуль предназначен для выполнения одной функции. Его исходные данные и операции предназначены для решения одной конкретной задачи. Такой модуль имеет максимальную связность и, как следствие, хорошую технологичность (простота компиляции, тестирования, сопровождения).
При последовательной связности модуля результат обработки данных одной функцией служит исходными данными для другой функции. Такой модуль реализует одну подпрограмму, выполняющую две функции. Модуль с последовательной связностью функций можно разбить на два модуля или более, как с последовательной, так и с функциональной связностью. При этом данные, используемые последовательными функциями, также связаны последовательно. Такой модуль выполняет несколько функций, и, следовательно, его технологичность хуже с точки зрения понимания и тестирования.
Информационно
связанными считают функции, обрабатывающ