Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
Послесловие
Не считаете ли вы, что мы придаем ошибкам слишком большое значение? Новички могут подумать именно так. Очевидная и естественная реакция такова: “Все не может быть настолько плохо!” Именно так, все именно настолько плохо. Лучшие умы планеты поражаются и пасуют перед сложностью создания правильных программ. По нашему опыту, хорошие математики, как правило, недооценивают проблему ошибок, но всем ясно, что программ, которые с первого раза выполняются правильно, очень немного. Мы вас предупредили! К счастью, за пятьдесят лет мы научились организовывать код так, чтобы минимизировать количество проблем, и разработали методы поиска ошибок, которые, несмотря на все наши усилия, неизбежны. Методы и примеры, описанные в этой главе, являются хорошей отправной точкой.
Глава 6.
“Программирование — это понимание”.
Кристен Нюгорд (Kristen Nygaard)
Создание программы предполагает последовательное уточнение того, что вы хотите сделать и как вы желаете это выразить. В этой и следующей главах мы разработаем одну программу, пройдя весь путь от первой еще неясной идеи через этапы анализа, проектирования, реализации, тестирования. повторного проектирования и повторной реализации. Наша цель — дать вам представление о способе мышления программиста, создающего свою программу. По ходу изложения мы обсудим структуру программы, типы, определенные пользователем, и обработку входной информации.
6.1. Задача
• Иллюстрирует методы проектирования и программирования.
• Дает возможность исследовать разные варианты решения, которые должен найти программист, и учитывает ограничения, которые наложены на это решение.
• Не требует слишком большого количества новых языковых конструкций.
• Достаточно сложная и требует размышлений над ее проектированием.
• Допускает много вариантов решения.
• Решает понятную задачу.
• Решает задачу, которая заслуживает решения.
• Имеет решение, которое достаточно невелико, чтобы его можно было просто и ясно описать и понять.
Мы выбрали следующую задачу: “Поручить компьютеру выполнить простые арифметические операции, введенные пользователем”. Иначе говоря, мы хотим создать простой калькулятор. Совершенно очевидно, что такие программы полезны; каждый настольный компьютер поставляется с такой программой, и вы можете даже купить карманный калькулятор, который выполняет только такие программы.
Например, если вы введете строку
то программа должна ответить
К сожалению, такая программа не может сделать нам больше, чем программное обеспечение, уже установленное на компьютере, но от первой программы не следует требовать слишком многого.
6.2. Размышления над задачей
С чего начать? Просто немного подумайте о задаче и о том, как ее можно решить. Сначала поразмышляйте о том, что должна делать программа и как вы хотели бы с ней взаимодействовать. Затем подумайте о том, как написать такую программу. Попытайтесь написать краткое изложение идеи, лежащей в основе решения, и найдите изъяны в своей первой идее. По возможности обсудите задачу и способы ее решения со своими друзьями. Объяснение идеи своим друзьям удивительным образом позволяет понять ее недостатки и способы ее создания; бумага (или компьютер) не разговаривает с вами и обычно не соответствует вашим предположениям. В принципе проектирование — это коллективная деятельность.
К сожалению, не существует
универсальной стратегии, которая удовлетворила бы всех людей и решила бы все задачи. Есть множество книг, авторы которых обещают вам помочь при решении задач, а также огромное количество книг, посвященных проектированию программ. Наша книга не относится к такой литературе. Мы изложим основы общей стратегии для решения небольших задач, с которыми вы можете столкнуться. После этого быстро перейдем к реализации этой стратегии при разработке калькулятора.Рекомендуем при чтении наших комментариев к программе, выполняющей функции калькулятора, занимать относительно скептическую позицию. Для реализма мы выполним несколько итераций разработки программы, создав несколько версий и продемонстрировав идеи, лежащие в основе каждой из них. Очевидно, что большинство из этих идей являются незавершенными и даже ошибочными, иначе нам пришлось бы слишком рано закончить эту главу. По мере продвижения вперед мы приведем примеры разных принципов и рассуждений, которых постоянно придерживаются проектировщики и программисты. Следует иметь в виду, что в этой главе мы еще не создадим достаточно удовлетворительный вариант программы, отложив эту задачу до следующей главы.
Пожалуйста, имейте в виду, что путь, ведущий в окончательному варианту программы и проходящий через промежуточные решения, идеи и ошибки, не менее важен, чем сама программа, и более важен, чем технические детали языка программирования, с которыми мы работаем (они будут рассмотрены позднее).
6.2.1. Стадии разработки программы
Рассмотрим некоторые термины, связанные с разработкой программ. Работая над решением задачи, вы обязательно несколько раз пройдете следующие этапы.
• Проектирование. Разрабатываем общую структуру системы, решая, из каких частей она должна состоять и как эти части должны взаимодействовать друг с другом. В качестве составной части проектирования следует решить, какие инструменты, например библиотеки, могут пригодиться при разработке программы.
• Реализация. Записываем код, отлаживаем его и тестируем, для того чтобы убедиться, что программа делает то, что нужно.
6.2.2. Стратегия
• Какая задача должна быть решена? Для того чтобы ответить на этот вопрос, необходимо прежде всего попытаться уточнить, что вы пытаетесь сделать. Как правило, для этого формулируют описание задачи, т.е. пытаются понять, в чем заключается ее суть. На этом этапе вы должны встать на точку зрения пользователя (а не программиста); иначе говоря, должны задавать вопросы о том, что должна делать программа, а не о том, как она будет это делать. Спросите: “Что эта программа может сделать для меня?” и “Как бы я хотел взаимодействовать с этой программой?” Помните, большинство из нас являются опытными пользователями компьютеров.
• Ясна ли постановка задачи? Для реальных задач на этот вопрос никогда нельзя ответить положительно. Даже студенческое упражнение бывает трудно сформулировать достаточно точно и конкретно. Поэтому попытайтесь уточнить постановку задачи. Было бы обидно решить неправильно поставленную задачу. Другая ловушка состоит в том, что вы можете поставить слишком много вопросов. Пытаясь понять, что вы хотите, легко увлечься и стать претенциозным. Почти всегда лучше задавать поменьше вопросов, чтобы программу было легче описать, понять, использовать и (возможно) реализовать. Убедившись, что этот подход работает, можно создать более изощренную “версию 2.0”, основанную на вашем опыте.