Общие принципы качественного программирования
Что такое хорошая программа? Ответ на этот вопрос не так прост, поскольку естьцелый ряд критериев, на основании которых можно судить, насколько качественной является программа. Ниже перечислены наиболее широко применяемые критерии.
• Правильность. Прежде всего, хорошая программа должна быть правильной. Иными словами, она должна выполнять те функции, для которых предназначена. Такое требование может показаться тривиальным и не заслуживающим внимания. Но в случае сложных программ правильность часто не обеспечивается. Одна из распространенных ошибок при написании программ состоит в том, что этот очевидный критерий игнорируется и основное внимание уделяется другим критериям, таким как эффективность или внешняя привлекательность программы.
• Дружественность. Хорошая программа должна быть удобной для использования и взаимодействия с ней.
• Эффективность. Хорошая программа не должна бесполезно расходовать такие ресурсы компьютера, как процессорное время и объем памяти.
• Удобство для чтения. Хорошая программа должна быть удобной для чтения и простой для понимания. Она не должна быть более сложной, чем необходимо. Следует избегать использования остроумных программистских приемов, которые затемняют смысл программы. Удобство программы для чтения во многом зависит от ее общей организации и компоновки.
• Модифицируемость.Хорошая программа должна быть удобной для модификации si дополнения. Программа становится более модифицируемой при использовании наглядной и модульной организации.
• Надежность. Хорошая программа должна быть надежной. Ее выполнение не должно завершаться аварийно сразу же после ввода пользователем каких-либо неправильных или непредвиденных данных. В случае подобных ошибок программа должна оставаться действующей и реагировать соответствующим образом (например, сообщать об ошибках).
• Документированность.Хорошая программа должна быть соответствующим образом документирована. Минимальным объемом документации является листинг программы, включающий достаточное количество комментариев к программе.
Важность того или иного критерия зависит от решаемой задачи и от того, в каких обстоятельствах разработана программа, а также от того, в какой среде ока используется. Нет ни малейшего сомнения в том, что требование к правильности имеет наивысший приоритет. Таким задачам, как обеспечение удобства для чтения, дружественности, модифицируемости, надежности и наличия документации, обычно придается, по крайней мере, не меньший приоритет, чем задаче обеспечения эффективности.
В данной главе приведены некоторые общие рекомендации по достижению на практике описанных выше критериев. Одно из важных правил состоит в том, что вначале нужно обдумать решаемую задачу и только после этого приступать к фактическому написанию кода на используемом языке программирования. После достижения достаточного уровня понимания задачи и формулировки тщательно продуманного решения фактическое написание кода становится быстрым и легким, поэтому повышается вероятность того, что вскоре будет составлена правильная программа.
Широко распространенная ошибка состоит в том, что написание кода начинается еще до полного понимания постановки задачи. Основной причиной того, почему прсждсврсмог начало процесса написания кода не рекомендуется, состоит в том, что размышление о поставленной задаче и поиск идей для ее решения должны осуществляться в терминах, в наибольшей степени соответствующих данной задаче. Но эти термины обычно не имеют ничего общего с синтаксисом используемого языка программирования и могут включать утверждения на естественном языке и графические иллюстрации к рассматриваемым понятиям.
Подобная формулировка решения должна быть переведена на язык программирования, но сам процесс перевода может оказаться нелегким. Один из удобных подходов состоит в использовании принципа поэтапного усовершенствования. В этом слу-чпе первоначальная формулировка решения рассматривается как "решение верхнего уровня", а окончательная программа - как "решение нижнего уровня".
В соответствии с принципом поэтапного усовершенствования окончательная программа разрабатывается в результате применения последовательности преобразований, или "усовершенствований" первоначального решения. Работа начинается с первого варианта решения, относящегося к верхнему уровню, а затем продолжается как ряд решений; все они являются эквивалентными, но каждое решение в этой последовательности представлено с большей степенью детализации. На каждом этапе усовершенствования концепции, использовавшиеся в предыдущих формулировках, прорабатываются более подробно, и их представление становится ближе к применяемому языку программирования. Но следует учитывать, что усовершенствования относятся и к определениям процедур, и к структурам данных. На начальных этапах обычно приходится иметь дело с более абстрактными, крупными единицами информации, структура которых уточняется позже.
Такая стратегия нисходящего поэтапного усовершенствования программы имеет следующие преимущества:
• она допускает использование приблизительных формулировок решений в тер
минах, наиболее соответствующих рассматриваемой задаче;
4асть I. Язык Prolog
• в терминах подобных мощных понятий решение обычно выражается кратко и
просто, поэтому чаще всего оказывается правильным;
• каждый этап усовершенствования может быть небольшим для того, чтобы бы
ло достаточно интеллектуальных ресурсов для его осуществления; в таком
случае преобразование текущего решения в новое, более подробное представле
ние, по всей вероятности, должно быть правильным, и таким же будет резуль
тирующее решение на следующем уровне детализации,
В случае языка Prolog речь может идти о поэтапном усовершенствовании отношений. Если задача требует решения алгоритмическими способами, можно также рассуждать об усовершенствовании алгоритмов исходя из процедурной трактовки языка Prolog.
Для того чтобы правильно уточнить решение на некотором уровне детализации и ввести полезные концепции на следующем, более низкой уровне, нужны идеи. Поэтому процесс программирования является творческим, особенно для начинающих. С накоплением опыта программирование постепенно превращается из искусства в мастерство. Но всегда остается актуальным основной вопрос о том, где найти нужные идеи. Большинство идей приходит с опытом, приобретенным в результате успешного решения аналогичных задач, А если непосредственное программное решение неизвестно, может помочь изучение подобной задачи. Еще одним источником идей является повседневная жизнь. Например, если задача состоит в написании программы сортировки списка элементов, идея может возникнуть в результате поиска ответа на такой вопрос: "Как я сам сортирую комплект экзаменационных бумаг в соответствии с алфавитным порядком фамилий студентов?"
Общие принципы качественного программирования, кратко описанные в этом разделе, в основном распространяются и на язык Prolog. Некоторые дополнительные сведения, имеющие непосредственное отношение к языку Prolog1, представлены в следующих разделах.