Изменить размер шрифта - +
Авторы дают советы относительно того, что нужно, чтобы программа отличалась высокой производительностью, эффективностью работы и способностью правильно развиваться. Один из их главных принципов – «Заменяйте повторяющиеся выражения обращениями к функциям». К примеру, если программа должна вычислить площадь трех треугольников, для этого ей не нужно иметь три разные команды, в каждой из которых содержится отдельная копия формулы вычисления площади треугольника с координатами одного из треугольников. Вместо этого формула должна быть указана в программе один раз. Должна быть функция «вычисление площади треугольника» и слоты X, Y и Z, которые могут заполняться любъини координатами треугольника. Эта функция может использоваться трижды, при этом слоты X, Y и Z будут заполняться координатами, полученными из вводных данных. Описанный принцип устройства приобретает еще большую значимость, когда функция превращается из линейной формулы в многоступенчатую подпрограмму; на этом принципе основаны следующие ниже взаимосвязанные максимы, которым, кажется, следовал и естественный отбор, когда создавал наше модульное, многоформатное мышление:

Разбивайте программу на модули.

Используйте подпрограммы.

Каждый модуль должен выполнять одну функцию, но хорошо.

Убедитесь в том, что в каждом модуле что-то локализовано.

Ввод и вывод выделяйте в подпрограммы.

Второй принцип отражен в следующей максиме:

Выбирайте такое представление данных, которое упрощает программу.

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

А если вас привлекает интеллектуальная стратосфера, в которой объединены «сложные системы» всех типов, вас, вероятно, заинтересует аргумент Герберта Саймона о том, что модульная структура компьютера и мозга – это лишь частный случай модульной, иерархической организации всех сложных систем. Тела состоят из тканей, сделанных из клеток, состоящих из органелл; вооруженные силы включают в себя армии, каждая из которых состоит из дивизий, разделенных на батальоны, состоящие из взводов; книги состоят из глав, разделенных на части, разделы, абзацы и предложения; империи состоят из стран, областей и территорий. Эти «почти разложимые» системы определяются масштабными взаимодействиями между элементами одного и того же компонента и менее многочисленными взаимодействиями между элементами разных компонентов. Сложные системы представляют собой иерархии модулей, потому что только элементы, увязанные друг с другом в пределах одного модуля, могут оставаться стабильными достаточно долго, чтобы монтироваться в более крупные и еще более крупные модули. Саймон приводит аналогию с двумя часовщиками, которых звали Хора и Темпус:

Каждые часы, изготовленные мастерами, состояли примерно из 1000 деталей. Темпус сконструировал свои таким образом, что если одни часы были частично собраны и ему приходилось отложить их – скажем, чтобы ответить на звонок, – они тут же рассыпались на части, и приходилось собирать их сначала…

Часы, которые изготавливал Хора, были не менее сложными, чем у Темпуса.

Быстрый переход