Процесс разработки ПО

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

Традиционно выделяют следующие основные этапы ЖЦ ПО:

- анализ требований,

- проектирование,

- кодирование (программирование),

- тестирование и отладка,

- эксплуатация и сопровождение.

Существующие модели ЖЦ определяют порядок выполнения этапов в ходе разработки, а также критерии перехода от этапа к этапу.

Главная особенность индустрии ПО состоит в концентрации сложности на начальных этапах ЖЦ (анализ, проектирование) при относительно невысокой сложности и трудоемкости последующих этапов. Более того, нерешенные вопросы и ошибки, допущенные на этапах анализа и проектирования, порождают на последующих этапах трудные, часто неразрешимые проблемы и, в конечном счете, приводят к неуспеху всего проекта. [Калянов Г.Н. CASE-технологии. Консалтинг при автоматизации бизнес процессов. 2-е изд. – М.: Горячая линия – Телеком, 2000. – 320 с., ил. Стр. 20 - 22]

Первые четыре этапа определяют ЖЦ разработки ПО и (более или менее подробно) рассматриваются в данном курсе.

В [11, стр. 36-37] дается разграничение понятий метода и методологии. Метод – это последовательный процесс создания моделей, которые описывают вполне определенными средствами различные стороны разрабатываемой программной системы. Методология – это совокупность методов, применяемых в ЖЦ разработки ПО и объединенных одним общим философским подходом. Методы важны, так как они упорядочивают процесс создания сложных программных систем.

Методы появились как ответ на растущую сложность программных систем. В 60-70-е годы было разработано много методов, помогающих справиться с растущей сложностью программ. В настоящее время все методы можно разделить на три группы:

- метод структурного проектирования сверху вниз,

- метод потоков данных,

- метод объектно-ориентированного проектирования.

Наибольшее распространение получило структурное проектирование по методу сверху вниз. Структурное проектирование использует следующий подход, определяемый топологией традиционных языков высокого уровня: применяется алгоритмическая декомпозиция для разбиения большой задачи на более мелкие. И сейчас значение структурного подхода осталось прежним, но, как замечает Стейн, «оказалось, что структурный подход не работает, если объем программы превышает приблизительно 100 000 строк» (цит. по [11, стр. 36]).

Объектно-ориентированный подход включает в себя объектно-ориентированные анализ, проектирование и программирование.

ОО Анализ – на этом этапе определяются абстракции и их общие свойства. В процессе анализа предметной области выделяются абстракции, наличие которых существенно упрощает разработку прикладной задачи. Рассмотрим, например, понятие (абстракцию) рациональная дробь. В С++ абстракции определяются с помощью классов (класс – абстракция, экземпляр класса – конкретный объект). Определим общие свойства для класса Рациональная дробь: должны иметь возможность хранить корректные значения дроби со знаком, должны иметь возможность выполнять все арифметические операции и операции ввода-вывода – или, другими словами, должны иметь возможность использовать их в программе так же, как и базовые числовые типы языка.

ОО Проектирование – на этом этапе необходимо сначала точно сформулировать все особенности поведения объектов выделенных классов, а затем четко определить интерфейс выделенных классов на конкретном языке программирования. После этого разработка приложения может быть разделена на два направления, работа по которым может выполняться относительно независимо друг от друга. Одно направление предполагает разработку и реализацию классов – или, другими словами, специальных инструментальных средств, ориентированных на решение конкретной задачи. Другое направление связано с разработкой и реализацией самого приложения (прикладной программы – ПП) в терминах новых классов (как бы с использованием новой версии языка программирования, включающей в себя новые типы данных, необходимые для конкретной ПП). Реализация класса скрыта от его использования и не должна мешать применению класса в ПП. Если требуется изменить реализацию – это не должно приводить к изменению самого приложения.

Например, для упомянутого ранее класса Рациональная дробь на данном этапе можно ввести следующие уточнения: состояние класса – числитель и знаменатель дроби, знаменатель обязательно отличен от нуля и всегда положителен (знак дроби определяет ее числитель); числитель и знаменатель дроби всегда представлены в виде взаимно простых чисел. Поведение класса – набор необходимых операций из постановки задачи (математические операции, ввод-вывод, сравнения и т.п.), представленных в виде привычных знаков арифметических операций (+, - и т.п.; это возможно при использовании языка программирования С++). Теперь можно независимо разрабатывать класс Рациональная дробь и ПП.

ОО Программирование и отладка – используются конкретные инструментальные средства; в нашем распоряжении – Borland С++ или Visual C++ (в зависимости от лабораторного класса). Конечно, на этом этапе при отладке ПП должна быть доступна какая-то реализованная версия класса Рациональная дробь. Изменения и дополнения, которые могут быть внесены в класс Рациональная дробь, не должны требовать перепрограммирования ПП. Модификация ПП и изменения в предметной области могут привести к появлению дополнительных требований к классу; опять же новые возможности класса не должны оказать серьезное влияние на старые уже существующие версии ПП.

Определение объектно-ориентированного языка программирования (ООЯП)

ООЯП – это язык программирования, обладающий набором определенных свойств. Главными свойствами ООЯП являются абстракция, инкапсуляция, наследование, полиморфизм.

Абстракция – это свойство, позволяющее создавать новые типы данных, выделяя общие абстрактные свойства этих типов.

Инкапсуляция – скрытие информации; механизм, который объединяет данные и код, манипулирующий с этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования.

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

Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Например, в не ОО языках программирования нахождение абсолютной величины числа требует нескольких различных функций – в зависимости от типов аргумента и результата (например, в С – это abs() для данных типа int, labs() для данных типа long и fabs() для данных типа double). В ООЯП каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретно версия функции действительно выполняется.