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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
правила подготовки, рассмотрения, согласования и утверждения
документации с указанием предельных сроков для каждой стадии;
требования к настройке издательской системы, используемой
в качестве встроенного средства подготовки документации;
требования к настройке инструментальных средств для обеспече-
ния подготовки документации в соответствии с установленными требо­ваниями.
Стандарт интерфейса пользователя устанавливает:
правила
оформления экранных форм (шрифты, цветовая палитра),
состав и расположение окон и элементов управления;
правила использования пользователями клавиатуры, мыши и дру-
гих устройств;
правила оформления текстов помощи;  перечень стандартных сообщений, используемых в интерфейсе; правила обработки реакции пользователя.
КЛАССИФИКАЦИЯ МЕТОДОЛОГИЙ ПРОЕКТИРОВАНИЯ ПС
Все известные методологии по способу декомпозиции систем можно
объединить в
две группы.
1. Структурно-функциональные методологии, в основу которых по-
ложен принцип функциональной декомпозиции: структура системы описывается в терминах иерархии взаимосвязанных функций и пере­дачи информации между отдельными функциональными элементами.
2. Объектно-ориентированные методологии, использующие объект­ную декомпозицию. При этом структура системы описывается в терми­нах объектов и связей между ними,
а поведение системы – в терминах
обмена сообщениями между объектами.
СТРУКТУРНО-ФУНКЦИОНАЛЬНЫЕ МЕТОДОЛОГИИ
Методологии ориентированы на построение совокупности моделей, каждая из которых должна представлять (описывать) конкретный ас­пект системы:
функциональную структуру системы;
последовательность выполняемых действий;
передачу информации между функциональными процессами;
отношения между данными.
31
Применение структурного подхода схематично показано на рис. 7.
Разработка функциональной модели
Разработка информационной модели
Разработка поведенческих моделей
Разработка моделей компонентов и развертывания
Рис. 7. Схема применения структурно-функционального подхода
Функциональная модель описывает требования к составу и струк­туре выполняемых системой функций, характеризует морфологию си­стемы (ее построение) – состав функциональных подсистем, их взаимо­связи. На этой модели указывается исходная информация, промежуточ­ные и итоговые результаты работы системы.
На основе функциональной модели можно понять, что должна де­лать система и какие действия
позволят достичь требуемого результата, а также концептуально определить наборы данных, используемых в си­стеме.
Информационная модель описывает информационные аспекты, отражая отношения между элементами системы в виде структур данных (состав и взаимосвязи) – баз данных, классов и т. п.
Поведенческий аспект, отражающий динамику системы, позволяет понять, как это работает, и выяснить, в
какой очередности выполняются операции, образующие процесс, и временную шкалу процесса (длитель­ность и расписание операций).
Компонентная модель описывает состав и структуру программ­ных и аппаратных средств. Элементами компонентной модели явля­ются реальные компоненты, обеспечивающие реализацию функций системы и выполнение других (нефункциональных) требований к си­стеме, и связи между ними.
На
основе разработанных моделей создаются процедуры реализации функций, т. е. алгоритмы обработки данных и поведения элементов си­стемы. На заключительной стадии устанавливается распределение функций по подсистемам (компонентам), необходимое техническое
32
обеспечение и строится модель их распределения по узлам системы. По­казанная на рис. 7 схема не означает, что построение моделей должно строго соответствовать указанному порядку – одна за другой. Как пра­вило, разработка каждой последующей модели начинается еще до пол­ного завершения разработки предыдущей, а иногда – параллельно.
На стадии проектирования модели расширяются, уточняются
и до­полняются диаграммами, отражающими технологию использования си­стемы, ее архитектуру, экранные формы и т. п.
ОБЪЕКТНО-ОРИЕНТИРОВАННАЯ МЕТОДОЛОГИЯ
Объектный подход к проектированию и разработке основан на ис­пользовании метафоры объекта. Объект – предмет или явление реаль­ного или виртуального мира, имеющее четко определенное поведение и обладающее состоянием, поведением и индивидуальностью.
Структура и поведение сходных объектов определяют общий для них класс. Объекты одного класса имеют одинаковое поведение и оди­наковые
характеристики (атрибуты), но значения их атрибутов могут
быть разными.
Класс – это некоторая сущность (множество объектов), для кото­рой определены атрибуты (свойства) и методы (действия, которые объекты производят над окружающими объектами), т. е. класс пред­ставляет описание множества объектов, связанных общностью струк­туры и поведения.
Концептуальной основой объектно-ориентированного подхода яв­ляется
объектная модель, которая строится с учетом следующих прин-
ципов.
Абстрагирование – это выделение наиболее важных, существен­ных характеристик некоторого объекта (которые отличают его от всех других видов объектов и таким образом четко определяют его концеп­туальные границы с точки зрения дальнейшего рассмотрения и анализа) и игнорирование менее важных или незначительных деталей
.
Иерархия – это ранжированная или упорядоченная система аб­стракций, расположение их по уровням. Иерархический характер про­граммной системы отражается в виде иерархии классов, а ее функцио­нирование рассматривается как взаимодействие объектов.
Наследование – построение новых классов на основе существующих с возможностью добавления или переопределения свойств и методов.
33
Полиморфизм – это свойство системы использовать объекты с оди­наковым интерфейсом без информации о типе и внутренней структуре объекта.
Инкапсуляция – это практика сокрытия деталей проектирования, которые могут измениться в будущем, для ограничения каскадных из­менений в программной системе и для упрощения ее разработки и со­провождения.
Объектный подход обладает следующими преимуществами.
1. Существенно повышает уровень унификации разработки и при- годность компонентов для повторного использования, что ведет к со­зданию среды разработки и переходу к сборочному созданию программ­ных продуктов [40].
2. Позволяет избежать создания сложных моделей, так как методо- логия предполагает эволюционный путь развития модели на базе отно­сительно небольших подсистем. Созданная
модель конкретизируется на
этапах анализа, проектирования и реализации.
3. Обеспечивает гибкость при модификации и расширении системы.
4. Отсутствует необходимость разработки классов с нуля, за счет наследования.
ШАБЛОНЫ ПРОЕКТИРОВАНИЯ
Одним из основных преимуществ объектно-ориентированного под­хода является возможность повторного использования кода. О повтор­ном использовании кода говорят, когда рассматривают реализацию ин­капсуляции и наследования. В этом случае классы разрабатывают так, чтобы их можно было использовать не в одном, а в нескольких проектах (инкапсуляция). Удачно определив базовое понятие и
реализовав в виде класса, его можно успешно и многократно использовать, определяя его наследников, реализуя их частные свойства.
Кроме того, при объектно-ориентированном подходе можно по­вторно использовать не только код, но и проектные решения. Типовые проектные решения в объектно-ориентированном проектировании (да и не только [41–48]) называются паттернами (шаблонами).
При создании
программных систем перед разработчиками часто встает проблема выбора тех или иных проектных решений. В этих слу­чаях на помощь приходят паттерны, поскольку подобные задачи уже ре­шались ранее и существуют хорошо продуманные элегантные решения, составленные экспертами. Паттерны как раз описывают решения таких повторяющихся задач.
34
Паттерны проектирования упрощают повторное использование удачных проектных и архитектурных решений. Представление прошед­ших проверку временем методик в виде паттернов проектирования об­легчает доступ к ним со стороны разработчиков новых систем. С помо­щью паттернов можно улучшить качество документации и сопровожде­ния существующих систем, позволяя явно описать взаимодействия классов и объектов, а
также причины, по которым система была постро­ена так, а не иначе. Проще говоря, паттерны проектирования дают раз­работчику возможность быстрее найти «правильный» путь.
Шаблон проектирования, или паттерн, в разработке программного обеспечения – архитектурная конструкция, представляющая собой ре­шение проблемы проектирования в рамках некоторого часто возникаю­щего контекста.
Обычно шаблон не
является законченным образцом, который может быть прямо преобразован в код; это лишь пример решения задачи, ко­торый можно использовать в различных ситуациях.
Объектно-ориентированные шаблоны показывают отношения и вза­имодействия между классами или объектами без определения того, ка­кие именно конечные классы или объекты приложения будут использо­ваться.
Правильное использование
паттернов проектирования дает разра-
ботчику ряд неоспоримых преимуществ.
1. Модель системы, построенная в терминах паттернов проектиро­вания, фактически является структурированным выделением тех эле­ментов и связей, которые значимы при решении поставленной задачи.
2. Модель, построенная с использованием паттернов проектирова­ния, более проста и наглядна в изучении, чем стандартная модель.
3. Несмотря на
простоту, она позволяет глубоко и всесторонне про­работать архитектуру разрабатываемой системы с использованием спе­циального языка.
4. Применение паттернов проектирования повышает устойчивость системы к изменению требований и упрощает неизбежную последую­щую доработку системы.
5. Роль использования паттернов при интеграции информационных систем организации трудно переоценить.
6. Совокупность паттернов проектирования, по сути, представляет собой
единый словарь проектирования, который, будучи унифицирован-
ным средством, незаменим для общения разработчиков с друг другом.
35
7. Паттерн, реализованный в нужном месте, в нужное время, может
стать настоящим спасителем разработчика.
Однако любой шаблон проектирования может стать палкой о двух концах: если он будет применен не к месту, то это может обернуться катастрофой и создать много проблем в последующем.
В общем случае паттерн состоит из четырех основных элементов.
1. Имя. Сославшись на него, можно сразу описать проблему проек­тирования, ее решение и последствия. Присваивание паттернам имен позволяет вести проектирование на более высоком уровне абстракции. С помощью словаря паттернов можно вести обсуждение с коллегами, упоминать паттерны в документации, в тонкостях представлять дизайн системы.
2. Задача. Описание того, когда следует применять
паттерн. Необ-
ходимо сформулировать задачу и ее контекст. Может описываться кон­кретная проблема проектирования, например способ представления ал­горитмов в виде объектов. Иногда отмечается, какие структуры классов или объектов свидетельствуют о негибком дизайне. Может также вклю­чаться перечень условий, при выполнении которых имеет смысл приме­нять данный паттерн.
3. Решение.
Описание элементов дизайна, отношений между ними, функций каждого элемента. Конкретная реализация не имеется в виду, поскольку паттерн – это шаблон, применимый в самых разных ситуа­циях. Просто дается абстрактное описание задачи проектирования и того, как она может быть решена с помощью некоего весьма обобщен­ного сочетания элементов (в нашем случае классов и
объектов).
4. Результат – это следствия применения паттерна и разного рода компромиссы. Хотя при описании проектных решений о последствиях часто не упоминают, знать о них необходимо, чтобы можно было вы­брать между различными вариантами и оценить преимущества и недо­статки данного паттерна. Поскольку в объектно-ориентированном про­ектировании повторное использование нередко
является важным фак­тором, к результатам следует относить и влияние паттерна на степень гибкости, расширяемости и переносимости системы.
Выделяют три основных вида шаблонов проектирования: структур-
ные; порождающие; поведенческие.
Структурные шаблоны определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реа­лизацию, позволяя облегчить разработку и оптимизировать программу.
36
1. Адаптер/Обертка (Adapter/Wrapper) – преобразует интерфейс
класса в другой интерфейс, ожидаемый клиентом. Позволяет классам с разными интерфейсами работать вместе.
2. Мост (Bridge) – разделяет абстракцию и реализацию так, чтобы
они могли изменяться независимо.
3. Компоновщик (Composite) – компонует объекты в древовидную структуру, представляя их в виде иерархии. Позволяет клиенту одина­ково обращаться как к отдельному объекту
, так и к целому поддереву.
4. Декоратор (Decorator) – динамически предоставляет объекту до-
полнительные возможности. Представляет собой гибкую альтернативу наследованию для расширения функциональности.
5. Фасад (Facade) – обеспечивает единый интерфейс к группе интер­фейсов подсистемы. Определяет высокоуровневый интерфейс, делая подсистему проще для использования.
6. Приспособленец (Flyweight) – благодаря совместному использо- ванию поддерживает эффективную работу с большим
количеством объ-
ектов.
7. Заместитель (Proxy) – предоставляет замену другого объекта для контроля доступа к нему.
Порождающие шаблоны проектирования абстрагируют процесс создания экземпляра класса. Они позволяют сделать систему независи­мой от способа создания, композиции и представления объектов. Шаб­лон, порождающий классы, использует наследование, чтобы изменять созданный класс, а шаблон, порождающий объекты, делегирует созда ние другому объекту.
1. Абстрактная фабрика (AbstractFactory) – предоставляет интер- фейс для создания групп связанных или зависимых объектов, не указы­вая их конкретного класса.
2. Строитель (Builder) – разделяет создание сложного объекта и ини­циализацию его состояния так, что одинаковый процесс построения мо­жет создать объекты с разным состоянием.
3. Фабричный метод (Factory Method) – определяет интерфейс
для создания объекта, но позволяет подклассам решать, какой класс созда­вать. Позволяет делегировать создание объекта подклассам.
4. Прототип (Prototype) – определяет несколько видов объектов, чтобы при создании использовать объект-прототип, и создает новые объекты, копируя прототип.
-
37
5. Одиночка (Singleton) – гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к нему.
Поведенческие паттерны ‒ определяют алгоритмы и взаимодей-
ствие между классами и объектами, т. е. их поведение.
1. Цепочка обязанностей (ChainOfResponsibility) – избегает связыва- ния отправителя запроса с его получателем, давая возможность обрабо­тать запрос более чем одному
объекту. Связывает объекты-получатели
и передает запрос по цепочке до тех пор, пока объект не обработает его.
2. Команда (Command) – инкапсулирует запрос в виде объекта, поз­воляя передавать его клиентам в качестве параметров, ставить в оче­редь, регистрировать, а также поддерживает отмену операций.
3. Интерпретатор (Interpreter) – получая формальный язык, опреде­ляет представление
его грамматики и интерпретатор, использующий это
представление для обработки выражений языка.
4. Итератор (Iterator) – предоставляет способ последовательного до­ступа к элементам множества, независимо от его внутреннего устройства.
5. Посредник (Mediator) – определяет объект, инкапсулирующий способ взаимодействия объектов. Обеспечивает слабую связь, избавляя объекты от необходимости прямо ссылаться друг на друга, и дает воз­можность независимо
изменять их взаимодействие.
6. Хранитель (Memento) – не нарушая инкапсуляцию, определяет и
сохраняет внутреннее состояние объекта и позволяет позже восстано­вить объект в этом состоянии.
7. Наблюдатель (Observer) – определяет зависимость «один ко мно­гим» между объектами так, что когда один объект меняет свое состояние, все зависимые объекты оповещаются и обновляются автоматически.
8. Состояние (State) –
позволяет объекту изменять свое поведение
в зависимости от внутреннего состояния.
9. Стратегия (Strategy) – определяет группу алгоритмов, инкапсули- рует их и делает взаимозаменяемыми. Позволяет изменять алгоритм независимо от клиентов, его использующих.
10. Шаблонный метод (Template method) – определяет алгоритм, не- которые этапы которого делегируются подклассам. Позволяет подклас­сам переопределить эти этапы, не меняя структуру алгоритма.
11.
Посетитель (Visitor) – представляет собой операцию, которая бу­дет выполнена над объектами группы классов. Дает возможность опре­делить новую операцию без изменения кода классов, над которыми эта операция проводится.
38
6. ТЕХНОЛОГИИ РЕАЛИЗАЦИИ
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
В условиях промышленного подхода к разработке и сопровождению программного обеспечения особую значимость приобретает техноло­гичность разрабатываемых программ. Под технологичностью пони­мают качество проекта программного продукта, от которого зависят трудовые и материальные затраты на его реализацию и последующие модификации. Хороший проект сравнительно быстро и легко кодиру­ется, тестируется, отлаживается и модифицируется.
Для
обеспечения необходимых технологических свойств приме­няют специальные технологические приемы и следуют определенным методикам, сформулированным всем предыдущим опытом создания программного обеспечения. К таким приемам и методикам относят пра­вила декомпозиции, методы проектирования, методы программирова­ния и контроля качества, языки и системы программирования, разнооб­разие которых порождает множество подходов к решению даже и той же задачи. Это позволяет использовать различные комбинации специализированных моделей и ведет к появлению разных стилей про­граммирования, определяемых как парадигмы.
Парадигма – это определенный набор концепций, или шаблонов мышления, включая теории, методы исследования, постулаты и стан­дарты, в соответствии с которыми осуществляются последующие по­строения, обобщения и эксперименты в
Парадигма программирования – это парадигма, определяющая некоторый цельный набор идей и рекомендаций, формирующих стиль и технику написания программ [13].
Термин «парадигма программирования» впервые применил в 1978 г. Роберт Флойд в своей лекции лауреата премии Тьюринга [49].
Парадигмы лежат в основе конструирования языков программирова­ния. Каждый язык соответствует своей парадигме, которая определяет
предметной области.
одной
39
стандарты написания кода. Поскольку одна и та же задача может быть решена с помощью разных языков программирования, выбор языка, а следовательно, и парадигмы, должен быть осознанным на основе зна­ний базовых средств и приемов всех основных парадигм программиро­вания.
С возможными классификациями парадигм и построением иерархий можно ознакомиться в [50, 51], в частности
в [50] приведена таксономия
с 27 различными парадигмами.
Флойд [52] отмечает: «Если прогресс искусства программирования в целом требует постоянного изобретения и усовершенствования пара­дигм, то совершенствование искусства отдельного программиста тре­бует, чтобы он расширял свой репертуар парадигм».
Таким образом, изучение парадигм является важным компонентом обучения специалистов в области информатики и программирования.
Все известные
к настоящему времени парадигмы программирования
можно объединить в две группы: императивную и декларативную.
Императивное программирование – это парадигма программиро­вания, при которой описывается процесс вычисления в виде инструк­ций, изменяющих состояние программы, т. е. в виде последовательно­сти команд, которые должен выполнить компьютер. Допустимые виды команд (операторов), а также типы обрабатываемых данных
определя-
ются конкретным языком программирования.
Под такое разделение всех методов обработки информации в рамках императивной парадигмы попадают почти все известные на сегодняш­ний день языки программирования, при этом невозможно говорить о яв­ных преимуществах какой-либо одной парадигмы перед остальными, тем более что многие языки поддерживают несколько парадигм про­граммирования (
мультипарадигмальные языки). Каждая парадигма наряду с большим количеством положительных особенностей имеет и отрицательные аспекты.
Цель разработки мультипарадигмальных языков программирования состоит, как правило, в том, чтобы позволить программистам использо­вать лучший инструмент для работы, признавая, что никакая парадигма не решает все проблемы самым легким или самым эффективным спо­собом. Практически все широко
используемые языки являются муль­типарадигмальными, поскольку в своем развитии получили дополни­тельные возможности. Например, C# – это объектно-ориентированный язык программирования, в котором новые языковые конструкции, такие
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]