Урок №25. Разработка ваших первых программ



Книга Урок №25. Разработка ваших первых программ

При создании программного обеспечения, обычно возникает определенная задача, которую необходимо решить. Новички часто сталкиваются с трудностями на этапе превращения концепции решения проблемы в конкретный код. Однако важно помнить, что разработка программы начинается задолго до того, как приступить к написанию кода.

Во многих случаях программирование можно сравнить с архитектурой. Попробуйте построить дом без архитектурного плана - получится лишь кривое строение с протекающей крышей. Точно так же, если начать программировать без составления плана, вы столкнетесь с множеством проблем, на решение которых уйдет гораздо больше времени, усилий и нервов, чем на разработку хорошего плана заранее.

Шаг №1: Определите проблему

Первым шагом является выявление проблемы, которую ваше программное обеспечение будет решать. Желательно сформулировать ее в одном или двух предложениях. Например:

Несмотря на то, что этот шаг кажется тривиальным, он все равно остается ключевым. Не стоит забывать, что самая большая ошибка, которую можно совершить - это создать программу, которая не выполняет те задачи, которые вам необходимы!

Шаг №2: Определите свой инструментарий, цели и план бэкапа

На данном этапе опытные программисты могут обнаружить еще много дополнительных аспектов:

Обычно новички не сталкиваются с большим количеством вопросов: "Я пишу программу для себя, работаю в одиночку, на своей операционной системе, используя свою среду разработки, и буду пользоваться этой программой только я". Все довольно просто.

Если вы занимаетесь более серьезной работой, то необходимо обязательно обдумать вопрос создания резервной копии вашей программы или проекта. Просто копирование кода в другую папку на ноутбуке уже лучше, чем ничего, но это не гарантирует безопасность данных. В случае сбоя операционной системы вы можете потерять все свои файлы. Эффективная стратегия резервного копирования включает в себя создание копии кода вне вашей основной ОС, например:

Шаг №3: Разбейте проблему на части

В повседневной жизни мы часто сталкиваемся с сложными задачами, решение которых может быть непростым. Для того чтобы понять, как справиться с ними, можно прибегнуть к методу разделения на более мелкие части (или методу «разбиения на подзадачи»). Вместо того чтобы пытаться решить одну огромную задачу, мы разбиваем ее на несколько более простых подзадач. Если даже эти подзадачи оказываются слишком сложными, их также можно разделить на более мелкие. И таким образом мы продолжаем делить задачу на более мелкие части до тех пор, пока каждая из них не станет легко решаемой.

Давайте проиллюстрируем это на конкретном примере. Предположим, что мы должны подготовить презентацию о картофеле. В данный момент наш список задач выглядит так:

Теперь задача стала более простой, так как у нас есть список подзадач, на которые мы можем сосредоточиться поочередно. Однако в данном случае задача "Поиск информации о картошке" звучит нечетко, поэтому ее необходимо дополнительно разбить на подпункты:

Существует еще один способ построения иерархии - метод "от меньшего к большему". Давайте рассмотрим это на конкретном примере.

Для большинства из нас необходимо ежедневно посещать работу (школу/университет) в будние дни. Предположим, что перед нами стоит задача решить проблему "перехода от постели к рабочему месту". Если бы нас спросили, какие действия мы предпринимаем перед тем, как отправиться на работу, мы могли бы ответить примерно следующее:

Путем применения подхода "от простого к сложному" мы можем организовать задачи в группы и установить их иерархию:

Применение таких иерархий является весьма полезным в области программирования для определения общей структуры программы. Задача на самом верхнем уровне (например, "Написать отчет о картошке" или "От постели к работе") выступает в качестве функции main() (поскольку это основная проблема, которую необходимо решить). Подзадачи превращаются в функции внутри программы.

Шаг №4: Определите последовательность событий

Сейчас, когда у вас есть структура программы, настало время задаться вопросом: "Как же соединить все эти элементы воедино?". Первым шагом будет определение последовательности событий. Например, когда вы просыпаетесь утром, в какой последовательности вы выполняете перечисленные выше дела? Вероятно, следующим образом:

При разработке калькулятора мы бы предложили следующую последовательность заданий:

Содержание функции main() определяется данным списком:

Или если речь идет о калькуляторе:

Шаг №5: Определите данные ввода и данные вывода на каждом этапе

После установления порядка выполнения задач и определения последовательности событий, необходимо определить, какие данные будут использоваться для ввода и вывода на каждом этапе.

К примеру, первая функция из приведенного выше примера - getUserInput(), довольно проста. Нам нужно получить число от пользователя и вернуть его обратно вызывающей стороне. Таким образом, прототип функции будет выглядеть так:

int getUserInput ( ) ;

В примере с калькулятором, функции calculateResult() требуется 3 ввода данных: два числа и 1 математический оператор. При вызове calculateResult() у нас уже должны быть 3 фрагмента данных, которые мы будем использовать в качестве параметров функции . Функция calculateResult() вычисляет значение результата, но не выводит его. Следовательно, необходимо вернуть этот результат в качестве возвращаемого значения обратно в caller, чтобы другие функции также могли использовать его.

Учитывая вышеизложенное, прототип функции принимает следующий вид:

int calculateResult ( int input1 , int op , int input2 ) ;

Шаг №6: Позаботьтесь о деталях

Для успешного завершения этапа необходимо выполнить все подпункты из структуры задач. Разбивая задание на более мелкие части, можно легко выполнить каждую из них. Например:

Шаг №7: Соедините данные ввода с данными вывода в программе

И, в заключение, последний этап заключается в объединении входных данных с выходными данными. Например, можно передать результат функции calculateResult() в качестве входных данных функции printResult(), чтобы последняя могла вывести результат. Обычно в таких ситуациях используются промежуточные переменные для временного хранения результата и его передачи между функциями. Например:

// Переменная result - это промежуточная переменная, которая используется для передачи выходного значения функции calculateResult() во входные данные функции printResult()

int result = calculateResult ( input1 , op , input2 ) ;

printResult ( result ) ;

Подтвердите, что предложенный вариант более читабельный, чем вариант без использования временных переменных (приведенный ниже):

printResult ( calculateResult ( input1 , op , input2 ) ) ;

Давайте изучим уже готовую версию программы-калькулятора, её организацию и передачу информации:

В данном контексте представлены некоторые идеи, которые до сих пор не были рассмотрены: применение условного оператора if и использование оператора равенства == для сравнения двух объектов. Если вы не до конца уловили суть, не стоит беспокоиться — мы более подробно изучим эти концепции на предстоящих занятиях.

Советы

Давайте начнем с простых программ. Часто начинающие программисты ставят себе слишком высокие цели для своих первых проектов. Например, "Я хочу создать игру с графикой, звуком, монстрами, подземельями и городом, где можно торговать найденными предметами". Если вы попытаетесь сделать что-то подобное в самом начале своего пути, то скорее всего потеряете интерес к программированию. Вместо этого, начните с более простых задач, например, "Я хочу написать программу, которая будет отображать 2D-поле на экране".

Постепенно расширяйте функционал. Как только вы создали простую программу, которая работает без ошибок, следующим шагом должно быть добавление новых возможностей. Например, после того, как вы научитесь отображать 2D-поле на экране, добавьте персонажа, который сможет перемещаться по этому полю. Затем, когда вы освоите перемещение, добавьте стены, которые будут препятствовать движению. После построения стен создайте город. После создания города добавьте персонажей-продавцов. Такой пошаговый подход позволит избежать перегрузки информацией и поможет вам понять, с чего начать, что делать дальше и в какой последовательности.

Для достижения максимальной эффективности в работе важно сосредоточиться только на одной задаче за раз. Не стоит пытаться решить все проблемы сразу, лучше уделить внимание одному делу. Лучше иметь одно завершенное дело и несколько невыполненных, чем несколько частично выполненных задач. Разбивая свое внимание на несколько направлений, вы рискуете допустить много ошибок.

Для успешного программирования важно тестировать каждый новый блок кода. Начинающие разработчики часто пытаются написать весь код за один раз, что в итоге приводит к сотням ошибок при компиляции проекта. Поэтому после написания каждого отдельного участка кода необходимо сразу же провести компиляцию и тестирование. Если что-то не работает, вы сразу увидите проблему и сможете её исправить гораздо быстрее. Как только убедитесь, что код работает корректно, можно переходить к следующему блоку и повторить процесс. Хотя тестирование может занять больше времени, в итоге ваш код будет работать так, как задумано.

Многие новички могут пропустить некоторые из этих этапов и рекомендаций, так как это может показаться менее увлекательным, чем сам процесс написания кода. Однако хорошая новость заключается в том, что после того, как вы усвоите все эти принципы, они станут для вас естественными в ходе разработки ваших программных продуктов.

167   0  

Comments

    Ничего не найдено.