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

Проектирование и реализация прикладного программного обеспечения. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
31
должны быть список и приоритетность функций будущей ПО, предваритель­ные функциональные и информационные модели ПО.
На фазе проектирования часть пользователей принимает участие в тех­ническом проектировании системы под руководством специалистов­разработчиков. CASE-средства используются для быстрого получения рабо­тающих прототипов приложений. Пользователи, непосредственно взаимо­действуя с ними, уточняют и дополняют требования к системе, которые не были выявлены на предыдущей фазе. Более подробно рассматриваются про­цессы системы. Анализируется и, при необходимости, корректируется функ­циональная модель. Каждый процесс рассматривается детально. При необхо­димости для каждого элементарного процесса создается частичный прото­тип: экран, диалог, отчет, устраняющий неясности или неоднозначности. Определяются требования разграничения доступа к данным. На этой же фазе происходит определение набора необходимой документации.
После детального определения состава процессов оценивается количе­ство функциональных элементов разрабатываемой системы и принимается решение о разделении ПО на подсистемы, поддающиеся реализации одной командой разработчиков за приемлемое для RAD-проектов время – порядка 60 – 90 дней. С использованием CASE-средств проект распределяется между различными командами (делится функциональная модель). Результатом дан­ной фазы должны быть:
общая информационная модель системы; функциональные модели системы в целом и подсистем, реализуемых
отдельными командами разработчиков;
точно определенные с помощью CASE-средства интерфейсы между
автономно разрабатываемыми подсистемами;
построенные прототипы экранов, отчетов, диалогов.
На фазе построения разработчики производят итеративное построение реальной системы на основе полученных в предыдущей фазе моделей, а так­же требований нефункционального характера. Программный код частично формируется при помощи автоматических генераторов, получающих инфор­мацию непосредственно из репозитория CASE-средств. Конечные пользова­тели на этой фазе оценивают получаемые результаты и вносят коррективы, если в процессе разработки система перестает удовлетворять определенным ранее требованиям. Тестирование системы осуществляется непосредственно в процессе разработки.
После окончания работ каждой отдельной команды разработчиков производится постепенная интеграция данной части системы с остальными, формируется полный программный код, выполняется тестирование совмест­ной работы данной части приложения с остальными, а затем тестирование системы в целом. Завершается физическое проектирование системы:
определяется необходимость распределения данных;
производится анализ использования данных;
производится физическое проектирование базы данных;
определяются требования к аппаратным ресурсам;
32
< 1000 функциональных элементов
один человек
1000-4000 функциональных элементов
одна команда разработчиков
> 4000 функциональных элементов
4000 функциональных элементов на одну команду разработчиков
определяются способы увеличения производительности; завершается разработка документации проекта.
Результатом фазы является готовая система, удовлетворяющая всем со-
гласованным требованиям.
На фазе внедрения производится обучение пользователей, организаци-
онные изменения и параллельно с внедрением новой системы осуществляет­ся работа с существующей системой (до полного внедрения новой).
Приведенная схема разработки ПО не является абсолютной. Возможны
различные варианты, зависящие, например, от начальных условий, в которых ведется разработка: разрабатывается совершенно новая система; уже было проведено обследование предприятия и существует модель его деятельности; на предприятии уже существует некоторая ПО, которая может быть исполь­зована в качестве начального прототипа или должна быть интегрирована с разрабатываемой.
Оценка размера приложений производится на основе так называемых функциональных элементов (экраны, сообщения, отчеты, файлы и т.п.) По­добная метрика не зависит от языка программирования, на котором ведется разработка. Размер приложения, которое может быть выполнено по методо­логии RAD, для хорошо отлаженной среды разработки ПО с максимальным повторным использованием программных компонентов, определяется сле­дующим образом:
3.6 Модели жизненного цикла, реализующие инкрементную
стратегию разработки программных средств и систем
3.6.1 Инкрементная стратегия разработки программных средств и
систем
Инкрементная стратегия представляет собой многократный проход этапов разработки с запланированным улучшением результата.
Данная стратегия основана на полном определении всех требований к разрабатываемому программному средству (системе) в начале процесса раз­работки. Однако полный набор требований реализуется постепенно в соот­ветствии с планом в последовательных циклах разработки.
Результат каждого цикла называется инкрементом.
Первый инкремент реализует базовые функции программного средства. В последующих инкрементах функции программного средства постепенно расширяются, пока не будет реализован весь набор требований. Различия
33
между инкрементами соседних циклов в ходе разработки постепенно умень­шаются.
Результат каждого цикла разработки может распространяться в каче-
стве очередной поставляемой версии программного средства или системы.
Особенностью инкрементной стратегии является большое количество
циклов разработки при незначительной продолжительности цикла и неболь­ших различиях между инкрементами соседних циклов. Например, данная стратегия разработки ПС и систем используется в компании Microsoft. Здесь на каждую версию программного средства разрабатывается около тысячи инкрементов.
Период разработки инкремента составляет одни сутки (например, днем
инкремент разрабатывается, ночью тестируется). В ряде организаций исполь­зуется недельный период разработки инкремента (чаще всего пять дней – разработка, два дня – тестирование).
Инкрементная стратегия обычно основана на объединении элементов
каскадной модели и прототипирования. При этом использование прототипи­рования позволяет существенно сократить продолжительность разработки каждого инкремента и всего проекта в целом.
Под прототипом понимается легко поддающаяся модификации и рас-
ширению рабочая модель разрабатываемого программного средства (или си­стемы), позволяющая пользователю получить представление о его ключевых свойствах до полной реализации.
Основными достоинствами инкрементной стратегии, проявляемыми
при разработке соответствующего ей проекта, являются:
1) возможность получения функционального продукта после реализа-
ции каждого инкремента;
2) короткая продолжительность создания инкремента; это приводит к
сокращению сроков начальной поставки, позволяет снизить затраты на пер­воначальную и последующие поставки программного продукта;
3) предотвращение реализации громоздких спецификаций требований; стабильность требований во время создания определенного инкремен-
та; возможность учета изменившихся требований;
4) снижение рисков по сравнению с каскадной стратегией;
5) включение в процесс пользователей, что позволяет оценить функци­ональные возможности продукта на более ранних этапах разработки и в ко­нечном итоге приводит к повышению качества программного продукта, сни­жению затрат и времени на его разработку.
К основным недостаткам инкрементной стратегии, проявляющимся
в результате ее несоответствующего применения, следует отнести:
1) необходимость полного функционального определения системы или программного средства в начале ЖЦ для обеспечения планирования инкре­ментов и управления проектом;
2) возможность текущего изменения требований к системе или про­граммному средству, которые уже реализованы в предыдущих инкрементах;
3) сложность планирования и распределения работ;
34
4) проявление человеческого фактора, связанного с тенденцией к оття-
гиванию решения трудных проблем на поздние инкременты, что может нарушить график работ или снизить качество программного продукта.
Области применения инкрементной стратегии определяются ее до-
стоинствами и ограничены ее недостатками. Использование данной страте­гии наиболее эффективно в следующих случаях:
1) при разработке проектов, в которых большинство требований можно
сформулировать заранее, но часть из них могут быть уточнены через опреде­ленный период времени;
2) при разработке сложных проектов с заранее сформулированными
требованиями; для них разработка системы или программного средства за один цикл связана с большими трудностями;
3) при необходимости быстро поставить на рынок продукт, имеющий
базовые функциональные свойства;
4) при разработке проектов с низкой или средней степенью рисков;
5) при выполнении проекта с применением новых технологий.
Инкрементная стратегия представляет собой многократный проход этапов разработки с запланированным улучшением результата. Данная стра­тегия основана на полном определении всех требований к разрабатываемому программному средству или системе в начале процесса разработки. Однако полный набор требований реализуется постепенно в соответствии с планом в последовательных циклах разработки.
3.6.2 Инкрементные модели
Инкрементные модели поддерживают инкрементную стратегию разра­ботки ПС и систем. Данная стратегия представляет собой запланированное улучшение продукта в процессе его ЖЦ. При использовании инкрементных моделей осуществляется изначальная частичная реализация всей системы (или программного средства). При этом в первую очередь реализуются базо­вые требования. За этим следует медленное наращивание функциональных возможностей или характеристик качества системы или программного сред­ства в реализуемых последовательно прототипах (инкрементах).
Применение инкрементных моделей ускоряет создание программного средства или системы за счет применяемого принципа компоновки из стан­дартных или разработанных ранее программных компонентов. Это позволяет существенно уменьшить затраты на разработку.
Существуют различные варианты реализации инкрементных моделей. В классических вариантах модель основана на использовании полного зара­нее сформированного набора требований, реализуемых последовательно ви­де небольших инкрементов.
Существуют варианты модели, начинающиеся с формулирования об­щих требований. Требования постепенно уточняются в процессе разработки прототипов. Данные варианты инкрементных моделей похожи на эволюци-
35
онные модели. Однако от последних они отличаются существенно большим количеством инкрементов при гораздо меньших различиях между соседними инкрементами.
К таким вариантам моделей относится, например, модель ЖЦ, реали-
зующая современную реализацию инкрементной стратегии – экстремальное программирование.
При использовании инкрементной модели различия между последова­тельными прототипами постепенно уменьшаются. В каждой последующей версии системы или программного средства добавляются к предыдущей вер­сии определенные программные компоненты, реализующие соответствую­щие функциональные возможности до тех пор, пока не будут реализованы все требования к системе (программному средству). При этом каждая версия системы или программного средства может сдаваться в эксплуатацию.
3.7 Проблемы межу пользователем и программистом и способы их
преодоления
Разработка ПО носит творческий характер (на каждом шаге прихо­дится делать какой-либо выбор, принимать какое-либо решение), а не сво­дится к выполнению какой-либо последовательности регламентированных действий. Тем самым эта разработка ближе к процессу проектирования ка­ких-либо сложных устройств, но никак не к их массовому производству. Этот творческий характер разработки ПО сохраняется до самого ее конца. Как же преодолеет разногласии между пользователем и разработчиком, ко­торые несомненно возникнут в процессе работе? Как обеспечить, чтобы ПО выполняло то, что пользователю разумно ожидать от него?
Для этого разработчикам необходимо правильно понять, во-первых, че­го хочет пользователь, и, во-вторых, его уровень подготовки и окружающую его обстановку. Ясное описание соответствующей сферы деятельности поль­зователя или интересующей его проблемной области во многом облегчает достижение разработчиками этой цели. При разработке ПО следует привле­кать пользователя для участия в процессах принятия решений, а также тща­тельно освоить особенности его работы. С учетом этого при разработки ПО необходимо применять везде, где это возможно смежный контроль и сочета­ние как статических, так и динамических методов контроля.
Смежный контроль означает, проверку полученного документа лицами, не участвующими в его разработке, с двух сторон: во-первых, со стороны ав­тора исходного для контролируемого процесса документа, и, во-вторых, ли­цами, которые будут использовать полученный документ в качестве исход­ного в последующих технологических процессах. Такой контроль позволяет обеспечивать однозначность интерпретации полученного документа.
Сочетание статических и динамических методов контроля означает, что нужно не только контролировать документ как таковой, но и проверять, какой процесс обработки данных он описывает.
36
Реальное применение любой технологии проектирования, разработки и
сопровождения ПО в конкретной организации и конкретном проекте невоз­можно без выработки ряда стандартов (правил, соглашений), которые долж­ны соблюдаться всеми участниками проекта. К таким стандартам относятся следующие:
стандарт проектирования; стандарт оформления проектной документации; стандарт пользовательского интерфейса.
Стандарт проектирования должен устанавливать:
набор необходимых моделей (диаграмм) на каждой стадии проекти-
рования и степень их детализации;
правила фиксации проектных решений на диаграммах, в том числе:
правила именования объектов (включая соглашения по терминологии), набор атрибутов для всех объектов и правила их заполнения на каждой стадии, правила оформления диаграмм, включая требования к форме и размерам объектов, и т.д.;
требования к конфигурации рабочих мест разработчиков, включая
настройки операционной системы, настройки CASE-средств, общие настрой­ки проекта и т.д.;
механизм обеспечения совместной работы над проектом, в том чис-
ле: правила интеграции подсистем проекта, правила поддержания проекта в одинаковом для всех разработчиков состоянии (регламент обмена проектной информацией, механизм фиксации общих объектов и т.д.), правила проверки проектных решений на непротиворечивость и т.д.
Стандарт оформления проектной документации должен устанавли-
вать:
комплектность, состав и структуру документации на каждой стадии
проектирования;
требования к ее оформлению (включая требования к содержанию
разделов, подразделов, пунктов, таблиц и т.д.),
правила подготовки, рассмотрения, согласования и утверждения до-
кументации с указанием предельных сроков для каждой стадии;
требования к настройке издательской системы, используемой в каче-
стве встроенного средства подготовки документации;
требования к настройке CASE-средств для обеспечения подготовки
документации в соответствии с установленными требованиями.
Стандарт интерфейса пользователя должен устанавливать: правила оформления экранов (шрифты и цветовая палитра), состав и
расположение окон и элементов управления;
правила использования клавиатуры и мыши; правила оформления текстов помощи; перечень стандартных сообщений; правила обработки реакции пользователя.
37
4 Декомпозиция задачи. Структурный и модульный подход к проектированию
4.1 Архитектуры программного средства
Архитектура ПС это его строение как оно видно (или должно быть видно) извне его, т.е. представление ПС как системы, состоящей из некото­рой совокупности взаимодействующих подсистем. В качестве таких подси­стем выступают обычно отдельные программы. Разработка архитектуры яв­ляется первым этапом борьбы со сложностью ПС, на котором реализуется принцип выделения относительно независимых компонент.
Основные задачи разработки архитектуры ПС:
выделение программных подсистем и отображение на них внешних
функций (заданных во внешнем описании) ПС;
определение способов взаимодействия между выделенными про-
граммными подсистемами.
С учетом принимаемых на этом этапе решений производится дальней­шая конкретизация и функциональных спецификаций.
Различают следующие основные классы архитектур программных средств:
цельная программа;комплекс автономно выполняемых программ; слоистая программная система; коллектив параллельно выполняемых программ.
4.2 Методы проектирования
Приступая к разработке каждой программы ПС, следует иметь в виду, что она, как правило, является большой системой, поэтому мы должны при­нять меры для ее упрощения. Для этого такую программу разрабатывают по частям, которые называются программными модулями. А сам такой метод разработки программ называют модульным программированием.
Программный модуль это любой фрагмент описания процесса, оформляемый как самостоятельный программный продукт, пригодный для использования в описаниях процесса. Это означает, что каждый программ­ный модуль программируется, компилируется и отлаживается отдельно от других модулей программы, и тем самым, физически разделен с другими мо­дулями программы. Более того, каждый разработанный программный модуль может включаться в состав разных программ, если выполнены условия его использования, декларированные в документации по этому модулю. Таким образом, программный модуль может рассматриваться и как средство борьбы со сложностью программ, и как средство борьбы с дублированием в про-
38
граммировании (т.е. как средство накопления и многократного использова­ния программистских знаний).
Модульное программирование является воплощением, в процессе раз-
работки программ, борьбы со сложностью, обеспечивает независимость ком­понент системы, и использование иерархических структур.
Для избегания сложностей формулируются определенные требования,
которым должен удовлетворять программный модуль, т.е. выявляются ос­новные характеристики «хорошего» программного модуля и используют древовидные модульные структуры программ (включая деревья со сросши­мися ветвями). В узлах такого дерева размещаются программные модули, а направленные дуги (стрелки) показывают статическую подчиненность моду­лей, т.е. каждая дуга показывает, что в тексте модуля, из которого она исхо­дит, имеется ссылка на модуль, в который она входит. Другими словами, каждый модуль может обращаться к подчиненным ему модулям, т.е. выража­ется через эти модули. При этом модульная структура программы, в конеч­ном счете, должна включать и совокупность спецификаций модулей, обра­зующих эту программу.
Спецификация программного модуля содержит: синтаксическую спецификацию его входов, позволяющую построить
на используемом языке программирования синтаксически правильное обра­щение к нему (к любому его входу),
функциональную спецификацию модуля (описание семантики функ-
ций, выполняемых этим модулем по каждому из его входов).
Функциональная спецификация модуля строится так же, как и функци-
ональная спецификация ПС.
В процессе разработки программы ее модульная структура может по-
разному формироваться и использоваться для определения порядка програм­мирования и отладки модулей, указанных в этой структуре. Поэтому можно говорить о разных методах разработки структуры программы. Обычно в ли­тературе обсуждаются два метода: метод восходящей разработки и метод нисходящей разработки.
Метод восходящей разработки заключается в следующем. Сначала
строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модулей самого нижнего уровня (листья дерева модульной структуры программы), в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке, в каком велось их программирование.
Метод нисходящей разработки заключается в следующем. Как и в
предыдущем методе сначала строится модульная структура программы в ви­де дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), переходя к программированию какого-либо другого модуля только в том случае, если уже запрограммиро-
39
ван модуль, который к нему обращается. После того, как все модули про­граммы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) порядке. При этом первым тестируется го­ловной модуль программы, который представляет всю тестируемую про­грамму и поэтому тестируется при «естественном» состоянии информацион­ной среды, при котором начинает выполняться эта программа. При этом те модули, к которым может обращаться головной, заменяются их имитаторами (так называемыми заглушками). Каждый имитатор модуля представляется весьма простым программным фрагментом, который, в основном, сигнализи­рует о самом факте обращения к имитируемому модулю, производит необхо­димую для правильной работы программы обработку значений его входных параметров (иногда с их распечаткой) и выдает, если это необходимо, зара­нее запасенный подходящий результат. После завершения тестирования и отладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами, если таковые имеются. Для этого имитатор выбранного для те­стирования модуля заменяется самим этим модулем и, кроме того, добавля­ются имитаторы тех модулей, к которым может обращаться выбранный для тестирования модуль. При этом каждый такой модуль будет тестироваться при «естественных» состояниях информационной среды, возникающих к мо­менту обращения к этому модулю при выполнении тестируемой программы. Таким образом, большой объем «отладочного» программирования при вос­ходящем тестировании заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для того, чтобы подыгрывать процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами. При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т.е. ликвидируется весьма неприятный источник просчетов при программировании модулей.
Некоторым недостатком нисходящей разработки, приводящим к опре­деленным затруднениям при ее применении, является необходимость абстра­гироваться от базовых возможностей используемого языка программирова­ния, выдумывая абстрактные операции, которые позже нужно будет реализо­вать с помощью выделенных в программе модулей. Однако способность к таким абстракциям представляется необходимым условием разработки больших программных средств, поэтому ее нужно развивать.
Особенностью рассмотренных методов восходящей и нисходящей раз­работок (которые мы будем называть классическими) является требование, чтобы модульная структура программы была разработана до начала про­граммирования (кодирования) модулей.
Конструктивный подход к разработке программы представляет собой модификацию нисходящей разработки, при которой модульная древовидная структура программы формируется в процессе программирования модулей. Разработка программы при конструктивном подходе начинается с програм­мирования головного модуля, исходя из спецификации программы в целом.
40
При этом спецификация программы принимается в качестве спецификации ее головного модуля, который полностью берет на себя ответственность за выполнение функций программы. В процессе программирования головного модуля, в случае, если эта программа достаточно большая, выделяются под­задачи (внутренние функции), в терминах которых программируется голов­ной модуль. Это означает, что для каждой выделяемой подзадачи (функции) создается спецификация реализующего ее фрагмента программы, который в дальнейшем может быть представлен некоторым поддеревом модулей. Важ­но заметить, что здесь также ответственность за выполнение выделенной функции несет головной (может быть, и единственный) модуль этого подде­рева, так что спецификация выделенной функции является одновременно и спецификацией головного модуля этого поддерева. В головном модуле про­граммы для обращения к выделенной функции строится обращение к голов­ному модулю указанного поддерева в соответствии с созданной его специфи­кацией.
Таким образом, на первом шаге разработки программы (при програм-
мировании ее головного модуля) формируется верхняя начальная часть дере­ва, например, такая, которая показана на рисунок 4.1.
Рисунок 4.1 – Первый шаг формирования модульной структуры про-
граммы при конструктивном подходе
Аналогичные действия производятся при программировании любого
другого модуля, который выбирается из текущего состояния дерева про­граммы из числа специфицированных, но пока еще не запрограммированных модулей. В результате этого производится очередное доформирование дерева программы, например, такое, которое показано на рисунке 4.2.
Архитектурный подход к разработке программы представляет собой
модификацию восходящей разработки, при которой модульная структура программы формируется в процессе программирования модуля. Но при этом ставится существенно другая цель разработки: повышение уровня использу­емого языка программирования, а не разработка конкретной программы. Это означает, что для заданной предметной области выделяются типичные функ­ции, каждая из которых может использоваться при решении разных задач в этой области, и специфицируются, а затем и программируются отдельные
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]