Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии и методы программирования. Учебное пособие-1

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
средствам, разрабатывается план создания. Определяются входы и вы­ходы, сущность процессов обработки, системные ограничения (время выполнения, точность, время реакции), методы обработки ошибок.
2. Спецификации
Целью этапа является формализация и документирование выявлен­ных требований. Этот и предыдущий этап являются наиболее ответ­ственными, поскольку исправление допущенных ошибок дорого и тру­доемко.
3. Проектирование
Этап связан с созданием архитектуры ПО и формализацией задач, разработкой алгоритмов обработки данных и выбором программных средств базового и прикладного назначения. При проектировании моду­лей определяют пользовательские интерфейсы программ.
4. Реализация
На этом этапе реализуются проектные решения: кодирование, проек­тирование форм выходных документов, установка технических средств, разработка эксплуатационной документации, которая
дает возможность тем, кто должен использовать и сопровождать программу, разобраться в ее работе с целью расширений программы для других приложений. Для документирования широко используются такие средства, как блок-схемы, программные комментарии и различного рода диаграммы [22–26]. По мере разработки отдельных программных компонентов осуществляется их тестирование и интеграция.
5. Тестирование
Этап обычно
оказывается распределенным во времени. На этом этапе проверяется наличие или отсутствие ошибок в ПО. Тестирование преследует две основные цели:
обнаружение факта неработоспособности модуля; проверку на соответствие модуля спецификации (наличие всех
необходимых функций, отсутствие лишних функций).
Очень важны правильный выбор тестовых данных и разработка ме­тодов тестирования. Тестирование выполняется в итеративном про­цессе совместно с отладкой, при этом нежелательно поручать тестиро­вание авторам программного кода.
6. Сопровождение
Внедрение ИС разбивается на опытную и промышленную стадию
экс-
плуатации ИС, которая начинается после приемки ИС. Осуществляется
11
первоначальная загрузка нормативно-справочной информации, ввод в схему документооборота новых форм документов, обучение пользо­вателей.
7. Развитие
Этот этап является наиболее длительным в ЖЦ ПО. В процессе экс­плуатации ПО регистрируются ошибки, проводится экспертиза проект­ных решений, формулируются требования к модификации ПО в связи с изменениями объекта и функции управления, появлением
новых инфор­мационных технологий. Корректируются программы при изменении условий или места их использования, при этом желательно использо­вать компоненты (модули), созданные для решения ранее поставленных задач, а для этого нельзя рассматривать любую задачу совершенно изо­лированно от задач, которые могут возникнуть в будущем.
Каждый этап разработки ПО влияет на другие этапы
. Требования к задаче должны включать в себя некоторые соображения по плану тести­рования, стандарту документирования, методам сопровождения и воз­можному расширению на другие задачи. Проект программы должен со­держать положения, относящиеся к отладке, тестированию и докумен­тированию. В каждый момент программист выполняет работы, соответ­ствующие сразу нескольким этапам: кодирование, отладка,
тестирова-
ние и документирование нередко оказываются тесно переплетенными.
Общая модель ЖЦ, представленная на рис. 2, в зависимости от спе­цифики, масштаба и сложности проекта и условий, в которых система создается и функционирует, может быть уточнена. В настоящее время известны и используются следующие модели жизненного цикла.
Каскадная модель (водопадная) (рис. 3) предусматривает последо- вательное
выполнение всех этапов проекта в строго фиксированном по­рядке. Переход на следующий этап означает полное завершение работ на предыдущем этапе.
Можно выделить следующие положительные стороны применения
каскадного подхода:
на каждом этапе формируется законченный набор проектной до-
кументации, отвечающий критериям полноты и согласованности;
выполняемые в логической последовательности этапы работ поз-
воляют планировать сроки завершения всех работ и соответствующие ресурсы.
В каскадной модели жизненного цикла ПО не предусмотрены обрат-
ные связи между отдельными этапами, поскольку предполагается, что
12
все проблемные ситуации, выявленные на ранних стадиях, могут быть успешно решены в дальнейшем, однако это не всегда осуществимо. Многие ошибки анализа, проектирования и реализации могут быть вы­явлены только на последующих этапах или только в ходе эксплуатации, что приводит к существенной задержке в получении результатов.
Рис. 3. Каскадная модель жизненного цикла ПО
Реальный процесс создания программного обеспечения никогда полностью не укладывается в такую жесткую схему, постоянно возни­кает потребность в возврате к предыдущим этапам и уточнении или пе­ресмотре ранее принятых решений, поэтому можно говорить о модифи­цированной каскадной модели, в которой предусмотрены возвраты к предыдущим этапам.
Каскадная модель применима в разработке программного
обеспе-
чения для средних и больших проектов, в которых в самом начале про­екта можно достаточно точно и полно сформулировать все требования к программной системе.
Однако даже модифицированная каскадная модель не позволяет оперативно учитывать возникающие изменения и уточнения требова­ний к программной системе. Согласование результатов разработки с пользователями проводится только
в точках, планируемых после за­вершения каждого этапа работ, а общие требования к ПО зафиксиро­ваны в виде технического задания на всё время ее создания. Таким об­разом, пользователи практически не могут убедиться в качестве разра­ботанного продукта до окончания всего процесса разработки и нередко получают программную систему, не удовлетворяющую их
реальным
потребностям.
13
Спиральная модель ЖЦ (рис. 4) была предложена для преодоле­ния перечисленных проблем. Особое внимание уделяется начальным этапам разработки – анализу и проектированию, где реализуемость тех­нических решений и степень удовлетворения потребностей заказчика проверяется путем создания прототипов. Каждый виток спирали соот­ветствует созданию работоспособного фрагмента или версии программ­ной системы.
Рис. 4. Спиральная модель ЖЦ ПО
Это позволяет уточнить требования, цели и характеристики проекта, определить качество разработки, спланировать работы следующего витка спирали. Таким образом, углубляются и последовательно конкре­тизируются детали проекта, и в результате выбирается обоснованный вариант, который удовлетворяет действительным требованиям заказ­чика и доводится до реализации.
14
3. ПРОБЛЕМЫ РАЗРАБОТКИ СЛОЖНЫХ ПРОГРАММНЫХ СИСТЕМ
Сложность – это то, что требует большого труда, усилий; трудно­сти. «Каждая профессия встречает на своем пути свои сложности, кото­рые необходимо преодолевать» [10]. Сложность – характеристика, от­ражающая степень, при которой проектирование, реализация или пове­дение системы или элемента является трудной для понимания или вери­фикации [11]. Фактически сложность определяется количеством ресур­сов, связей задачи, и растет нелинейно по мере роста размеров проекта программ­ной системы.
Программные продукты относятся к самым сложным системам, ко­торые создаются человеком, и программное обеспечение по самой своей природе обладает рядом существенных и неотъемлемых свойств (таких как сложность, незримость и изменяемость), боту [12].
Сложность представляет неотъемлемое свойство программных си­стем, которое проявляется во времени и стоимости создания программ, в объеме или длине текста программ, характеристиках ее логической структуры, задаваемой операторами передачи управления (ветвления, циклы, вызовы подпрограмм и т. д.). «Дополнительно сложность обу­словливается изменением требований к программной системе уже
процессе разработки, в основном из-за того, что само существование
в проекта программной системы часто изменяет проблему»» [13]. Как го­ворит Брукс, «сложность программного обеспечения – отнюдь не слу­чайное его свойство» [12].
Проблемы, связанные со сложностью разработки, характерны для промышленных программных продуктов, которые применяются для ре­шения самых разных задач в сложных системах,
и компонентов, которые требуются для решения какой-либо
которые затрудняют ра-
например таких, как:
15
1) системы с обратной связью, которые управляют или сами управ-
ляются событиями физического мира. Для этих систем ресурсы времени и памяти ограничены;
2) системы поддержания целостности информации объемом в сотни
тысяч записей при параллельном доступе к ним.
3) системы управления реальными процессами и контроля за ними, например, диспетчеризация воздушного или железнодорожного транс­порта.
Системы подобного типа обычно имеют большое время жизни, и от их нормального функционирования зависит большое количество поль­зователей. Для этих систем характерно то, что один разработчик прак­тически не в состоянии охватить все аспекты такой системы.
Можно выделить пять источников сложности программирования:
решаемая задача;
язык программирования;
среда
выполнения программы;
технологический процесс коллективной разработки;
стремление к универсальности и эффективности алгоритмов и ти-
пов данных.
Современные крупномасштабные проекты ПО характеризуются следующими особенностями [14]:
сложностью описания (достаточно большое количество функций, процессов, элементов данных и сложные взаимосвязи между ними, что требует тщательного моделирования и анализа данных и процессов);
высокой технической сложностью, определяемой наличием сово-
купности тесно взаимодействующих подсистем (компонентов), имею­щих свои локальные задачи и цели функционирования;
необходимостью интеграции существующих и вновь разрабаты- ваемых приложений;
отсутствием полных аналогов, ограничивающих возможность ис- пользования каких-либо типовых проектных решений и прикладных си­стем, высокой долей вновь разрабатываемых программных модулей
.
Перечислим дополнительные факторы, увеличивающие сложность разработки программных систем [14].
1. Сложность реальной предметной области. Сложность задачи и порождает сложность программного продукта. Проблемы, которые пытаются решить с помощью программного обеспечения, часто неиз­бежно содержат сложные элементы, а к соответствующим программам
16
предъявляется множество различных, порой взаимоисключающих тре­бований. Эта внешняя сложность проявляется при отсутствии единого взгляда на будущую систему. У пользователей и разработчиков разные взгляды на сущность проблемы, и они делают различные выводы о воз­можных путях ее решения.
2. Сложность определения требований к программным системам. Большое количество факторов, требующих учета, а
также неполное по­нимание разработчиками предметной области и неумение заказчика сформулировать проблему приводят к тому, что требования к системе могут быть неоднозначными (противоречивыми) или неполными.
3. Отсутствие удовлетворительных средств формального описа- ния поведения программных систем. Известные средства визуализа­ции различных аспектов ПО (UML, семейство IDEF и другие [22–26]) не решают полностью этой задачи,
а ранняя детализация на уровне языков программирования увеличивает объем описания разрабатыва­емых продуктов и вызывает трудности при адаптации к изменив­шимся условиям.
4. Коллективная разработка. Вследствие больших объемов ПС раз­работка ведется достаточно большим коллективом специалистов, ино­гда с привлечением субподрядчиков. Обеспечивать целостность и каче­ство проекта в этом случае трудно
из-за сложности организации эффек-
тивного взаимодействия специалистов в таких коллективах.
5. Необходимость увеличения степени повторяемости кодов. Жела­ние использовать ранее созданные компоненты программных систем в дальнейших проектах приводит к их универсализации (усложнению), а также включению не самого эффективного кода в новые разработки.
6. Большая программная система – это крупное капиталовложение, которое
желательно использовать, несмотря на изменение внешних тре­бований, поэтому в процессе эксплуатации приходится решать следую­щие задачи (сопровождать систему):
устранение ошибок, не выявленных в ходе разработки и опытной
эксплуатации;
внесение изменений в систему в ответ на изменившиеся требова-
ния к ней (эволюция системы);
использование всех возможных и
невозможных способов для под-
держания жизни в устаревающей части системе (сохранение).
Все перечисленные факторы существенно увеличивают сложность
разработки программных систем.
17
Основные проблемы разработки сложных программных систем свя­заны с нахождением разумного компромисса (рис. 5) между затратами на разработку (ресурсы и время) и качеством ее результата (возможно­сти). В затраты входят все виды используемых ресурсов, из которых наиболее важны затрачиваемое время, бюджет проекта и персонал.
Рис. 5. Треугольник компромиссов
Удовлетворение пользователей от работы с программой, а следова­тельно, доходы от продаж и предоставления дополнительных услуг и удовлетворение разработчиков от ее создания определяются каче­ством программы, которое включает в себя такие аспекты, как набор предоставляемых возможностей, надежность, удобство использования, гибкость, удобство внесения изменений и исправления ошибок.
От сложности нельзя избавиться, но
можно изменить характери­стики ее проявления, для чего используют различные методологические и технологические подходы, инструментальные среды разработки, ко­торые упрощают создание программ в конкретных областях.
Как отмечает Дейкстра: «Способ управления сложными системами был известен еще в древности – разделяй и властвуй» [15]. При проек­тировании сложной программной системы необходимо разделять ее на все меньшие и меньшие подсистемы, каждую из которых можно совер­шенствовать независимо от других.
Начало применения этого принципа в программировании было по­ложено алгоритмической декомпозицией. Структурное проектирование «сверху вниз» воспринимается как обычное разделение алгоритмов, где каждый модуль системы выполняет один из этапов общего процесса.
18
Роль декомпозиции
Для разделения можно использовать или алгоритмическую, или объ­ектно-ориентированную декомпозицию. Разделение по алгоритмам концентрирует внимание на порядке происходящих событий, а разделе­ние по объектам придает особое значение агентам, которые являются либо объектами, либо субъектами действия. Можно начать разделение системы либо по алгоритмам, либо по объектам, а затем, используя
по­лученную структуру, попытаться рассмотреть проблему с другой точки зрения. В первом случае получим сложные подпрограммы, обрабатыва­ющие переменные, массивы, во втором случае – сложные структуры, включающие не только данные, но и небольшие подпрограммы (ме­тоды) для их обработки.
Роль абстракции
Будучи не в состоянии полностью воссоздать сложный объект, раз-
работчик
просто игнорирует не слишком важные детали. Это особенно верно, когда предметная область рассматривается с объектно-ориенти­рованной точки зрения, поскольку объекты как абстракции реального мира представляют собой отдельные связные информационные еди­ницы. Повышение уровня абстрагирования – необходимое требование для программиста. Дейкстра подчеркивал [16], что программист должен обладать умением абстрагировать: «Язык программирования – это лишь средство описания абстрактных конструкций. Программист должен иметь способность полностью абстрагироваться от несущественных де­талей, думая на нескольких уровнях абстракции одновременно».
Роль иерархии
Другим способом, расширяющим информационные единицы, явля­ется организация внутри системы иерархий классов и объектов. Объект­ная структура важна, так как она иллюстрирует взаимодействие объек­тов друг с другом
с помощью соответствующих механизмов связи. Структура классов не менее важна: она определяет общность структур и поведения внутри системы.
19
4. ОРГАНИЗАЦИЯ ПРОЦЕССА ПРОЕКТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ЦЕЛЬ ПРОЕКТИРОВАНИЯ
«Цель проектирования – выявление ясной и относительно простой внутренней структуры, иногда называемой архитектурой... Проект есть окончательный продукт процесса проектирования» [17].
Проектирование – процесс составления описания, необходимого для создания в заданных условиях еще не существующего объекта, на основе первичного описания этого объекта и/или алгоритма его функ­ционирования или алгоритма процесса преобразованием (в ряде неоднократным) исходного описания, оптимизацией заданных характе­ристик объекта и алгоритма его функционирования или алгоритма про­цесса, устранением некорректности первичного описания и последова­тельным представлением (при необходимости) описаний на различных языках [18].
Применительно к процессу создания ПО проектирование – процесс определения архитектуры программного обеспечения, компонентов, модулей, интерфейсов и данных для программной системы творения заданных требований [19].
В процессе проектирования ПО можно выделить две составляющие: архитектурное и детальное проектирование. Архитектурные решения рассматриваются как более абстрактные, концептуальные и глобаль­ные, нацеленные на успех всего проекта и наиболее высокоуровневые структуры системы. Детальное проектирование, в свою очередь, опре­деляется как процесс детализации и расширения предварительного про екта (архитектуры) до такой степени, при которой проект полностью го­тов к реализации.
Результат проектирования – проектное решение (совокупность проектных решений), удовлетворяющее заданным требованиям и необ­ходимое для создания объекта проектирования.
случаев
для удовле-
-
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]