Общие принципы качественного программирования

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

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

• Дружественность. Хорошая программа должна быть удобной для использова­ния и взаимодействия с ней.

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

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


Модифицируемость.Хорошая программа должна быть удобной для модифика­ции si дополнения. Программа становится более модифицируемой при исполь­зовании наглядной и модульной организации.

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

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

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

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

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

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

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

Такая стратегия нисходящего поэтапного усовершенствования программы имеет следующие преимущества:

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



4асть I. Язык Prolog


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

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

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

Для того чтобы правильно уточнить решение на некотором уровне детализации и ввести полезные концепции на следующем, более низкой уровне, нужны идеи. По­этому процесс программирования является творческим, особенно для начинающих. С накоплением опыта программирование постепенно превращается из искусства в мастерство. Но всегда остается актуальным основной вопрос о том, где найти нужные идеи. Большинство идей приходит с опытом, приобретенным в результате успешного решения аналогичных задач, А если непосредственное программное решение неиз­вестно, может помочь изучение подобной задачи. Еще одним источником идей явля­ется повседневная жизнь. Например, если задача состоит в написании программы сортировки списка элементов, идея может возникнуть в результате поиска ответа на такой вопрос: "Как я сам сортирую комплект экзаменационных бумаг в соответствии с алфавитным порядком фамилий студентов?"

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