Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Модули и их свойства





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

Как уже упоминалось раньше, в настоящее время используют два спосо­ба декомпозиции разрабатываемого ПО, связанные с соответствующим подходом:


· процедурный (или структурный – по названию подхода);

· объектный.

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


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

Результатом объектной декомпозиции является совокупность объектов, которые затем реализуют как переменные некоторых специально разрабаты­ваемых типов (классов), представляющих собой совокупность полей данных и методов, работающих с этими полями.

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

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

Данные модуль может получать и/или возвращать через общие области памяти или параметры.


Первоначально к модулям (еще понимаемым как подпрограммы) предъ­являлись следующие требования:

· отдельная компиляция;

· одна точка входа;

· одна точка выхода;

· соответствие принципу вертикального управления;

· возможность вызова других модулей;

· небольшой размер (до 50-60 операторов языка);

· независимость от истории вызовов;

· выполнение одной функции.

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


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

Практика показала, что чем выше степень независимости модулей, тем:

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

· меньше вероятность появления новых ошибок при исправлении ста­рых или внесении изменений в программу, т. е. вероятность появления «волнового» эффекта;

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

Таким образом, уменьшение зависимости модулей улучшает техноло­гичность проекта. Степень независимости модулей (как подпрограмм, так и библиотек) оценивают двумя критериями: сцеплением и связностью.

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

Различают пять типов сцепления модулей:

· по данным;

· по образцу;

· по управлению;

· по общей области данных;

· по содержимому.

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

Сцепление по образцу предполагает, что модули обмениваются данны­ми, объединенными в структуры. Этот тип также обеспечивает неплохие ха­рактеристики, но они хуже, чем у предыдущего типа, так как конкретные пе­редаваемые данные «спрятаны» в структуры, и потому уменьшается «про­зрачность» связи между модулями. Кроме того, при изменении структуры передаваемых данных необходимо модифицировать все использующие ее модули.C и C++.)

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

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

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

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


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


Различают семь видов связности модулей (в порядке убывания уровня):

· функциональную;

· последовательную;

· информационную (коммуникативную);

· процедурную;

· временную;

· логическую;

· случайную.

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

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

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

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


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

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

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

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

 

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

 

Библиотеки ресурсов. Различают библиотеки ресурсов двух типов: библиотеки подпрограмм и библиотеки классов.

 

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

 

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

В качестве средства улучшения технологических характеристик библиотек ресурсов в настоящее время широко используют разделение тела модуля на интерфейсную часть и область реализации (секции Interface и Implementation – в Pascal, h и cpp -файлы в C++ и Java).

 

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

 

 

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

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


· постановка задачи – (что дано, и что требуется найти) – формулируется цель решения задачи, подробно описывается ее содержание; проводится анализ условий, при которых решается задача, выявляется область определения входных параметров;

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

· построение математической модели задачи – (формализация задачи) – выражение взаимосвязей между величинами с помощью математических выражений и соотношений;

· выбор и обоснование метода решения – реализация модели решения задачи на основе конкретных приемов и методов решения;

· построение алгоритма – составление алгоритма решения задачи в соответствии с выбранным методом решения; разбиение процесса обработки данных на отдельные блоки, определение последовательности выполнения этих блоков;

· выбор технологии программирования (в том числе, платформы, языка программирования, среды);

· составление программы – перевод алгоритма решения на конкретный ЯП;

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

· тестирование программы – использование программы для решения конкретной задачи (или ее частей) с заранее известными результатами;

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

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

К основным понятиям программирования относятся:

· исполнитель – субъект (человек, компьютер, механизм, язык программирования и др.), способный выполнять определенный конечный набор действий;

· предписание – приказ на выполнение действия из указанного конечного набора;

· система предписаний исполнителя – совокупность допустимых предписаний;

· программа – конечная последовательность предписаний с указанием порядка их выполнения.

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


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


Любой алгоритм характеризуется следующими основными свойствами:

· дискретность – свойство, означающее, что каждый алгоритм состоит из отдельных законченных этапов (действий) (дискретность = разрывность, т.е. не непрерывность);

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

· массовость – применимость алгоритма ко всем задачам рассматриваемого типа, при любых исходных данных.

· результативность – свойство, состоящее в том, что любой алгоритм должен завершаться за конечное число шагов;

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

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

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...