Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TRPP_uberdohuya.doc
Скачиваний:
14
Добавлен:
22.08.2019
Размер:
422.4 Кб
Скачать

Тема 6 Модульное программирование

Модуль и его характеристики. Размер модуля. Прочность и сцепление модуля. Правила построения модулей.

Тема 6 Модульное программирование

Модуль и его характеристики. Размер модуля. Прочность и сцепление модуля. Правила построения модулей.

Здесь основная идея заключалась в том, чтобы "спрятать" данные и процедуры внутри независимых программных единиц - модулей. Эту идею впервые реализовал Н. Вирт в алгоритмическом языке Modula (1975-1979 годы), а затем "подхватили" и остальные, распространенные в то время языки программирования. Например, известные системы программирования Turbo Pascal и Turbo С.

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

Размер модуля измеряется числом содержащихся в нем операторов или строк. Модуль не должен быть слишком маленьким или слишком большим.

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

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

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

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

Правила построения модулей

  1. Функциональная декомпозиция разбиение

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

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

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

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

3. Минимизации количества необходимых вызовов

Тема 7 Эффективность и оптимизация программ

Методы эффективности ПП. Методы и правила оптимизации ПП. Пользовательский интерфейс. Эффективность от использования ПП.

1. Эффективность и технологичность. Способы экономии памяти. Способы уменьшения времени выполнения

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

Из опыта разработчиков программного обеспечения:

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

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

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

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

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

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

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

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

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

Не следует увеличивать эффективность за счет снижения технологичности разрабатываемого программного обеспечения.

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

  • машинно-зависимые (выполняют оптимизацию кодов на уровне машинных команд: исключение лишних пересылок, использование более эффективных команд, и т.п.);

  • машинно-независимые (выполняют оптимизацию на уровне входного языка: вынесение вычислений константных (независящих от индекса цикла) выражений из циклов и т.п.).

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

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

При ограничениях на использование памяти следует выбирать алгоритмы обработки, не требующие дублирования исходных данных структурных типов в процессе обработки. (пример: алгоритмы сортировки массивов (сортировка методом «пузырька»)).

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

Следует помнить, что при передаче структурных данных в программу «по значению» копии этих данных размещаются в стеке. Избежать копирования удается, если передавать данные «по ссылке», но как неизменяемые (описанные const). Тогда размещается в стеке только адрес данных.

Способы уменьшения времени выполнения.

При написании циклических участков программы необходимо:

  • выносить вычисление константных, т.е. не зависящих от параметров цикла, выражений из циклов;

  • избегать «длинных» операций умножения и деления, заменяя их сложением, вычитанием и сдвигами;

  • минимизировать преобразования типов в выражениях;

  • оптимизировать запись условных выражений – исключать лишние проверки;

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

  • избегать использование различных типов в выражении и т.п.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]