Процесс разработки программного обеспечения — это последовательность действий, конечным продуктом которой является компьютерная программа. За прошедшие 20 лет были выделены четко определенные этапы процесса разработки ПО. В данном разделе рассматриваются лишь наиболее важные из них.
1. Создание спецификации программы. Определение требований к программе.
2. Проектирование программы. Разработка концепции, позволяющей воплотить требования спецификации в работающей программе. Она определяет пути реализации функциональности, описанной в спецификации, средствами языка программирования высокого уровня, например С#.
3. Написание программы. Разработка и написание исходного кода программы.
4. Тестирование и отладка программы. Необходимо проверить, отвечает ли программа требованиям, определенным в спецификации.
Эти этапы должны выполняться в указанной здесь последовательности. Однако иногда возникают ситуации, когда для продолжения работы над программой необходим возврат к предыдущему этапу. Рассмотрим каждый из этапов более подробно.
|
|
Создание спецификации программы. Определение цели — первый шаг к ее достижению. Часто решение скрыто в самой спецификации. Известно, что правильно сформулированная проблема уже содержит свое решение. Вот пример очень простой спецификации программы: "Программа должна уметь вычислять среднее значение двух чисел".
Проектирование программы. Проектирование программы может включать множество различных действий в зависимости от размера и характера конкретного проекта. Большой проект может включать несколько стадий, описанных ниже.
1. Разделение всего проекта на различные функциональные подсистемы. Примерами подсистем могут служить пользовательские интерфейсы, генераторы отчетов, интерфейсы к базам данных.
2. Разбиение каждой подсистемы на модули. Термин "модуль" очень гибок, и принимает различные значения в разных контекстах. Здесь модуль — это совокупность данных и функций, которые могут работать с этими данными. Функции, реализованные в модуле, позволяют ему во взаимодействии с другими модулями данной подсистемы выполнять требования, адресованные к ней. Функция обычно имеет одну очень узкую цель. Она состоит из набора конкретных инструкций, исполняемых одна за другой. Примерами функций могут быть "Найти квадратный корень числа" или "Найти наибольшее значение в списке". В разных высокоуровневых языках эту концепцию называют по-разному: процедуры, функции, подпрограммы. В С# функции называются методами.
3. Определение данных и методов в каждом модуле. Службы, предлагаемые модулями, делятся на удобные части, достаточно компактные, чтобы их можно было реализовать в рамках одного метода. Каждой части модуля назначается свой метод и, соответственно, каждый метод получает определенную функциональность. И, наконец, создатели программы определяют данные, которые могут быть представлены этим модулем.
|
|
4. Внутреннее проектирование методов. Проектированием на этом уровне обычно занимается программист, разрабатывающий конкретный метод. На данном этапе разрабатываются алгоритмы выполнения очень узких, конкретных задач и пишутся первые операторы на языке высокого уровня, — например, на С#.
Написание программы. "Настоящие" операторы пишутся на С#. Данная часть процесса создания ПО обязательно присутствует в проектах любого масштаба.
Тестирование и отладка программы. Программа подвергается различным тестам (как во время написания, так и после него). Тесты необходимы, чтобы убедиться, что программа выполняет именно то, что должна выполнять. Тестирование, в частности, позволяет обнаружить (и исправить) ошибки, допущенные в процессе проектирования и написания программы. Чтобы написать корректную программу, необходимо с тщательностью подходить к проектированию всех ее элементов и написанию исходного кода. Однако людям свойственно ошибаться, и ошибки (им соответствует английское слово bugs) закрадываются в программу самыми разными, иногда совершенно неожиданными путями. Процесс поиска и устранения ошибок называется отладкой (английский термин — debugging, от bug).
Небольшие, неформальные проекты (например, многие из программ, с которыми читатель столкнется в данной книге) часто включают лишь уровни 3 и 4. Программист может выполнить их, сидя перед компьютером. Стадия проектирования программы реализуется либо в голове у программиста, либо на листке бумаги в форме нескольких диаграмм, либо в виде поиска нескольких стандартных алгоритмов в учебнике.
Процесс исполнения программы на С#
Что происходит, когда программа, написанная на С#, исполняется компьютером? Несмотря на то, что С# абстрагируется от аппаратного обеспечения, используемого на конкретной машине, программы С#, конечно же, используют функции процессора и оперативной памяти.
На (рис. 1) показаны основные элементы процесса исполнения программы на С#. Прежде всего, необходимо написать программу на С#, а затем сохранить ее в долговременной памяти — например, на жестком диске (1 на рис. 1). Пусть файл программы назван prog_1.cs. Следует обратить внимание на расширение.cs, — общее для всех файлов с исходным кодом С#.
Рис.1. Элементы исполнения программы на С#
Когда необходимо, программа или та ее часть, которая должна исполняться, загружается в оперативную память (2). Затем процессор исполняет инструкции, содержащиеся в программе. Этот процесс называется выполнением или исполнением программы.
Программа может получить данные от пользователя (3) в форме нажатий клавиш на клавиатуре или движений мыши и нажатий ее кнопок. Данные могут также поступить к программе из иных источников, например из локальной сети или Internet. Данные могут быть прочитаны из файлов, хранящихся в долговременной памяти компьютера (4). Например, если программа на С# — текстовый редактор, эти данные могут быть незаконченным письмом, которое сохранил пользователь (5) во время работы в редакторе. И если сегодня нужно закончить это письмо, программа текстового редактора по указанию пользователя загружает его в оперативную память. После завершения работы над письмом оно вновь сохраняется в долговременной памяти — на диске. Во всех случаях при загрузке программы в оперативную память компьютер обеспечивает вывод в форме представления символов документа на экране. Если, скажем, требуется распечатать письмо, вывод обеспечивается через принтер.