Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Разделы 1-3.doc
Скачиваний:
20
Добавлен:
28.09.2019
Размер:
1.95 Mб
Скачать

1.3.4. Стиль оформления программы.

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

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

Стиль оформления программы включает:

  • правила именования объектов программы (переменных, функций, ти­пов, данных и т. п.);

  • правила оформления модулей;

  • стиль оформления текстов модулей.

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

  • имя объекта должно соответствовать его содержанию, например:

Maxltem - максимальный элемент;

Nextltem - следующий элемент;

• если позволяет язык программирования, можно использовать символ « » для визуального разделения имен, состоящих из нескольких слов, например:

Maxjtem, Next_Item;

необходимо избегать близких по написанию имен, например:

Index и InDec.

Правила оформления модулей. Каждый модуль должен предваряться заголовком, который, как минимум, содержит:

  • название модуля;

  • краткое описание его назначения;

  • краткое описание входных и выходных параметров с указанием единиц измерения;

  • список используемых (вызываемых) модулей;

  • краткое описание алгоритма (метода) и/или ограничений;

  • ФИО автора программы;

  • идентифицирующую информацию (номер версии и/или дату послед­ ней корректировки). Например:

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

Для таких языков, как Pascal, C++ и Java, использование отступов поз­воляет прояснить структуру программы: Обычно дополнительный отступ обозначает вложение операторов языка, например:

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

1.3.5. Эффективность и технологичность.

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

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

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

И тем более не следует «платить» за увеличение эффективности сниже­нием технологичности 'разрабатываемого программного обеспечения. Ис­ключения возможны лишь при очень жестких требованиях и наличии соот­ветствующего контроля за качеством.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


о<) В этом цикле операции умножения и обращения к элементу S[k] выпол­няются 10000 раз. Оптимизируем цикл, исподьзуя, что 320 = 2^ + 26:


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

В результате вместо 10000 операций умножения будут выполняться 200 операций сдвига, а их время приблизительно сравнимо со временем выпол­нения операции сложения. Обращение к элементу массива S[k] будет выпол­нено один раз.

Пример 2.3. Пусть имеется цикл, в теле которого реализовано сложное условие:

Обратите внимание на то, что в примере 2.2 понять, что делает програм­ма, стало сложнее, а в примере 2.3 - практически нет. Следовательно, опти­мизация, выполненная в первом случае, может ухудшить технологичность программы, а потому не очень желательна.