6.1. Задача
Создание программы начинается с постановки задачи; иначе говоря, должна существовать задача, которую вы хотите решить с помощью своей программы. Понимание этой задачи является основной предпосылкой хорошей задачи. Помимо всего прочего, программа, решающая неправильно поставленную задачу, будет редко применяться, хотя может быть очень элегантной. Существуют счастливые случаи, когда программа оказывается полезной для решения задачи, которую никто не собирался решать, но на это везение рассчитывать не стоит. Мы хотим, чтобы программа просто и ясно решала поставленную задачу. Как может выглядеть программа на этом этапе? Перечислим основные характеристики такой программы.
• Иллюстрирует методы проектирования и программирования.
• Дает возможность исследовать разные варианты решения, которые должен найти программист, и учитывает ограничения, которые наложены на это решение.
• Не требует слишком большого количества новых языковых конструкций.
• Достаточно сложная и требует размышлений над ее проектированием.
• Допускает много вариантов решения.
• Решает понятную задачу.
• Решает задачу, которая заслуживает решения.
• Имеет решение, которое достаточно невелико, чтобы его можно было просто и ясно описать и понять.
Мы выбрали следующую задачу: “Поручить компьютеру выполнить простые арифметические операции, введенные пользователем”. Иначе говоря, мы хотим создать простой калькулятор. Совершенно очевидно, что такие программы полезны; каждый настольный компьютер поставляется с такой программой, и вы можете даже купить карманный калькулятор, который выполняет только такие программы.
Например, если вы введете строку
2+3.1*4
то программа должна ответить
14.4
К сожалению, такая программа не может сделать нам больше, чем программное обеспечение, уже установленное на компьютере, но от первой программы не следует требовать слишком многого.
6.2. Размышления над задачей
С чего начать? Просто немного подумайте о задаче и о том, как ее можно решить. Сначала поразмышляйте о том, что должна делать программа и как вы хотели бы с ней взаимодействовать. Затем подумайте о том, как написать такую программу. Попытайтесь написать краткое изложение идеи, лежащей в основе решения, и найдите изъяны в своей первой идее. По возможности обсудите задачу и способы ее решения со своими друзьями. Объяснение идеи своим друзьям удивительным образом позволяет понять ее недостатки и способы ее создания; бумага (или компьютер) не разговаривает с вами и обычно не соответствует вашим предположениям. В принципе проектирование — это коллективная деятельность.
К сожалению, не существует универсальной стратегии, которая удовлетворила бы всех людей и решила бы все задачи. Есть множество книг, авторы которых обещают вам помочь при решении задач, а также огромное количество книг, посвященных проектированию программ. Наша книга не относится к такой литературе. Мы изложим основы общей стратегии для решения небольших задач, с которыми вы можете столкнуться. После этого быстро перейдем к реализации этой стратегии при разработке калькулятора.
Рекомендуем при чтении наших комментариев к программе, выполняющей функции калькулятора, занимать относительно скептическую позицию. Для реализма мы выполним несколько итераций разработки программы, создав несколько версий и продемонстрировав идеи, лежащие в основе каждой из них. Очевидно, что большинство из этих идей являются незавершенными и даже ошибочными, иначе нам пришлось бы слишком рано закончить эту главу. По мере продвижения вперед мы приведем примеры разных принципов и рассуждений, которых постоянно придерживаются проектировщики и программисты. Следует иметь в виду, что в этой главе мы еще не создадим достаточно удовлетворительный вариант программы, отложив эту задачу до следующей главы.
Пожалуйста, имейте в виду, что путь, ведущий в окончательному варианту программы и проходящий через промежуточные решения, идеи и ошибки, не менее важен, чем сама программа, и более важен, чем технические детали языка программирования, с которыми мы работаем (они будут рассмотрены позднее).