Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
• Выглядит ли задача решаемой при имеющихся времени, опыте и инструментах? Мало смысла начинать проект, который вы не сможете завершить. Если у вас мало времени на реализацию (включая тестирование) программы, в которой были бы учтены все требования, то лучше и не начинать ее писать. Потребуйте больше ресурсов (особенно времени) или (лучше всего) измените требования, чтобы упростить задачу.
• Постарайтесь разбить программу на небольшие части. Даже самая маленькая программа, решающая реальную задачу, достаточно велика, для того чтобы разбить ее на части.
• Знаете ли вы, какие инструменты, библиотеки и тому подобные ресурсы вам могут понадобиться? Ответ почти всегда положительный. Даже на самых ранних этапах изучения языка программирования в вашем распоряжении есть небольшие фрагменты стандартной библиотеки С++. Позднее вы узнаете
• Проанализируйте части решения, которые описаны отдельно (и, возможно, используются в разных местах программы или даже в других программах). Для этого требуется опыт, поэтому в данной книге мы приводим много примеров. Мы уже использовали векторы (класс
• Создавайте небольшие и ограниченные версии программы, решающие ключевые части вашей задачи. Начиная работу, мы редко хорошо понимаем задачу. Мы часто так думаем (разве мы не знаем, что такое калькулятор), но на самом деле это не так. Только сочетание размышлений над задачей (анализ) и экспериментирования (проектирование и реализация) дает нам солидное понимание того, что требуется для создания хорошей программы. Итак, пишите небольшие и ограниченные версии, чтобы достичь следующих целей.
• Выявить свое понимание идеи и требуемые инструменты.
• Выявить необходимость изменений, чтобы сделать задачу проще. Анализируя задачу и создавая первоначальные варианты программы, не стремитесь решить все задачи сразу. Используйте возможности обратной связи, которую дает тестирование.
Иногда такая ограниченная первоначальная версия называется прототипом (prototype). Если первая версия не работает или работает очень плохо (что вполне вероятно), отбросьте ее и создайте другую. Повторяйте этот процесс до тех пор, пока не достигнете желаемого. Не барахтайтесь в путанице; со временем она будет лишь возрастать.
• Создавайте полномасштабную версию, используя части первоначальной версии. В идеале программа должна вырастать из отдельных компонентов, а не создаваться единым блоком. В противном случае придется рассчитывать на чудо и ожидать, что непроверенная идея окажется работоспособной и позволит достичь желаемого.
6.3. Назад к калькулятору!
Как мы хотим взаимодействовать с калькулятором? Это просто: мы знаем, как использовать потоки
Эти выражения, т.е. 2+2 и 2+2*3, должны быть введены пользователем; все остальное сделает программа. Для приглашения к вводу мы используем слово “
Обсуждая проектирование и анализ, мы будем называть такие примеры прецедентами использования (use cases). Впервые сталкиваясь с разработкой калькулятора, большинство людей сразу приходят к следующей логике программы:
Этот набросок, конечно, не программа; он называется псевдокодом (pseudo code). Псевдокоды обычно используются на ранних этапах проектирования, когда еще не совсем ясно, какой смысл мы вкладываем в обозначения. Например, является ли слово “calculate” вызовом функции? Если да, то каковы его аргументы? Для ответа на этот вопрос просто еще не настало время.
6.3.1. Первое приближение
На этом этапе мы действительно еще не готовы написать программу, имитирующую функции калькулятора. Мы просто мало думали об этом, но размышления — трудная работа, а, как большинство программистов, мы стремимся сразу писать какой-то код. Итак, попробуем написать простую программу-калькулятор и посмотрим, к чему это приведет. Первое приближение может выглядеть примерно так:
Иначе говоря, программа считывает пару значений, разделенных оператором, например