
- •3.Жизненный цикл программы. Критерии качества программы.
- •5.Разработка проекта программной системы
- •6.Схемы алгоритмов, данных, программ
- •7.Символы данных. 8.Символы процесса. Все это говно не копируется со схемам, 9.Символы линий.
- •13.Алфавит языка Паскаль.
- •14.Грамматика для описания языка, синтаксические диаграммы
- •15.Структура программы на языке Паскаль
- •18.Стандартные типы данных
- •19.Порядковые типы данных
- •20.Данные логического типа(булевского)
- •21.Данные целого типа
- •22.Данные символьного типа
- •29.Строки
- •50. Проектирование модульных программ. Модуляризация
- •51. Связность модуля
- •53. Алгоритмы сортировки массива
- •54. Алгоритмы поиска
- •55. Динамические структуры данных
- •56. Линейные списки
- •57. Стек, очередь, дек
- •58. Деревья
51. Связность модуля
Связность модуля определяется как мера независимости составляющих частей модуля. Чем выше связность модуля, тем лучше результат проектирования. Типы связности (в скобках указан коэффициент силы связности):
функциональный (сильная связность ) – 10;
последовательная – 9;
коммуникативная – 7;
процедурная – 5;
временная – 3;
логическая – 1;
по совпадению (слабая связность) – 0. Модуль с функциональной связностью не может быть разбит на два
других, имеющих связность того же типа. Если в модуле присутствуют подпрограммы управления входными-выходными потоками и в нем есть основная часть по обработке этих данных, то модуль выполняет единую функциональную задачу. Как правило, такой модуль реализуется последовательностью операций в виде единого цикла, и он имеет функциональную связность.
Модуль, имеющий последовательную связность, может быть разбит на последовательные части, выполняющие независимые функции, но совместно реализующие единственную функцию. Если один и тот же модуль используется для оценки, а затем для обработки данных, то он имеет последовательную связность. Модуль с последовательной связностью реализуется как последовательность операций или последовательность циклов.
Если модуль составлен из независимых модулей, разделяющих структуру данных, то он имеет коммуникативную связность. Общая структура данных является основой для его организации как единого модуля. Если модуль спроектирован так, чтобы упростить работу со сложной структурой данных, изолировать эту структуру, то он имеет коммуникативную связность. Такой модуль предназначен для выполнения нескольких различных и независимо используемых функций (запоминание и поиск данных). Если модуль разработан так, чтобы изолировать выбор алгоритмов, он имеет функциональную связность. Такой модуль может обрабатывать данные с изолированной структурой, но при вызове считается, что он выполняет единственную функцию. Модули высшего уровня иерархической структуры программы должны иметь функциональную или последовательную связность. Для модулей обслуживания (вспомогательного) предпочтительнее коммуникативная связность. Если модули имеют процедурную, временную, логическую или случайную связность, это свидетельствует о недостаточно продуманном их планировании. Модификация уже существующей программы часто приводит к этим типам связности.
Процедурная связность обнаруживается в модуле, управляющие конструкции которого организованы так, как изображены на структурной схеме программы. Такая структура модуля может возникнуть при расчленении длинной программы на части в соответствии с передачами управления, но без определения какого-либо функционального базиса при выборе разделительных точек. Если для уменьшения размеров модуль делится на два независимых модуля (один предназначен для обработки объявлений процедур и данных, а второй – для выполнения управляющих конструкций), то каждый из этих модулей имеет процедурную связность. Лучшим решением следует считать такое, при котором исходный модуль обращается к нескольким другим модулям (как правило к трем-четырем), при этом каждый из этих модулей выполняет различные функции.
Модуль, содержащий части функционально несвязные, но необходимые в один и тот же момент обработки, имеет временную связность (связность по классу). Имеют место случаи, когда все множество требуемых в момент входа в программу функций выполняется независимым модулем активации. Вместо использования одного независимого модуля для активации в начале программы и другого для перевода в пассивное состояние в конце программы функции следует распределить между различными модулями.
Если в модуле определены операторы только по признаку функционального подобия (если все операторы предназначены для чтения или записи данных), а также для настройки параметров модуля, применяется алгоритм переключения. Такой модуль имеет логическую связность, поскольку его части ничем не связанны, а имеют небольшое сходство между собой. Например, модуль, состоящий из разнообразных подпрограмм для обработки ошибок. С другой стороны, модуль, предназначенный для записи в файл разнообразных сообщений об ошибках, имеет коммуникативную связность, если из файлов сообщений об ошибках с его помощью может быть получена вся выходная информация.
Если операторы модуля объединяются произвольным образом, например, когда нужно указать их размещение в области памяти, такой модуль имеет связность по совпадению.
Три наиболее слабых типа связности возникают, как правило, в результате неправильного проектирования программы, поэтому нужно добиваться функциональной, последовательной, коммуникативной или процедурной связности. 52.Сцепление модулей
Сцепление модулей определяется как мера относительной независимости модулей. Независимые модули могут быть модифицированы без переделки каких-либо других модулей. Слабое сцепление более желательно, так как это означает высокий уровень независимости модуля. Модули считаются полностью независимыми, если каждый из них не содержит информации о другом. Чем больше информации о других модулях используется в них, тем меньше они независимы и тем теснее сцеплены. Такая информация появляется в результате перекрестного использования имен модулей, назначения вызываемых последовательностей, неявного применения входных и выходных кодов, а также из данных, определяемых структурами общих областей памяти. Чем очевиднее взаимодействие двух связных друг с другом модулей, тем проще определить необходимую корректировку одного модуля, зависящую от изменений, производимых в других. Большая изоляция и непосредственное взаимодействие модулей приводит к трудностям в определении границ изменений одного модуля, которые устраняли бы ошибки в других. Ниже приведены примерные меры сцепления модулей (в различных источниках оценки степени сцепления отличаются):
Тип сцепления Независимое (слабое) Сцепление по данным Сцепление по образцу Сцепление по общей области Сцепление по управлению Сцепление по внешним ссылкам
Степень сцепления 0
1 3 4 5 7
Сцепление по кодам (сильное) 9 Модули сцеплены по данным, если они имеют общие единицы (элементы),
которые передаются от одного к другому как параметры и представляют собой простые элементы данных. То есть вызывающий модуль знает только имя вызываемого модуля, а также типы и значения его переменных. Еще меньше знает вызываемый модуль о вызываемой программе. Изменения в структуре данных в одном из модулей не влияет на другие. Кроме того, модули с этим типом сцепления не имеют общей области данных или неявных параметров. Меньшая степень сцепления возможна в том случае, если модули не вызывают друг друга и не образуют одну и ту же информацию.
Модули сцеплены по образцу, если параметры подпрограмм содержат структуры данных. Недостатком является то, что оба модуля должны знать о внутренней структуре данных. Если программист модифицирует структуру данных в одном модуле, он вынужден изменить структуру данных и в другом. Поэтому вероятность ошибок выше, чем в предыдущем случае.
Модули сцеплены по общей области, если они разделяют одну и ту же глобальную структуру данных. При изменении одного модуля вероятность возникновения ошибки в другом значительно выше. При изменениях, возникающих в параметрах модуля, можно определить модули, нуждающиеся в корректировке, на которые эти изменения повлияют. Если же модифицируются неявно заданные параметры, определить модули, нуждающиеся в корректировке, значительно сложнее. Тем более, если не существует документации, отражающей использование модулями общих областей.
Модули имеют сцепление по управлению, если какой-либо из них управляет решениями других с помощью передачи флаговых (логических) переключателей, то есть один из модулей знает о внутренних функциях другого. Если модуль передает информацию о самом себе или об обработанных данных, это не всегда служит проявлением сцепления по управлению. Если модуль имеет логическую связность и при его вызове используется переключатель,
указывающий на требующуюся функцию, вызываемый и вызывающий модули сцеплены по управлению.
Говорят, что модуль предсказуем, если его работа обусловлена одними параметрами. Среда вычислительной машины на функционирование не влияет. Чтобы модуль был предсказуемым, он должен быть сцеплен с другими модулями или по данным, или по образцу, или по управлению. Он не может быть доступен каким-либо внешним данным или областям памяти.
Модуль сцеплен по внешним ссылкам, если у него есть доступ к данным в другом модуле через внешнюю точку входа. Таким путем осуществляется неявное функционирование другого модуля.
Модули имеют сцепление по кодам, если коды их команд пересекаются друг с другом. Такое сцепление возникает тогда, когда модули проектируются как отдельные подпрограммы, путь через которые начинается в различных точках входа, но приходит к общему сегменту кодов.