Проектирование на UML.
Сборник задач
Рекомендовано ученым советом ФИВТ МФТИ
к использованию в учебном процессе факультета
при подготовке студентов по направлениям
010400 «Прикладные математика и информатика» и
010600 «Прикладные математика и физика»
Рецензенты:
д.ф.-м.н., профессор, Соколинский Л. Б.,
ведущий разработчик, Колпаков Е. А.
Аннотация
В данном сборнике представлены задачи по проектированию программных систем с использованием унифицированного языка моделирования UML2, принципов и паттернов проектирования. Сборник содержит более 120 задач с несколькими заданиями в каждой по разным разделам UML и проектирования ПО. Для каждого раздела приводятся основные понятия, для задач даны ответы и пояснения по решению. Приведены рекомендации по составлению проверочных работ с использованием задач сборника по темам проектирования.
Для слушателей курсов по объектно-ориентированному анализу и проектированию программного обеспечения, студентов технических и физико-математических специальностей, преподавателей высших учебных заведений, специалистов по программной инженерии.
Дополнительную информацию и материалы можно найти на сайте книги http://www.objectoriented.ru
При цитировании, используйте следующую информацию о книге.
Хританков А. С., Полежаев В. А., Андрианов А. И.
Проектирование на UML: Сборник задач. 2-е изд. — Екатеринбург: Издательские решения, 2017. — 240 с.; илл. — ISBN 978-5-4485-7954-7
УДК 004.41+004.02+372.8
ББК 32.973.23—018
(С) Хританков А. С., 2017
(С) Полежаев В. А., 2017
(С) Андрианов А. И., 2017
ОБ АВТОРАХ
Хританков Антон Сергеевич, к.ф.-м.н.
доцент кафедры АТП, Московский физико-технический институт.
Защитил диссертацию в сфере высокопроизводительных вычислений (МФТИ / ИСА РАН). Опыт преподавания более восьми лет, научные интересы: архитектура программного обеспечения, автоматизированные и интеллектуальные методы разработки программ. Опыт работы в индустрии более 12 лет от разработчика ПО до архитектора и руководителя департамента разработки и исследований. Сертифицированный специалист по UML2 (OMG Certified UML Professional Advanced).
Email: anton.khritankov@objectoriented.ru
Полежаев Валентин Александрович
директор по разработке и анализу данных компании Интелиор.
Окончил ВМК МГУ, автор нескольких статей по теме машинного обучения и практике применения предметно-ориентированных методов проектирования. Участвовал в разработке более десяти информационных систем, из них более половины в качестве бизнес-аналитика и архитектора.
Email: valentin.polezhaev@objectoriented.ru
Андрианов Андрей Иванович
руководитель группы морфологии «Аби Продакшн» (ABBYY).
Магистр физ.-мат. наук (МФТИ), в разное время преподавал в МФТИ курсы «Алгоритмы и структуры данных», «Проектирование программных систем», «Машинное обучение». А также «Концепции языков программирования», «Промышленное программирование». Опыт разработки, проектирования архитектуры и управления проектами более 9 лет.
Email: andrey.andrianov@objectoriented.ru
ПРЕДИСЛОВИЕ КО ВТОРОМУ ИЗДАНИЮ
Проектирование — это процесс построения модели объекта, который предполагается разработать или создать. Модели в проектировании играют важную роль: модели используются для уточнения того, что нужно сделать, для прояснения способа реализации, для понимания реализуемости решения и его соответствия требованиям, для передачи знаний и распространения информации о проектируемом объекте, для планирования и ведения работ по реализации.
Во многих инженерных отраслях проектирование занимает важное место и часто регулируется государственными, промышленными стандартами или стандартами уровня предприятия. В сфере разработки программного обеспечение проектирование будущей программной системы происходит как в начале работ, так и по ходу реализации.
Важно понимать, что область знаний проектирования — это отдельная дисциплина, требующая особых навыков работы с моделями, применения методов и практик, которые обычно не используются при реализации создаваемого объекта.
На данный момент в индустрии разработки программного обеспечения сложилось несколько отраслей, каждая из которых использует несколько отличные от других методы проектирования. Среди этого разнообразия в книге уделено больше внимания проектированию прикладных программ, компонентов и приложений с помощью объектно-ориентированных методов и унифицированного языка моделирования UML2.
Овладение этими методами позволит в дальнейшем с легкостью освоить и другие сферы проектирования программных систем, и другие языки моделирования.
В данной книге собрано более сотни задач по проектированию. Авторы приложили все возможные усилия к тому, чтобы задачи помогли читателю понять смысл и освоить те или иные концепции, принципы и методы проектирования. Рассматриваемый перечень тем примерно соответствует программе курса по проектированию программных систем, читаемом авторами в Московском физико-техническом институте на протяжении уже более восьми лет и рекомендациям ACM/IEEE по составу учебных программ по проектированию программного обеспечения.
По сравнению с первым изданием книгу пополнили задачи, предлагавшиеся студентам на контрольных работах по проектированию программного обеспечения, вошел новый раздел по предметно-ориентированному проектированию, добавлены рекомендации по составлению проверочных и контрольных работ по отдельным темам проектирования, а также вошло множество задач разной сложности, которые авторы сочли интересными и важными для освоения дисциплины проектирования.
По сравнению с первым изданием в книге изменился состав авторов, тем не менее, важно отметить вклад Штукатурова А.Н, по согласованию с которым во второе издание вошли подготовленные им задачи 2.5, 3.7, 3.9, 4.4, 5.5, 5.6, 7.5, 8.9. Раздел §9 подготовлен Полежаевым В. А., задачи 6.2, 6.4, 2.3, 2.8, 3.10, 7.11, 7.12, 1.3, 1.4, 2.1, 7.1, 8.1, 3.2 предложены Андриановым А. И., остальные задачи, теоретическая справка и примеры решения задач составлены Хританковым А. С.
Апрель 2017
ПРЕДИСЛОВИЕ К ПЕРВОМУ ИЗДАНИЮ
Предлагаемая читателю книга является сборником задач по курсу проектирования программных систем, преподаваемому авторами в Московском физико-техническом институте.
Сборник включает задачи по проектированию и моделированию с помощью языка UML2. Каждая задача имеет условие, в котором описана заготовка модели, и несколько вопросов к ней. Часть вопросов направлена на уточнение и расширение заготовки модели. Другая часть проверяет понимание смысла построенной модели. Предполагается, что вопросы к задаче будут решаться по порядку.
Задачи сборника направлены на развитие навыков изложения проектных решений средствами UML и устроены таким образом, чтобы в наибольшей степени обеспечить единственность решения. В сложных случаях к задачам даны пояснения и указания по решению.
В сборник включены задачи по объектно-ориентированному моделированию предметной области, в том числе задачи на выделение классов, задачи по моделированию структур времени выполнения и размещения компонентов программных систем. Моделированию поведения систем в сборнике посвящены разделы описания взаимодействий, моделирования с помощью конечных автоматов и представления деятельности.
Разделы сборника снабжены пояснениями по основным понятиям. В конце сборника приведены ответы к задачам с пояснениями, приводятся примеры решения некоторых задач.
Сборник может быть использован при проведении семинаров по курсам объектно-ориентированного моделирования и программирования, проектирования программных систем, а также специализированных курсов по языку UML. Задачи сборника могут предлагаться в качестве примеров, демонстрирующих и поясняющих основные понятия и особенности языка, могут входить в задания для самостоятельной работы, проверочные и контрольные работы, использоваться для самостоятельного изучения методов проектирования и языка UML.
Задачи составлены авторами на основе собственного опыта преподавания, адаптированы из профессиональной практики, проведенных контрольных и проверочных работ, предлагаемых студентам проектов.
Июнь 2012
ГЛАВА 1. ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО МОДЕЛИРОВАНИЯ
Краткая история UML. Унифицированный язык моделирования UML появился в результате объединения нескольких подходов к моделированию в середине 1990-х годов. В отличие от предыдущих попыток, в создании языка участвовали авторы этих подходов, а вследствие стандартизации через организацию OMG, участвовали также заинтересованные компании и исследовательские коллективы из разных отраслей.
Поэтому разные части UML отражают потребности в моделировании в разных отраслях и объединение их в одном языке и на основе одной базовой системы понятий позволяет говорить как раз об унифицированном языке моделирования.
В данной книге унифицированный язык моделирования выбран как основной для выражения проектировочных решений. При решении задач стоит ориентироваться на версию UML 2.4.1, которая была стандартизирована международной организацией по стандартизации ISO как ISO/IEC 19505—1:2012 и ISO/IEC 19505—2:2012.
Уровни использования UML. Выделяют несколько уровней владения и использования UML и моделей в целом при проектировании программных систем. На уровне эскиза модели используются для пояснения решений, неформального общения, документирования и не обладают полнотой, строгостью и могут быть несогласованными. На уровне спецификации модель используется как чертеж или план реализации, в соответствии с которым разрабатывается программная система.
Модели и диаграммы на этом уровне должны следовать нотации языка и быть согласованными (well-formed). Согласованность модели означает соответствие правилам использования языка UML2, определенным в его спецификации (метамодели) [4]. Например, если на диаграмме показан элемент модели, то в модели также должны быть определены все элементы, используемые показанным.
На исполняемом уровне модель представляет собой достаточное описание системы для ее воплощения автоматическими средствами. В этом случае исходный код системы может не сохраняться вовсе и быть промежуточным этапом получения работающей программной системы из исходных моделей.
В данном сборнике задач следует ориентироваться на использование UML на уровне спецификации. В то же время часть задач предполагает владение языком на исполняемом уровне.
Решение задач. Прежде чем приступить к решению задач стоит ознакомиться с рекомендуемой литературой для ознакомления с методами проектирования и нотацией. В помощь читателю в начале каждого раздела приводится краткая справка по используемым в задачах раздела понятиям и демонстрируется нотация языка.
Все задачи построены по единому принципу. В условии дается заготовка модели. Это может быть диаграмма или текстовое описание. В текстовом описании названия элементов модели приведены курсивом для облегчения их восприятия. Далее приводится несколько заданий или вопросов к условию. В качестве решения задания нужно указать по шагам ход рассуждения от условия или предыдущего задания к достижению условий, указанных в задании. Для ответа на вопрос следует привести рассуждение в обоснование полученного ответа и сам ответ. Задания и вопросы к задачам следует выполнять по порядку. Решение следующего задания может зависеть от решения предыдущего. Ответом на задание будет фрагмент диаграммы или нескольких диаграмм с представлением изменений, требуемых в данном задании.
При решении следует руководствоваться условием задачи, знаниями методов решения, нотацией и значением понятий языка моделирования. Часть задач составлена на основе реальных проектов разработки программного обеспечения, другую часть составляю учебные задачи. Такие задачи могут вызывать ассоциации с похожими ситуациями или реальными объектами. В этом случае следует придерживаться условия задачи. Если не указано иное, решение задач не предполагает каких-либо специальных знаний в специализированных областях. При необходимости дается сноска, где можно получить дополнительную информацию.
Задачи и задания повышенной сложности отмечены звездочкой (*), для некоторых задач приведено решение, в этом случае указана страница, на которой оно расположено (см. решение в §11). Перед тем, как приступить к решению задач рекомендуется ознакомиться с примерами решения и понять порядок ведения рассуждения и степень его детальности.
При составлении задач уделялось особое внимание тому, чтобы решение было единственным. При необходимости в заданиях к задачам даются указания по предполагаемому способу решения. Впрочем, вполне возможно, что читатель сможет предложить более удачные или лаконичные решения по некоторым задачам. Возможность существования лучшего решения следует учитывать и не требовать однозначного совпадения решения с ответами, приводимыми авторами сборника.
§1. КЛАССЫ И ОБЪЕКТЫ
ОСНОВНЫЕ ПОНЯТИЯ
Пространство имен (namespace) — это именованный элемент модели, который может содержать другие именованные элементы. Принадлежность пространству имен показывается отношением включения в пространство имен (membership). Полностью квалифицированное имя (fully-qualified name) элемента в модели состоит из последовательности имен всех вложенных пространств имен, в которые включен элемент.
Классификатор (classifier) — это пространство имен в модели, указывает на общие некоторому множеству объектов черты. Черты классификатора могут быть поведенческими, структурными или соединительными.
Класс (class) — это классификатор, который описывает некоторую концепцию моделируемой области. Черты класса могут быть различных видов, наиболее часто для описания функциональности класса используются операции (operation), а для описания хранимых данных или связей с другими классами — свойства (property). Если типом свойства является примитивный тип или тип данных, свойства показывают как атрибуты, класса иначе как часть ассоциации.
Операция (operation) — черта поведения интерфейса, класса или типа данных. Операция задается именем, набором параметров, типом возвращаемого значения и его кратностью. Каждый параметр операции может иметь имя, тип, кратность. В программировании операции будет соответствовать сигнатура метода.
Обратите внимание, что определение операции в классе не влечет определение ее реализации в этом классе. Понятие метода в UML2 обозначает реализацию операции алгоритмом, который не описывается средствами UML или не уточняется в модели. В последнем случае, такую реализацию операции называют нечетким поведением (opaqueBehavior).
Интерфейсом (interface) называют особый вид классификатора, который определяет способ взаимодействия с экземпляром класса, реализующего интерфейс. Интерфейс обычно включает операции, но может включать и свойства. В последнем случае наличие указанных свойств является обязательным для реализующего интерфейс класса.
Экземпляр класса (instance) — это элемент модели с описанием, возможно неполным, объекта, которому в системе приписаны черты данного класса. Для того чтобы указать значения свойствам класса в экземпляре используют слоты.
Связью (link) называется экземпляр ассоциации, соединяющий экземпляры классов. В языке программирования однонаправленной связи соответствует типизированный указатель или ссылка.
Ассоциация (association) — это типизированное отношение между классами, которое указывает на логическую связь между ними. Ассоциация имеет два или более полюсов, по одному у каждого связанного класса. Название полюса обычно указывает на роль, которую класс играет в ассоциации.
Обобщение (generalization) является направленным отношением от более специализированного классификатора к более общему. Специализированный, или дочерний, классификатор наследует черты более общего, или родительского, классификатора. Отношение обобщения уточняется отдельно для каждого вида классификатора, в том числе для классов и интерфейсов.
Украшениями (adornments) называются свойства полюса ассоциации, уточняющие роль участвующего в ассоциации класса. С помощью украшений указываются направление навигации, вид композиции и другие свойства полюса.
Типом данных (data type) называется классификатор, экземпляры которого не обладают индивидуальностью и, при совпадении значений свойств, взаимозаменяемы. Простыми (primitive), или примитивным типами данных, являются предопределенные типы: целое Integer, строка String, логический тип Boolean, числа с плавающей запятой Real и неограниченные натуральные числа UnlimitedNatural, которые используются для моделирования неопределенного количества элементов, например, экземпляров класса, участвующих в ассоциации.
Ограничением (constraint) называется логическое выражение об ограничиваемых элементах модели, вычисляемое в контексте какого-либо элемента. Если выражение ложно, то модель считается противоречивой (ill-formed).
Примеры нотации указанных выше элементов модели приведены на рис. 1 и рис. 2.
ЗАДАЧИ
1.1. Абстрактный класс Account имеет два дочерних класса: счет физического лица PersonalAccount и юридического CompanyAccount. При решении задачи используйте диаграммы классов.
а. Добавьте класс Person с общедоступным атрибутом FullName строкового типа и свяжите его с классом PersonalAccount ассоциацией Owns с полюсом owner у Person и навигируемым полюсом account у PersonalAccount.
б. Аналогично для счета юридического лица добавьте владельца Company, свяжите анонимной ассоциацией с CompanyAccount и укажите подходящие названия полюсов.
в. Добавьте класс адреса Address с атрибутами строкового типа street, city и целочисленным положительным building. Укажите с помощью новых анонимных ассоциаций, что Person может иметь адрес регистрации registeredAt, фактический адрес actual, в то время как компания связана с одним юридическим адресом legalAddress и может иметь почтовый адрес postAddress.
1.2. Интерфейс Stack определяет операции помещения в стек push с параметром obj типа Element, операцию получения элемента из стека pop с возвращаемым значением типа Element. При решении задачи используйте диаграммы классов.
а. Добавьте в интерфейс Stack операции очистки стека reset, которая не имеет параметров, статическую операцию создания нового стека createNew с возвращаемым значением типа Stack.
б. Покажите, что интерфейс Stack зависит от типа данных Element.
в. Добавьте класс ListStack, который реализует интерфейс Stack. Покажите реализуемые классом операции интерфейса.
г. Добавьте в класс ListStack частное структурное свойство arr типа Element с кратностью больше нуля, значения которого упорядочены и могут повторяться.
д. Добавьте частный целочисленный атрибут increment только для чтения и защищенную операцию изменения размера resize с целочисленным параметром newSize.
е. Покажите на диаграмме экземпляров экземпляр stack класса ListStack, свойство arr которого содержит элемент first типа Element первым и second того же типа вторым. Укажите, что атрибут increment экземпляра stack равен 10.
1.3. В пространстве имен Time расположены перечисления Month, DayOfWeek, а также классы Date и Period. При решении задачи используйте диаграммы классов.
а. Укажите, что перечисление Month может принимать значения: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec.
б. Укажите, что перечисление DayOfWeek может принимать значения: Mon, Tue, Wed, Thu, Fri, Sat, Sun.
в. Добавьте классу Date частные атрибуты year, month, dayOfMonth типа Integer, а также общедоступные операции:
— получения года getYear типа Integer; — получения месяца getMonth типа Month; — получения дня getDayOfMonth типа Integer; — получения дня недели getDayOfWeek типа DayOfWeek.
г. Добавьте классу Date общедоступную статическую операцию now () типа Date.
д. Добавьте классу Period общедоступную статическую операцию between. У операции два аргумента: from и to. Оба аргумента имеют тип Date. Операция возвращает значение типа Period
е. Добавьте классу Date операцию plus c аргументом delta типа Period. Результат операции — значение типа Date.
1.4. Класс MyWindow уточняет абстрактный базовый класс Window. MyWindow состоит (композиция) из кнопки класса Button и надписи класса Label. Отобразите на диаграмме классов.
а. Класс Label имеет частный атрибут text типа String и общедоступную операцию setText c параметром text типа String.
б. Композиция между MyWindow и Button называется HoldsButton. Полюс со стороны кнопки имеет имя okButton, защищенную видимость, кратность 1. Композиция между MyWindow и Label называется HoldsLabel. Украшения полюса со стороны Label: название textLabel, частная видимость, кратность 1.
в. Для реакции на события кнопки реализован паттерн Слушатель (Listener) следующим образом. Класс Button предоставляет операцию setClickListener с единственным параметром l типа IClickListener. Интерфейс IClickListener содержит единственную операцию onClick без параметров.
г. Класс MyWindow реализует интерфейс IClickListener для реакции на нажатие кнопки. Отобразите на диаграмме, что между классом Button и MyWindow есть ассоциация с именем NotifyListener с направлением от кнопки к окну. Укажите, что полюс со стороны окна называется listener, имеет тип IClickListener, множественную кратность и частную видимость.
д. И Label и Button имеют строковый атрибут text, который можно менять с помощью метода setText. Вынесите общий атрибут и метод в абстрактный базовый класс TextWidget.
е. Отобразите на диаграмме объектов, как в процессе выполнения объекты связаны между собой: объект window класса MyWindow связан с кнопкой button класса Button и с надписью label класса Label.
1.5. (см. решение в §11) Интерфейс доступа к коллекции элементов Collection обобщает интерфейс работы со списками List. Абстрактный класс BaseCollection реализует интерфейс Collection, абстрактный класс BaseList является потомком BaseCollection и реализует интерфейс List, оставляя операции по хранению данных дочерним классам.
а. Используя наследование, добавьте в модель класс ArrayList, реализующий операции со списками с помощью массива.
б. Пусть интерфейс List содержит операцию get получения элемента списка по заданной позиции k. Укажите, в каких классах должна быть объявлена данная операция, чтобы модель была согласованной. Ответ поясните.
в. Пусть интерфейс Collection содержит операцию add добавления элемента obj. Укажите, в пространстве имен каких классов может присутствовать поведение, реализующее операцию add. Ответ поясните.
1.6. Класс Collections содержит общедоступную статическую операцию addAll с возвращаемым значением типа boolean. Первый параметр операции называется coll и имеет тип Collection, второй параметр называется elements и имеет тип Object и кратность больше нуля.
а. Добавьте в класс Collections статический атрибут empty типа Collection, предназначенный только для чтения.
б. Реализуйте в классе Collections операцию addAll с помощью нечеткого поведения (метода), используя операцию добавления элемента insert (e: Object) класса Collection. Указание. Алгоритм реализации можно показать как псевдокод в комментарии в формате {method = {<language>} <method body>}.
1.7. Узел дерева Node может иметь несколько дочерних child узлов того же класса Node.
а. Приведите пример бинарного дерева, состоящего из семи узлов Node.
б. Постройте модель дерева, в котором каждый узел имеет от двух до четырех дочерних узлов.
в. Разработайте модель дерева, узлы которого могут быть двух видов: узел Red и узел Black. Указание. Вид узла может изменяться, при этом следует считать, что поведение узла не изменяется при смене типа.
1.8. У абстрактного класса заказа Reservation имеется два потомка: одиночный Single и подписка Subscription. Single связан с одним билетом Ticket ассоциацией бронирован reserved, Ticket может быть связан той же ассоциацией не более чем с одним Single.
а. Свяжите подписку с билетами в количестве от трех до шести включительно. Билет не обязательно связан с подпиской.
б. Как с помощью ограничений указать, что билет не может быть одновременно связан и с подпиской, и с одиночным заказом?
в. Пусть одиночная подписка наследует свойства одиночного заказа и подписки. С каким максимальным количеством билетов она может быть связана? Ответ поясните.
1.9. Умный дачный домик SmartHouse состоит из четырех стен Wall и крыши Roof. Домик реагирует на штормовые предупреждения stormWarning и укрепляет крышу harden, закрывает окна closeWindows в стенах. Используемые стройматериалы Material характеризуются ценой price и удельным весом unitWeight.
а. Добавьте стройматериалы для постройки домика: красный и белый кирпич Brick, доски Plank из сосны и дуба.
б. Укажите, что кирпич является материалом material стен. Используя ассоциации, покажите, что каркас крыши Frame сделан из не более чем сорока досок и может быть одного из видов FrameKind: мансарда, плоский или треугольный.
в. Каркас можно покрыть стройматериалом черепица Tiling, отразите это в модели.
г. Допустим, изобретен универсальный стройматериал, заменяющий доски, кирпичи и черепицу. Постройте из него дачный домик. Сколько экземпляров материала понадобится? Ответ поясните.
§2. СЦЕНАРИИ И ВАРИАНТЫ ИСПОЛЬЗОВАНИЯ
ОСНОВНЫЕ ПОНЯТИЯ
Актором (actor) называется классификатор, который моделирует пользователя или систему, внешнего по отношению к моделируемой системе или компоненту. Акторов, которые используют систему для достижения собственных целей, называют основными. Акторов, которых система использует для достижения целей других акторов, называют второстепенными.
Вариантом использования (use case) называют классификатор, который описывает совокупность сценариев взаимодействия акторов с системой или компонентом для достижения какой-либо цели, значимой для акторов. Варианты использования могут различаться по уровню цели, достижение которой они обеспечивают: высокоуровневые цели, пользовательские цели и отдельные функции системы.
Субъектом (subject) варианта использования называют систему или компонент, взаимодействие акторов с которым он описывает.
Ассоциация (association) актора с вариантом использования указывает на взаимодействие актора с субъектом в одном из сценариев данного варианта использования.
Отношение расширения (extension) между вариантами использования указывает, что при выполнении заданного в точке расширения (extension point) условия сценарий расширяемого варианта использования будет приостановлен, и взаимодействие будет продолжено в рамках расширяющего варианта использования.
Отношение включения (inclusion) указывает, что в процессе выполнения сценарии базового варианта использования вызывают выполнение сценариев включаемого варианта использования.
Как и для других классификаторов, для акторов и вариантов использования определено отношение обобщения (generalization).
ЗАДАЧИ
2.1. Актор User взаимодействует с системой OnlineTranslator в рамках абстрактного варианта использования Translate. Варианты использования TranslateText и TranslateWebPage уточняют Translate. Отобразите на диаграмме вариантов использования.
а. Вариант использования TranslateWebPage включает «include» вариант использования SetURL.
б. Вариант использования SetLanguages расширяет «extend» вариант использования Translate в точке расширения specifyLaguages. Условие расширения «язык не определен автоматически».
в. Добавьте в модель актора ExperiencedUser, уточняющего User. ExperiencedUser может взаимодействовать с системой в рамках варианта использования ProposeTranslation, который уточняет вариант использования TranslateText.
2.2. (см. решение в §11) Автор Author направляет статью SendPaper редактору журнала Editor. Редактор передает статью на рецензирование Review нескольким рецензентам Reviewer. Затем редактор возвращает отзывы рецензентов автору в том же варианте использования SendPaper.
а. Добавьте возможность автору вместе с корректором ProofReader подготовить статью к публикации PrepareForPublishing.
б. Доработайте модель, укажите, что подготовка статьи к публикации выполняется, только если она была одобрена редактором в варианте использования SendPaper.
2.3. Распознавателю текста OCR от модуля морфологии нужны возможность определить, принадлежит ли слово языку, и функция приведения слова к заданной форме, в частности, восстановления начальной формы. Также нужна функция получения грамматического значения конкретного слова.
а. Постройте модель модуля, выделите акторов, варианты использования и укажите отношения между ними.
б. Добавьте функцию вывода слов, похожих на введенное, если его нет в словаре языка. Каким образом данная возможность системы связана с другими функциями?
в. Укажите в модели, что все перечисленные задачи подразумевают выполнение поиска слова (или его основы) в словаре.
г. Некоторые языки могут не поддерживаться системой. Перед выполнением любой функции модуля морфологии нужно проверить, поддержан ли язык. Отобразите это в модели.
2.4. Ответственное лицо ResponsiblePerson может прикрепить документ AttachToIssue к обсуждаемому вопросу, выступая в роли автора author, и к постановлению AttachToResolution, выступая в роли председателя chairman.
а. Покажите в модели, что прикрепление документа выполняется согласно общему сценарию прикрепления, реализуемому в частном случае прикрепления к вопросу или прикрепления к постановлению.
б. Добавьте в модель оператора Operator, который является ответственным лицом с возможностью удаления документов DeleteDocument.
в. Доработайте модель, укажите, что при прикреплении документа рассылается оповещение SendAnnouncement. Несколько операторов могут выступать в роли контролеров controller.
г. Каким образом можно указать, что прикрепление документа возможно только к вопросу или к постановлению? Ответ поясните.
д. (*) Покажите в модели, что ответственное лицо участвует в сценарии прикрепления в роли пользователя user, объединяющей роли автора и председателя. Указание. Используйте производные свойства. См. §4.
2.5. Пользователь User настраивает подключаемые модули аудиоплеера AudioPlayer в рамках варианта использования ConfigurePlugins.
а. Добавьте к варианту использования ConfigurePlugins возможность выбора определенного модуля для настройки SelectPlugin и возможность настройки конкретного модуля ChangeSettings.
б. Добавьте в модель возможность обновить подключаемые модули UpdatePlugins с внешнего сервера PluginsServer.
в. Помимо обычного пользователя в системах обычно есть привилегированный пользователь SuperUser, который имеет права на изменение конфигурации системы. В системе аудиоплеера такой пользователь может обновить модули UpdatePluginsList. Обновление включает в себя удаление DeletePlugin, установку InstallPlugins и просмотр списка доступных на сервере CheckPluginsList.
2.6. Рассмотрим электронную библиотеку научных работ, представленную на рис. 4.
а. Поясните, каким образом используется электронная библиотека. Перечислите актеров и варианты использования.
б. Укажите, что аналитик Analyst принимает участие в индексировании статей, выполняемом в процессе их загрузки бизнес-партнером ContentPartner.
в. Предоставьте возможность исследователю Researcher использовать расширенный поиск AdvancedSearch, который позволяет указать другие параметры поиска в FindPapers.
г. Укажите, что все варианты использования преследуют цели уровня пользователя (user goal) системы. Указание. Уровни целей не входят в стандарт UML2.
2.7. Клиент Client выполняет операции над своими счетами в банке Bank, используя банкомат ATM в рамках абстрактного варианта использования PerformOperation, который включает информирование об услугах в варианте использования InformAboutServices. Для выполнения операций ATM обращается к платежной системе PaymentSystem.
а. Перечислите основных и вспомогательных акторов системы ATM. Какие из них взаимодействуют с системой в варианте использования PerformOperation?
б. Отразите в модели вариантов использования, что клиенты могут только выполнять операции по получению наличных, в то время как клиенты BankCustomers банка, владеющего банкоматом, могут также оплачивать услуги из списка, предоставляемого банком Bank. При этом сценарии оплаты услуг и получения наличных отличаются между собой, но следуют общему сценарию выполнения операций.
в. Добавьте возможность получения наличных как в валюте счета, так и в другой валюте. При этом в обоих случаях банкомат запрашивает у клиента Client подтверждение на списание средств в валюте счета по курсу банка Bank.
2.8. Во время подготовки данных для морфологического модуля лингвист Linguist взаимодействует с системой подготовки данных MorphoDPS с целью изменения данных ModifyData. Кроме того, для проверки целостности модифицируемых данных лингвисты могут компилировать данные Compile. Компиляция также включает в себя экспорт данных ExportData в формат, понимаемый компилятором. Каждую ночь сервер сборки приложения BuildServer компилирует данные Compile.
а. Добавьте в систему программиста Programmer, которому доступны те же возможности, что и лингвисту. Кроме того, он может экспортировать данные ExportData для отладки подсистемы компиляции данных.
б. Укажите, что для повторного использования словаря, который хранится на сервере данных морфологии, модуль семантики Semantics может взаимодействовать с системой подготовки данных морфологии в варианте использования ExportWordList.
в. Добавьте функции изменения данных: добавление, изменение и удаление слова.
г. Добавьте в модель возможность при изменении данных в некоторых случаях проверять целостность данных перед сохранением в систему.
д. Будет ли проверяться целостность данных при удалении слова? Ответ поясните.
2.9. Инкассатор Cashier и заправщик Loader занимаются обслуживанием автомата с газировкой. В обязанности инкассатора входит сбор денег CollectCash, а заправщик загружает в автомат баллоны с водой ChangeWater и газом ChangeGas.
а. Выделите в модели общий сценарий обслуживания, который включает авторизацию в системе обслуживания автомата и завершение сессии обслуживания.
б. Укажите, что автомат также может быть заправлен сиропом.
в. В каком случае инкассатор может загрузить в автомат баллон с водой? Ответ поясните.
г. Отразите в модели, что инкассатор может наблюдать за автоматом через Интернет с помощью встроенной видеокамеры с включением по сигналу датчика присутствия здания. Решение поясните.
2.10. Первоначальная модель загрузки CreateDocument и проверки документов ReviewDocument преподавателем Professor учебного заведения приведена на рис. 5.
а. Добавьте преподавателю возможность создавать курсы, как по шаблону, так и повторяя курс прошлого года.
б. Покажите на диаграмме, что у преподавателя есть три возможности проверки документа: с помощью мастера GuidedReview, совместно со студентом JointReview, и простое ревью BasicReview. При этом студенты сами могут загружать документы Upload и регистрироваться Enroll на курс.
в. Добавьте в модель ассистента преподавателя TA так, чтобы он обладал всеми обозначенными выше возможностями преподавателя, но не мог создавать курсы. При этом студент может быть ассистентом, но не преподавателем.
§3. КООПЕРАЦИИ И ВЗАИМОДЕЙСТВИЯ КЛАССОВ
ОСНОВНЫЕ ПОНЯТИЯ
Структурированным классификатором (structured classifier) называется классификатор, который может включать соединители, связывающие содержащиеся в классификаторе свойства. Структурированные классификаторы определяют контекст для соединителей и позволяют описать связи между экземплярами, возникающие во время выполнения системы.
Соединители (connector) — это черты структурированного классификатора, имеющие тип и связывающие два или более свойств классификатора. В то время как связи (links) являются экземплярами ассоциаций, соединители ограничивают возможные связи между экземплярами в зависимости от контекстного классификатора, которому принадлежат эти экземпляры.
Частью (part) классификатора называется свойство, с которым классификатор связан отношением композиции.
Кооперация (collaboration) является структурированным классификатором, обладающим поведением, и определяет роли составляющих ее частей и взаимодействия между ними в контексте кооперации. Кооперации используются для определения взаимодействий, обеспечивающих достижение какой-либо цели или реализации функции системы.
Вхождение кооперации (collaboration use) связывает элементы модели с ролями, определенными в кооперации.
Ролями (role) в кооперации называют части кооперации, параметры поведения или локальные переменные в поведении кооперации.
Состоянием (state) экземпляра классификатора называют условие или ситуацию, во время которой его свойства удовлетворяют некоторому условию, он выполняет определенное собственное поведение или ожидает какого-либо события.
Поведение (behavior) классификатора описывает изменение состояния классификатора с течением времени в ответ на внешние события и внутренние вычисления. Поведение может быть исполняемым (executable) и производным (emergent). Исполняемое поведение является описанием процесса исполнения некоторого алгоритма экземпляром классификатора путем выполнения действий. Производное поведение возникает в результате взаимодействия нескольких экземпляров.
Суть овеществления (reification) заключается в представлении происходящего поведения в виде экземпляра класса поведения. Таким образом, выполнение поведения экземплярами классов отождествляется с созданием и уничтожением экземпляра класса этого поведения.
Событием (event) называется описание группы изменений, которые могут привести к модификации значений свойств экземпляров в модели или выполнению поведения.
Сигнал (signal) является специальным видом классификатора, который описывает асинхронные запросы, направляемые экземплярам классификаторов. Черта приема определенного типа сигнала (reception) указывает, что экземпляры принимающего активного класса обрабатывают направленные им сигналы данного типа.
Траекторией (trace) называется частично упорядоченная последовательность возникновений событий (occurrence specification).
Взаимодействием (interaction) называется производное поведение участников, указывающее разрешенные и запрещенные траектории. Участникам сопоставлены линии жизни (lifeline), на которых откладываются возникающие на траекториях события. Когда взаимодействие происходит в контексте динамического структурированного классификатора, линии жизни соответствуют ролям в этом классификаторе, локальным переменным данного взаимодействия или параметрам вызываемых операций и отправляемых сигналов. Если кратность участвующего во взаимодействии свойства, переменной или параметра больше единицы, то для соотнесения линии жизни с определенным значением из нескольких используются селекторы (selector).
Сообщения (message), передаваемые в процессе взаимодействия, могут быть нескольких сортов: синхронный и асинхронный вызов операции, асинхронная отправка сигнала, создание и уничтожение экземпляра, и ответные (reply) сообщения. Передача сообщения между линиями жизни отмечается возникновением событий отправки и получения сообщения. Если отправитель или получатель находится вне взаимодействия, вместо него подставляется шлюз (gate).
Фрагмент взаимодействия (interaction fragment) является частью взаимодействия и включает множества разрешенных и запрещенных подпоследовательностей возникновений событий для всех или некоторых линий жизни.
Операторы взаимодействия (interaction operator) используются для изменения траекторий комбинированного фрагмента взаимодействия, состоящего из нескольких фрагментов. Определены операторы альтернативного выбора (alt), цикла (loop), параллельного возникновения событий фрагментов (par), условного выполнения (opt) и другие.
Спецификация исполнения (execution specification), отложенная на линии жизни, указывает на выполнение экземпляром классификатора соответствующего данной линии некоторого исполняемого поведения.
Вхождение взаимодействия (interaction use) служит для повторного использования взаимодействий, вместо фрагмента подставляется содержимое указанного взаимодействия.
ЗАДАЧИ
3.1. (см. решение в §11) Кооперация продажа Sale включает роли продавец Salesman и покупатель Customer.
а. Покажите, что продавец и покупатель могут взаимодействовать друг с другом.
б. Используя вхождения коопераций Sale, создайте модель кооперации продажи с посредником BrokeredSale, в которой покупатель взаимодействует с посредником Broker, а посредник как покупатель взаимодействует с продавцом.
3.2. Моделируется серверная часть веб-приложения интернет-магазина, построенного на основе паттерна Model-View-Controller (MVC). Взаимодействие между ролями Model, View и Controller отобразим на диаграмме последовательности.
а. Разместите на диаграмме роли Controller, Model, а также роль типа ORM с именем db. Синхронное найденное сообщение postBuy (purchase) приходит на линию жизни Controller. После этого Controller посылает Model синхронное сообщение addPurchase (purchase). В ответном сообщении Model возвращает объект purchaseDetails.
б. Реализуем на диаграмме поведение Model в ответ на сообщение addPurchase. Model посылает синхронное сообщение addPurchase (purchase) линии жизни db. Затем открывается фрагмент alt. При условии purchase.needDelivery Model посылает сообщение addDelivery(purchase.address) линии жизни db. Фрагмент alt окончен. Model посылает db синхронное сообщение saveChanges ().
в. В ответ на запрос покупки Controller должен сообщить пользователю, что заказ совершен успешно. После получения от Model ответного сообщения Controller создает новую линию жизни с ролью View сообщением createConfirmationView. Затем Controller посылает линии жизни View сообщение setPurchaseDetails (purchaseDetails). Затем Controller отправляет в ответ на входящий запрос ответное сообщение, содержащее View.
г. Отдел доставки нужно уведомить о том, что требуется доставить новый заказ. Добавим в Model (в опциональный фрагмент alt) посылку асинхронного сообщения notifyNewDelivery. Сообщение является потерянным.
д. Код интернет-магазина достаточно универсальный. Можно сделать на базе этого кода несколько сайтов для разных магазинов. Для этого нужно заполнить View при создании информацией о конкретном магазине. Добавим в контекст взаимодействия переменную shopInfo типа ShopInformation. После сообщения setPurchaseDetails начинается фрагмент использования взаимодействия ref с именем FillShopInformation. В этот фрагмент входят линии жизни Controller и View. В виде аргумента во взаимодействие передается переменная shopInfo.
3.3. (см. решение в §1) Автор Author направляет статью сообщением manuscript редактору Editor и ожидает от него подтверждения получения. Редактор отправляет сообщением evaluate статью рецензенту Peer. Рецензент отправляет сообщение редактору с оценкой статьи review. Редактор направляет сообщение автору с результатами resolution и рецензенту с благодарностью thanks.
а. Восстановите структурную модель взаимодействия в виде кооперации ReviewManuscript, укажите кратность роли рецензента так, чтобы статья направлялась на рецензию одному из пяти рецензентов.
б. Укажите, используя фрагменты, что статья направляется на рецензирование каким-либо трем из пяти рецензентов.
в. Используя фрагменты, покажите, что порядок отправки результатов рецензирования автору и благодарностей рецензентам не имеет значения.
3.4. Терапевт Therapist ведет прием посетителей Person, в ходе которого выписывает лекарства Medicine; посетители принимают лекарства.
а. Постройте логическую модель, включающую классы Therapist, Medicine и Person, и отношения между ними.
б. Используя кооперации, покажите, что на приеме терапевт выполняет обязанности врача Doctor, посетитель является пациентом Patient, лекарства выписываются в виде рецептов Subscription.
3.5. Автомобиль Car состоит из двигателя класса Engine, пары передних front и задних rear колес класса Wheel.
а. Добавьте привод drivetrain так, чтобы автомобиль был переднеприводным.
б. Расширьте модель так, чтобы наряду с переднеприводными автомобилями, она описывала полноприводные автомобили как частный случай переднеприводных. Добавьте необходимые элементы, используйте двигатель DoubleEngine с двумя приводами типа drivetrain.
3.6. Пассажир Person заходит в лифт и нажимает кнопку pressButton лифта Lift с указанием целочисленного номера этажа floor. Лифт закрывает двери и начинает движение синхронным вызовом операции startMoving. После этого сообщает пассажиру номера проезжаемых лифтом этажей сообщением floorReached с указанием номера этажа. Затем лифт вызывает операцию stopMoving и останавливается. Пассажир нажимает кнопку pressDoors лифта для открытия дверей.
а. Как можно уточнить модель взаимодействия, если известно, что лифт обслуживает с первого по пятый этажи?
б. Уточните взаимодействие пассажира с лифтом. Укажите, что до нажатия кнопки этажа, пассажир обязан закрыть двери кнопкой pressDoors.
в. Используя фрагменты, покажите, что пассажир не может нажать кнопку открытия и закрытия дверей в процессе движения лифта.
г. (*) Укажите, что лифт проезжает один этаж за три секунды.
3.7. Менеджер подключаемых модулей pluginsManager класса PluginsManager получает сообщение loadPlugins — указание на необходимость загрузки доступных модулей. Он синхронно запрашивает у объекта settings класса PluginManagerSettings пути к директориям с модулями и получает от settings значение свойства pluginsDirs. После чего в цикле для каждой директории и каждой библиотеки *.dll загружает модули вызовом собственной операции loadPlugins, передавая путь к библиотеке в параметрах.
а. Реализуйте операцию loadPlugins класса PluginsManager. Взаимодействие начинается с создания нового экземпляра PluginsDll, затем идет получение количества подключаемых модулей в библиотеке getPluginsCount и получение всех модулей через вызовы getPlugin с параметром — номером модуля. После этого происходит инициализация каждого полученного модуля IPlugin вызовом метода initPlugin класса PluginsManager.
б. Добавьте в модель описание действий по инициализации модуля. Метод initPlugin проверяет, обрабатывает ли модуль события графического интерфейса вызовом isUIHandled. Если обрабатывает, то регистрирует модуль в качестве слушателя событий addListener в классе PlayerUIPresenter.
3.8. Взаимодействие выбора этажа SelectFloor содержит линию жизни кабины, представленной экземпляром активного класса Cabin, линию жизни floor экземпляра класса кнопки этажа FloorButton с селектором «1», и линию жизни класса Algorithm. Взаимодействие начинается с синхронного вызова кабиной операции нажатия кнопки isPressed на линии floor. Операция возвращает логическое значение «истина», если кнопка нажата. Затем экземпляр класса Cabin вызывает операцию selectFloor у алгоритма на линии в данном взаимодействии.
а. Используя оператор цикла, покажите, что проверяется нажатие кнопок всех этажей. Переменную цикла, содержащую номер кнопки этажа, объявите как атрибут взаимодействия.
б. Уточните взаимодействие, добавив вызовы операции указания алгоритму этажей, кнопки которых нажаты.
в. Пусть взаимодействие описывает поведение кооперации, линии жизни соответствуют ролям в этой кооперации. Каким образом необходимо изменить взаимодействие, если кооперация владеет ролью с линией жизни алгоритма?
г. (*) Приведите по одному примеру разрешенной и неразрешенной траекторий в данном взаимодействии.
3.9. Пользовательский интерфейс мультимедиа проигрывателя PlayerView сообщает ev контроллеру UIPresenter о начале проигрывания элемента списка воспроизведения playEntry. Контроллер: 1) рассылает это сообщение всем своим слушателям собственной операцией raiseEvent; 2) получает от управляющего компонента Engine тип контента по имени name выбранного элемента item события ev вызовом getContentType; 3) по типу контента получает медиапоток вызовами getAudioStream или getVideoStream; 4) переводит интерфейс в состояние проигрывания либо видео, либо аудио вызовом setPlaybackMode и указывает медиапоток операцией setMediaStream; 5) запускает воспроизведение операцией play контроллера.
а. Добавьте в модель возможность параллельной обработки сообщений в raiseEvent так, что операция обработки handleEvent вызывается асинхронно у каждого зарегистрированного слушателя типа IUIListener. Для отображения в модели используйте два анонимных слушателя.
б. Уточните взаимодействие при обработке события запуска проигрывания песни модулем lyricsPlugin, зарегистрированным в качестве слушателя событий UIPresenter. Модуль определяет тип контента элемента, передаваемый в сообщении о запуске. Для аудиоконтента создает запрос о тексте песни, вызывая собственный метод makeRequest. Затем модуль асинхронно вызывает операцию dispatchRequest класса NetController, передавая в параметрах запрос и себя как обработчика ответа. Получив ответ от сервера, NetController передает processResponse его обработчику. Модуль вызывает displayPage у UIPresenter и передает полученную HTML-страницу с текстом песни
3.10. (*) При решении основных задач, морфологический модуль ищет запрашиваемое слово в словаре языка. Таким образом, многие задачи в модуле зависят от реализации функции поиска слова в словаре. См. диаграмму на рис. 8. Для уменьшения объема, который занимает словарь, используется тип данных префиксное дерево. Каждый узел дерева содержит ассоциативный массив буква — следующий узел. Таким образом, если слово есть в словаре, то в дереве есть путь, начинающийся в корне и проходящий по вершинам, соответствующим буквам слова.
а. Постройте модель кооперации поиска слова в словаре, используя роли класса Dictionary и узла дерева Node. Для моделирования префиксного дерева используйте квалифицированные соединители и булевый атрибут leaf, указывающий на конечный узел слова.
б. Добавьте в модель поведение кооперации. Актор парсер строки StringParser вызывает операцию hasWord класса Dictionary с параметром word типа String. Метод hasWord, реализующий операцию hasWord, получает корневой узел с помощью операции getRoot класса Dictionary. Получив экземпляр класса Node, метод в цикле для каждой следующей буквы слова word вызывает у этого экземпляра операцию getNextLetter с параметром c типа char — текущей буквы слова. Данная операция возвращает дочерний узел дерева. Когда буквы слова word закончились, нужно вернуть актору значение операции isLeaf последнего полученного узла Node.
в. Модифицируйте поведение. Если в какой-то момент вызов getNextLetter прерван по исключению NoSuchLetter, операция hasWord должна вернуть false.
3.11. Вариант использования просмотр каталога SearchCatalog реализован кооперацией GetAllRecords. Основной сценарий варианта использования начинается с получения контроллером приложения AC команды showRecords. AC отображает show в пользовательском интерфейсе UI сообщение «Идет запрос». AC параллельно отправляет источнику данных DataSource запрос readRecords. DataSource передает AC одну запись в параметре действия acceptRecord. Затем AC показывает запись в UI.
а. Укажите, что перед запросом записи, AC запрашивает getListSize количество записей у источника данных. Результат присваивается переменной listSize.
б. Измените модель так, чтобы источник данных передавал контроллеру listSize записей по одной, а контроллер отображал show в UI все полученные записи вместе.
в. Реализуйте альтернативный сценарий, когда источник данных не содержит записей.
г. Перечислите все необходимые соединители в кооперации GetAllRecords, укажите, какие сообщения по ним передаются. Ответ поясните.
д. (*) Какое минимальное количество экземпляров классов необходимо, чтобы выполнить описанное поведение? Ответ поясните.
ГЛАВА 2. МЕТОДЫ И ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ
Парадигмы проектирования. Возникновение проектирования программного обеспечения можно связать с появлением языков высокого уровня в 60-х и 70-х годах. Проектирование возникло как дисциплина, целью которой было управление сложностью программных систем и расширение возможностей разработчиков по созданию систем большего размера предсказуемого качества.
В развитии проектирования как дисциплины выделяют несколько этапов, в каждом из которых доминировала одна из парадигм проектирования. В 70-е и 80-е такой была структурная парадигма проектирования. Ее основу составляют нисходящие декомпозиционные методы, итеративно разделяющие систему на функциональные блоки, все более понятные и простые в реализации. Примерами таких методов могут служить метод постепенного уточнения (stepwise refinement) [6], метод структурного анализа и структурного проектирования SSA/SD [6], техника структурного анализа и проектирования SADT. Среди восходящих методов структурного проектирования следует отметить метод структурного проектирования Джексона [6].
Преимущественные нотации моделей в этой парадигме — это структурная схема, схема потоков данных, диаграмма сущность-связь, диаграммы IDEF.
В 80-е и 90-е преобладающими стали методы объектно-ориентированного проектирования. Основой методов является выделение общего описания групп объектов и использование этого описания в качестве абстрактного типа данных. Различные эвристики выделения общего описания и процедуры создания модели нашли выражение в различных методах анализа и проектирования. В результате объединения Objectory, OMT и OOAD был создан унифицированный процесс разработки RUP и язык моделирования UML. Во многом благодаря обсуждению принципов проектирования на страницах таких журналов как C++ Report были сформулированы эвристики повышения изменяемости и сопровождаемости систем SOLID [7]. Следует также отметить методы проектирования, основанные на выделении и группировке обязанностей RDD и связанные с ними эвристики назначения обязанностей GRASP [8]. А также методы, построенные на прямом использовании модели предметной области для построения программной системы. Позднее они нашли отражение в книге Эванса по предметно-ориентированному проектированию [5].
Сейчас объектно-ориентированные методы применяются для разработки отдельных компонент сложных систем. Методы структурного проектирования нашли применение при разработке систем обработки данных, в проектировании архитектуры систем масштаба предприятия.
Систематизация и количественный подход. Существование разных подходов к проектированию в одних и тех же отраслях ведет к необходимости их сравнения и определения предпочтительного и указания границ применимости. Инициатива по выработке базовых методов и теории программной инженерии SEMAT ставит своей целью каталогизацию методов, выработке их описания на основе нескольких базовых понятий и, таким образом, создания основ накопления данных об использовании методов для их последующего сравнения.
Распространенный подход к накоплению знаний в области проектирования — составление каталога повторно применимых приемов решения часто встречающихся задач проектирования, которое могут быть адаптированы для разных случаев — паттернов проектирования. В конце прошлого века были составлены первые каталоги паттернов. Наиболее известным является набор из двадцати двух паттернов «банды четырех» GoF [3]. В сфере высокоуровневого (архитектурного) проектирования аналогом паттернов выступают архитектурные стили [9], комбинации которых, исходя из требований к системе, составляют первоначальное архитектурное описание.
Результатом процесса проектирования являются отраженные в модели решения по реализации программной системы. Для прогнозирования нефункциональных характеристик системы, в том числе сопровождаемости, переносимости и других, вводят показатели проектировочного решения (метрики дизайна). Показатели используют для количественного описания размера системы, сложности решения, выявления недостатков и потенциально проблемных мест в системе. В данной книге рассматриваются показатели сложности проектировочного решения Чидамбера-Кемерера [10].
Применение методов. До автоматического проектирования программных систем пока еще далеко, в проектировании остается существенная доля искусства. В том числе вследствие самой сути задач проектирования, относящихся к так называемым плохо поставленным задачам (wicked problems), условия которых неполны, противоречивы, меняются со временем и в процессе решения. Тем не менее, владение базовыми методами позволяет не отвлекаться на обдумывание задач, решение которых уже известно, и, таким образом, повысить качества результата и сократить время его создания.
Рассматриваемые в сборнике методы проектирования отражают современное состояние практики разработки и проектирования на уровне компонентов и приложений. Их изучение позволит как вступить в специальность проектирования, восполнить отдельные пробелы, так и по-новому взглянуть на уже известную область.
Принципы проектирования классов и интерфейсов SOLID. Аббревиатура SOLID расшифровывается по первым буквам сокращений названий принципов проектирования классов.
Single responsibility principle (SRP), принцип ограничения обязанностей, говорит, что модуль или класс должен иметь только один набор функционально сходных обязанностей.
Open-closed principle (OCP), принцип открытости-закрытости, указывает, что класс или модуль должен быть расширяем (открыт для расширения) без внесения в него изменений (закрыт для изменения).
Liskov substitution principle (LSP), принцип подстановки (описан в статье Барбары Лисков, отсюда название), указывает правило построения иерархии типов так, что любой подтип или дочерний класс подставим вместо базового типа или класса соответственно.
Interface segregation principle (ISP), принцип разделения интерфейса, говорит, что для обозначения разных ролей, которые играет класс в разных взаимодействиях, следует использовать разные интерфейсы.
Dependency inversion principle (DIP), принцип обращения зависимостей, указывает на корректное применение принципа сокрытия информации в объектно-ориентированном подходе к проектированию, когда зависимости направлены от реализации класса к выделенным абстракциям: описаниям типов данных или интерфейса
§4. РАСШИРЕННЫЕ КЛАССЫ И ОБЪЕКТЫ
ОСНОВНЫЕ ПОНЯТИЯ
Квалификатор (qualifier) используется для разделения всех связей ассоциации на подмножества согласно уникальным ключам. Обычно в бинарной ассоциации «один-ко-многим» по ключу выделяют связи «один-к-одному».
Класс ассоциации (association class) используют, когда логическое отношение между объектами обладает сложной структурой или поведением. Класс ассоциации является одновременно и ассоциацией, и классом, поэтому может иметь свойства и операции.
Напомним, что операция — это поведенческая черта класса, которая определяется именем, набором параметров, их типами и кратностями, типом и кратностью возвращаемого значения. В дополнение к этому, можно задать ограничения на реализацию операции: предусловие (precondition), постусловие (postcondition), ограничение возвращаемого значение (body condition).
Если операция не изменяет значения свойств класса, то к операции добавляется украшение запрос (query).
Каждый параметр операции может иметь имя, тип, множественность. Параметру можно задать направление параметра (in, out, inout, return), значение по-умолчанию, ограничение на множественный параметр: упорядоченность значений (ordered), уникальность значений (unique).
Производные свойства класса (derived property) вычисляются на основе других свойств или результатов вызова операций класса или других классов модели. Способ вычисления значений свойства указывается вместе с определением самого свойства, при этом вычисление значений не должно иметь сторонних эффектов и должно быть идемпотентным (повторные вычисления дают тот же результат при неизменности остальной модели). Часто используются производные свойства, значения которых составлены из объединения union множеств значений свойств, выделяющих подмножества subsets в базовых свойствах.
Шаблонные классы (template class) по сути не являются полноценными классами, а только их заготовками, определенными с точностью до значений параметров шаблона. Шаблонным может быть не только класс, но и другие элементы модели. Операция присвоения значения параметру называется связыванием (bind). По смыслу, связывание класса с шаблонным классом с приданием значения параметру аналогично созданию класса из шаблона с указанным значением параметра и наследованием от этого класса.
Переопределение (derived) позволяет заменить определение черты классификатора в рамках его контекста переопределения (redefinition context), составляющего совокупность всех классов, обобщающих данный. При переопределении можно заменить, например, сигнатуру операции. После переопределения при обращении к новой операции в классе следует использовать новую сигнатуру. При этом наследованная переопределенная операция также доступна для использования.
Множество обобщения (generalization set) позволяет логически группировать отношения обобщения. Можно указать, что в данном множестве обобщений приведены все возможные уточнения базового класса, или что совмещение непосредственно уточняющих классов в одном экземпляре или подклассе не допускается.
Супертип (powertype) используется совместно с множеством обобщений. Супертип это классификатор, экземплярами которого являются классы-элементы множества обобщений.
Пакеты (package) позволяют группировать элементы модели под общим именем. Для обращения к элементу пакета необходимо использовать квалифицированное имя, состоящее из имени пакета и имени элемента.
Между пакетами определены отношения доступа «access», которое для элементов пакета делает доступным элементы указанного пакета без необходимости указания квалифицированного имени, и отношение импорта «import», которое аналогично доступу, но делает элементы также доступными при последующем импорте или доступе из другого пакета.
Отношение объединения пакетов (merge) «merge» позволяет объединить в одном элементе определения этого элемента в других пакетах.
Сигналом (signal) называют особый вид классификатора, экземпляром которого является сообшение, передаваемое асинхронно отправителем получателю или группе получателей. Для того, чтобы обрабатывать сигналы, получатель должен быть активным классом (active class), объявлять черту поведения — получение сигнала (reception), с которой может быть связан метод, либо определять собственное поведение, которое обрабатывает поступающие сигналы.
ЗАДАЧИ
4.1. На рис. 11 представлены шаблонные интерфейсы Map и Entry. Интерфейс Map позволяет по ключу типа K получить значение типа V. Интерфейс Entry представляет собой пару значений.
а. Измените модель так, чтобы шаблон Entry использовал параметры шаблона Map.
б. Определите интерфейс Map_StringInteger, который указывает String типом ключа и Integer типом значения в шаблоне Map.
в. Сколько операций содержит интерфейс Map_StringInteger? Ответ поясните.
4.2. Диск Disk содержит несколько папок Folder, которые могут содержать файлы File и папки. Произведения Composition хранятся на дисках в виде файлов.
а. Используя классы ассоциаций, постройте модель хранения произведений на дисках.
б. Дополните модель, укажите, что произведение может быть картинкой Picture, либо музыкой Music, либо фильмом Movie.
в. Может ли произведение храниться на одном диске в разных файлах? Ответ поясните.
г. (*) Сравните способы реализации в модели хранения произведения в нескольких файлах на одном диске. Приведите примеры на диаграмме экземпляров.
4.3. На заседании Meeting обсуждается discuss не менее одного вопроса Issue. Вопрос может быть посвящен обсуждению артефакта Artifact. В каждом вопросе должно быть указано текстовое название, числовой код и имя автора.
а. Добавьте в модель вопрос по постановлению, отдельный вопрос и сложный вопрос.
б. Укажите, что постановление Resolution связано с вопросом по постановлению, как тема topic, и с несколькими артефактами documents.
в. К сложному вопросу примените паттерн Composite так, чтобы сложный вопрос включал несколько других вопросов.
г. Приведите пример, когда на заседании обсуждается сложный вопрос, включающий вопрос по постановлению claim и отдельный вопрос, а также связанные с постановлением документы mail и agenda.
4.4. Интерфейс работы с ассоциативным массивом Map в своем пространстве имен содержит интерфейс работы с элементом массива Entry. При этом реализации интерфейса Map включают несколько реализаций интерфейса Entry.
а. Добавьте в модель класс HashMap, реализующий ассоциативный массив с помощью хэш-таблицы, и класс HashEntry, реализующий интерфейс работы с элементом массива.
б. Пусть в классе HashMap определена частная операция изменения размера resize. При каких условиях данная операция будет доступна классу HashEntry?
в. Используя шаблоны, параметризуйте интерфейсы ассоциативного массива и его элемента, укажите, что тип ключа и тип значения в них совпадают.
4.5. Класс CPluginsSettings хранит пути к директориям, в которых могут находиться подключаемые модули. Класс управления подключаемыми модулями CPluginManager связан с CPluginsSettings. Модули входят в состав динамической библиотеки, содержащей доступные извне функцию получения количества подключаемых модулей GetPluginsCount и функцию GetPlugin с параметром типа Integer, которая возвращает экземпляр модуля IPlugin.
а. Работа с динамической библиотекой состоит из трех шагов: загрузка библиотеки, получение функции по ее имени, вызов функции. Добавьте в модель класс динамической библиотеки CDynamicLibrary, с операцией получения указателя на библиотечную функцию по ее имени GetFunction.
б. Одними из самых популярных считаются модули, добавляющие в плеер возможность построения визуального ряда для композиций и отображения текста песен. Добавьте в модель соответствующие модули CVisualizationPlugin и CSongLyricsPlugin.
в. Известно, что библиотека подключаемых модулей предоставляет неизменный набор функций, поэтому можно применить паттерн Wrapper к API библиотеки, реализуемый с помощью класса CPluginDll. Реализуйте и сравните два подхода: через уточнение класса CDynamicLibrary, и с помощью агрегации.
4.6. В системе из задачи 4.5 реализована модель обработки сообщений с помощью паттерна Observer: событие представлено классом Event. источник событий представлен абстрактным классом EventSource, обработчик событий — интерфейсом IEventListener. Класс EventSource определяет общедоступную операцию добавления обработчиков и защищенную операцию возбуждения событий, которая вызывается в дочерних классах и приводит к рассылке события всем обработчикам.
а. Добавьте в модель источники событий управляющего компонента EngineSource и представления UISource.
б. Укажите, что добавленные источники создают события, специфичные этим источникам, и поэтому принимают только специализированные обработчики IEngineListener и IUIListener соответственно.
в. Каждый модуль (см. задачу 4.5) может обрабатывать события управления и представления. Добавьте класс PluginEventHandlers, содержащий IEngineListener и IUIListener. При этом нужен доступ к обработчикам событий в конкретном экземпляре модуля.
4.7. В классе Object определена операция сравнения equals с параметром obj типа Object и определен метод (behavior), реализующий данную операцию. Дочерний класс Rectangle перекрывает и реализует операцию equals. Другой дочерний класс Clickable класса Object также перекрывает и реализует операцию equals.
а. Пусть экземпляр класса Rectangle присвоен переменной var класса Object. Какая из реализаций будет выполнена при вызове операции equals у переменной var c параметром var? Ответ поясните.
б. (*) Добавьте в модель класс Button дочерним к Rectangle и Clickable. Используя механизм переопределения (redefinition), добавьте в класс Button операцию equals, реализация которой использует наследованные операции сравнения в зависимости от типа параметра obj времени выполнения. Приведите реализацию операции на подходящем языке программирования.
4.8. Массив Table состоит из нескольких элементов Element.
а. Укажите, что элементы упорядочены и могут повторяться.
б. Отразите в модели, что имея экземпляр массива, можно перейти к его элементам, но от экземпляра элемента нельзя перейти к массиву.
в. Пусть массив проиндексирован таким образом, что индексом элемента также является элемент. Используя квалификаторы, отразите данное свойство в модели.
4.9. Преподаватель Teacher ведет teaches несколько курсов CourseOffering.
а. Используя агрегацию, покажите, что курс состоит из одной лекции Lecture и нескольких семинаров Practice.
б. Укажите, что преподаватель ведет семинары как ассистент assistant и читает лекции как лектор lecturer.
в. (*) Измените свойство teaches так, чтобы оно всегда указывало только на курсы, по которым преподаватель читает лекции или ведет семинары.
4.10. Каждый экземпляр абстрактного класса контроллер Controller связан по ассоциации Sensor с несколькими датчиками поезда TrainSensor. В ассоциации контроллер играет роль управляющего controller. Датчик поезда участвует в ассоциации как датчик sensor с частной видимостью.
а. Используя квалификаторы, укажите, что каждому значению индекса index типа String соответствует не более одного датчика в ассоциации Sensor.
б. Измените класс контроллера, укажите, что класс принимает сигналы приближения поезда TrainSpotted и отдаления поезда TrainLeft, имеет общедоступную операцию выполнения команд execute с параметром команда cmd типа данных Command и возвращает значение типа данных Result.
в. Определите класс цифрового контроллера DigitalController, уточняющий класс контроллера. В классе цифрового контроллера определена операция executeDigital, которая переопределяет операцию выполнения команд контроллера и возвращает цифровой результат DigitalResult.
г. Используя экземпляры классов, приведите пример контроллера с двумя датчиками.
4.11. Игрок Player заключает контракт Contract c командой Team. Команда может заключить до двадцати контрактов с разными игроками. Контракт заключается на определенный срок period с компенсацией salary (класс ассоциации). В контракте игрок указан работником worker, команда — нанимателем employer.
а. Добавьте в контракт пункты Item, каждый из которых содержит текст statement. Укажите, что менеджер Manager управляет manages контрактами.
б. Укажите, что игрок может быть нападающим Forward, защитником Guard или центровым Center. Игрок не может иметь несколько специализаций.
в. Игроки реагируют на команды тренера Coach. Во время игры, тренер может отправлять им указания: нападать attack, перейти к обороне guard, играть совместно join с другим игроком peer. Работа тренера состоит во взаимодействии и обучении Train команды.
г. Измените модель таким образом, чтобы игроки могли изменять специализацию: нападающий, защитник или центровой. Решение поясните.
4.12. (*) В файловой системе диска Disk данные сохраняются в кластерах Cluster, информация о связанных цепочках кластеров записана в таблице размещения файлов FAT. Таблица содержит записи FAT Record, номер записи в таблице соответствует номеру cl_no соответствующего кластера при этом номер кластера cl_no на диске. Содержимое записи указывает либо на следующий кластер, либо на конец цепочки EOF. Кластер директории Folder содержит entries упорядоченный набор отметок Entry о файлах и директориях. Каждая из записей указывает имя name и начальный кластер first.
а. Постройте модель файловой системы, используя квалифицированные ассоциации. Указание. Следующий кластер в цепочке вычислять с помощью производных атрибутов.
б. Добавьте кластер данных File, содержащий данные файлов. Операция getData позволяет получить данные файла в виде массива с элементами типа Byte с диапазоном значений от 0 до 255.
в. Добавьте резервные кластеры Reserved, укажите, что отметка об испорченности Bad, пустоте Empty кластера хранится в FAT Record.
г. Приведите пример диска с таблицей размещения файлов на пять кластеров с одной директорией folder и двумя файлами A и B. Файл с именем B размещен в кластере с номером 4, файл A в кластерах 2 и 3. Таблица размещается в нулевом кластере, корневая директория в первом.
4.13. Процессом рецензирования Review управляет Manages пользователь User в роли редактора editor. Процесс включает разговор Conversation с пользователями автором author и разговоры с пользователям-рецензентами peers. Разговор состоит msgs из сообщений Message. Каждое сообщение связано с одним пользователем — отправителем sender сообщения, и несколькими получателями recipients. К сообщению может быть прикреплен документ Document в виде вложения attachment.
а. Укажите, что множество участников participants разговора включает всех получателей и отправителей сообщений.
б. Пусть процесс рецензирования связан с рукописью manuscript, которая является документом. Уточните модель, укажите, что рукопись получена как вложение в одном из сообщений разговора с автором.
в. Перечислите все экземпляры классов, которые необходимы для создания экземпляра процесса рецензирования.
4.14. Кабина лифта Cabin содержит кнопки Button и датчики Sensor. В классе Button имеется операция определения нажатия isPressed, которая возвращает логическое значение. Кнопки бывают двух видов: служебные кнопки UtilityButton и кнопки этажей FloorButton. В классе FloorButton определена операция сброса reset. Известно, что класс Cabin реализует собственное поведение, а класс Sensor реализует паттерн Template Method.
а. Укажите, что кабина содержит девять упорядоченных по номеру разных кнопок этажей.
б. Используя только имеющиеся классы, укажите, что в кабине имеется служебная кнопка вызова диспетчера. Кроме этого, в кабине может быть либо служебная кнопка остановки, либо служебная кнопка открытия дверей.
в. Покажите, что датчики бывают только трех видов: датчик задымления, датчик закрытия дверей и датчик перегрузки лифта. Датчики существенно отличаются, поэтому в одном классе не могут быть совмещены реализации всех видов датчиков.
г. Какое минимальное количество экземпляров необходимо, чтобы представить кабину с датчиками задымления и закрытия дверей?
4.15. Рассмотрим модель, которая описывает графы вычислений. Действия Action и ребра Edge являются элементами Element модели. Ребро указывает направление вычисления и может иметь начальное действие from и конечное to.
а. Добавьте в модель симметричные действия сложения и умножения и одноместные действия обращения и получения противоположного элемента. Эти действия принимают и возвращают значения по ребрам Edge. Класс Value уточняет Edge и имеет атрибут val, но не имеет источника from, откуда получить значение.
б. Постройте модель реализации отображения графа вычислений в графическом пользовательском интерфейсе, где действия показаны прямоугольниками, а ребра — стрелками. Следуйте принципу SRP.
в. Приведите пример графа вычислений выражения 4 * (а + b). Введите необходимые типы значений.
4.16. В графическом редакторе использованы фигуры: отрезок Line между начальной и конечной точками Point и дуга Arc второго порядка, построенная по упорядоченному набору из трех точек. Фигуры позволяют задать свое положение точками и умеют рисовать paint себя на холсте Canvas.
а. Определите в подходящем существующем или новом классе статические операции создания отрезков и дуг по передаваемым точкам, и операцию создания точек по координатам на плоскости. Примените паттерн Factory Method.
б. Добавьте в модель фигуру ломаная Polyline, состояние которой задается набором соединенных последовательно отрезков.
в. Предложите альтернативную реализацию ломаной Polyline, состояние которой определяется последовательностью точек. Как в этом случае воспользоваться алгоритмом рисования отрезков? Сравните решение с пунктом б.
г. Для замкнутых ломаных без самопересечений Polygon определите операцию заливки fill внутренней области одним из трех цветов RGB: красным, зеленым или синим. Примените паттерн Decorator. В каком классе следует реализовать проверку свойств замкнутости и отсутствия самопересечений ломаных?
4.17. Заготовка модели биллинга приведена на рис. 12. Экземпляры транзакций Transaction формируются, когда пользователь с учетной записью Account совершает действие по расходованию ресурса Resource согласно тарифу Tariff.
а. Покажите на диаграмме, что учетные записи пользователей бывают временные Temporary и постоянные Permanent с одной стороны, и корпоративные Corporate и индивидуальные Personal с другой. Для временной записи заданы время старта и завершения. Используйте множества обобщений и супертипы Type и Time.
б. Используя паттерн Decorator, добавьте динамическую учетную запись DynAccount, которая может менять тип и время действия по определенным ранее вариантам.
в. Покажите на диаграмме состояние системы после совершения двух транзакций по ресурсам r1 и r2 постоянным корпоративным пользователем с DynAccount по тарифу basicTariff. В каждой транзакции расходуется две единицы ресурса.
4.18. В Domain-Driven Design при моделировании предметной области используются особые виды типов данных и классов: объект-значение Value Object, сущность Entity, корень агрегата Root. В дополнение к определению класса UML используемые в DDD виды классов несут дополнительную информацию, которая не может быть представлена в стандартной метамодели UML. На рис. 13 показана заготовка профиля.
а. Используя уже имеющиеся стереотипы, добавьте в заготовку профиля виды классов Entity и Root. Приведите решение на диаграмме профилей.
б. Агрегат состоит из корня, всех сущностей и объектов-значений, достижимых через свойства из корня без учета их видимости. Покажите это в модели, введя подходящий базовый класс и ассоциации между стереотипами.
в. Покажите, что некоторые пакеты могут быть модулями Module. Модуль определяет операцию encloses проверки принадлежности элементов непосредственно модулю или пакету, вложенному в него.
г. Используя ограничения, покажите, что корень агрегата может возвращать только объекты-значения или корни агрегатов, и что все общедоступные свойства или параметры операций возвращаемых типов объекты-значения, либо корни агрегатов.
д. Добавьте стереотипы сервиса предметной области Domain Service и репозитория Repository так, чтобы для метакласса Interface можно было указать только один из них. Покажите, что сервисы и репозитории можно передавать между агрегатами и интерфейсами сервисов.
е. Известно, что репозитории, сервисы предметной области и классы, их реализующие, не могут иметь свойства типа объект-значение или сущность. В то же время классы предметной области фабрики Factory могут. Отразите это в модели.
§5. АНАЛИЗ И ВЫДЕЛЕНИЕ КЛАССОВ
ОСНОВНЫЕ ПОНЯТИЯ
Абстрактный тип данных (abstract data type) определяет совокупность объектов, которые полностью описываются одним набором действий над этими объектами. Таким образом, абстрактный тип данных полностью определяется составом и условиями выполнения этих действий. Классическими примерами абстрактных типов данных являются стек, очередь, список.
Обязанности (responsibilities) выделяют как составные элементы решения проблемы и назначают объектам или классам, ответственным за их реализацию в системе. Обязанности объекта или класса бывают трех видов: обязанность знать и владеть определенной информацией, обязанность выполнять определенные действия и предоставлять интерфейс для их вызова, обязанность организовывать взаимодействие других объектов.
Метод Аббота (Abbot method) [10] заключается в изучении текстовых описаний проблемы или постановки задачи с целью выделения классов-кандидатов. Метод определяет набор правил извлечения существительных из текста, объединения синонимов и исключения неподходящих существительных: числительных, не имеющих отношения к изучаемой проблеме понятий и других.
Метод именных групп (noun phrase) [10] является модификацией оригинального метода Аббота, изначально сформулированного для извлечения сущностей в структурном проектировании. Метод именных групп также основан на выделении существительных, но оставляет на усмотрение аналитика критерии отнесения класса-кандидата к релевантным поставленной задаче, нерелевантным или нечетким классам.
Метод карточек класс-контракт-коллеги (CRC) [10] направлен на анализ взаимодействия объектов для реализации некоторой функции системы. При рассмотрении сценариев взаимодействий участники формулируют обязанности предполагаемых объектов. Метод применяется итеративно, последовательно рассматривая ключевые функции системы. Результатом метода являются описания обязанностей объектов и их взаимодействий, обычно представляемые в виде карточек формата 90 на 140 мм.
Метод шаблонных классов [10] заключается в поиске в системе классов, обычно выделяемых в сходных по назначению системах. Для этого применяются перечни категорий классов, таких как внешние сущности, вещи, события, организационные единицы, места или структуры классов из других категорий.
Для выделения релевантных классов из списка классов-кандидатов также применяют разнообразные эвристики и контрольные списки (checklisting). Контрольный список включает несколько вопросов относительно класса-кандидата и критерий исключения классов-кандидатов. Например, класс должен описывать множество объектов, содержать несколько атрибутов и операций, применимых к каждому объекту, быть важным для описания проблемы или предметной области.
ЗАДАЧИ
5.1. Диск состоит из пронумерованных кластеров. На диске есть именованные папки, в которые вложены папки или именованные файлы. Список файлов и папок в папке хранится в одном кластере диска, данные файлов хранятся в нескольких кластерах.
а. Выделите классы и определите отношения между ними, используя абстрактные типы данных (ADT) и метод Аббота.
б. Добавьте операции и атрибуты к имеющимся классам для создания, удаления папок и файлов, записи и чтения буфера данных с определенной позиции в файле.
5.2. Больной посещает доктора, чтобы получить рецепт на лекарства для своей болезни.
а. Применив метод Аббота, выделите классы и постройте модель предметной области для системы учета посещений больными докторов для поликлиники.
б. Применив метод Аббота, выделите классы и постройте модель предметной области для программы-ежедневника приема лекарств для посетителей.
5.3. В межгосударственном стандарте по оценке качества программных средств ГОСТ 28195—89 качество характеризуется набором факторов. Краткое описание: на каждом из этапов разработки программного средства фактор описывается набором критериев. Каждый критерий измеряется с помощью нескольких метрик, различающихся для этапов разработки. Метрики могут использоваться разным критериями.
а. Выделите классы, применив метод именных групп к краткому описанию из условия задачи.
б. Уточните отношения между классами, учитывая, что на разных этапах разработки факторы описываются разными наборами критериев, которые измеряются различными метриками.
в. На рис. 14 представлена схема критериев и метрик качества для фазы анализа. Покажите ее представление в модели на диаграмме экземпляров.
г. Используя схему, представленную на рис. 15, постройте критерии и метрики надежности для этапа реализации программного средства.
5.4. Аудиоплееры состоят из менеджера подключаемых модулей, пользовательского интерфейса, который обрабатывает пользовательский ввод, управляющего компонента, реализующего основную функциональность, и библиотеки мультимедиа. Загружаемые модули взаимодействуют с компонентами плеера.
а. Выделите классы и определите отношения между ними, используя абстрактные типы данных (ADT) и метод Аббота.
б. Для загрузки, включения и выключения подключаемых модулей добавьте операции и атрибуты к выделенным классам. Полагайте, что пользовательский интерфейс обрабатывает команды от пользователя асинхронно.
в. Уточните описание аудиоплеера, чтобы в нем присутствовал менеджер соединений, и в системе в целом был сервер с базой доступных модулей. Менеджер модулей может, используя менеджер соединений, подключаться к серверу с целью проверки обновлений установленных модулей.
5.5. Среди основных функций системы управления клиентами (CRM) выделяют управление карточками клиентов ManageClients, обработку заявки, проведение сделки и подготовку отчета. Менеджер по продажам использует эти функции в своей работе, кроме подготовки отчета, которую выполняет руководитель отдела. Клиенты участвуют в обработке заявки и проведении сделки. В карточке клиента ClientCard указываются его реквизиты, поданные заявки Note и проведенные сделки Deal. У заявки обязательно указывается дата и время, текст сообщения, может быть указан текст ответа. Менеджеру по продажам назначается несколько карточек клиентов и один руководитель отдела.
а. Выделите акторов и варианты использования, покажите на диаграмме. Решение поясните.
б. Выделите оставшиеся классы-кандидаты, используя метод именных групп (noun phrase).
в. Постройте модель предметной области, укажите отношения между классами, хранимые классами данные и операции классов. Решение поясните.
§6. АРХИТЕКТУРНОЕ ПРОЕКТИРОВАНИЕ, КОМПОНЕНТЫ
ОСНОВНЫЕ ПОНЯТИЯ
Структурированным классификатором (structured classifier) называется классификатор, который может включать соединители, связывающие содержащиеся в классификаторе свойства. Структурированные классификаторы определяют контекст для соединителей и позволяют описать связи между экземплярами, возникающие во время выполнения системы.
Портом (port) называется часть структурированного классификатора, через которую осуществляется взаимодействие с другими внешними классификаторами. Порт может предоставлять и требовать наличия нескольких интерфейсов. Взаимодействие, осуществляемое через поведенческий (behavioral) порт, не делегируется частям классификатора, а обрабатывается им самим.
Делегирующий соединитель (delegating connector) связывает порт с одной из частей классификатора, если данная часть реализует предоставляемый портом интерфейс или нуждается в требуемом интерфейсе.
Сборочный соединитель (assembly connector) связывает части классификатора или разных классификаторов между собой и указывает возможные пути взаимодействия частей.
Компонент (component) является структурированным классификатором, обладающим поведением. Компонент — это модуль системы, который скрывает свою внутреннюю структуру, взаимодействует с другими компонентами через определенные интерфейсы, и материализация (manifestation) которого в системе может быть заменена при сохранении окружения (environment). Таким образом, поведение компонента полностью определяется набором предоставляемых и требуемых интерфейсов. Компоненты используются для определения повторно используемых частей системы и для описания модульной структуры системы.
Артефакт (artifact) представляет в модели файл, документ или другой объект, который используется или создается в процессе разработки программы или в результате ее установки и использования. Артефакт в модели является классификатором и может вступать в ассоциации с другими артефактами.
Артефакты материализуют (manifestation) другие элементы модели, таких как компоненты.
Узел (node) описывает вычислительный ресурс, на котором могут быть развернуты для выполнения артефакты. Узлы взаимодействуют через подключения (communication path). В метамодели узел является специальным видом класса, а каналы связи — ассоциациями между узлами. Дочерние классы узла уточняют вид ресурса: вычислительные элементы оборудования моделируются устройствами (device), а программные платформы — средами исполнения (execution environment).
ЗАДАЧИ
6.1. Структура поисковой системы представлена на рис. 19.
а. Покажите, что индекс Index может быть только двух видов — простой SimpleIndex и распределенный DistrIndex.
б. Распределенный индекс через очередь сообщений MsgBus взаимодействует с узлами индекса IdxNode по протоколу AMQP. Высоконадежная версия очереди сообщений состоит из нескольких реплик, соединенных через InLink.
в. Материализуйте и разместите компоненты системы согласно многозвенной архитектуре, в которой распределенная очередь сообщений располагается на выделенном сервере.
6.2. Файл Morphology_.dll материализует компонент MorphoEngine, который предоставляет интерфейс IMorphology. Компоненту MorphoEngine для работы необходим компонент RootObjects и файлы словарей. Файлы словарей имеют названия <ISO_639—1_код_языка>.lng. Например, «ru_.lng», «en_.lng». Компонент RootObjects материализован в библиотеке RootObject_.dll.
а. Отобразите в модели артефакты и отношения между ними, необходимые для запуска морфологического модуля для работы с французским и немецким языками.
б. Укажите, что для локализации сообщений пользователю компонент MorphoEngine использует интерфейс IMorphoLocalize. Этот интерфейс уже реализован для русского и английского языков компонентами MorphoLocalizeRu и MorphoLocalizeEn, материализованными библиотекой MorphoLocalize. dll. Добавьте в модель зависимость от компонента русской локализации.
в. (*) Пометьте, что для корректной работы морфологическому модулю нужна библиотека RootObjects_.dll версии 4.0.1.157. Указание. Введите подходящий профиль.
6.3. Лифт Elevator состоит из кабины класса Cage, пульта управления класса ControlUnit и нескольких панелей вызова с этажа класса FloorControls. Соединитель между пультом управления и кабиной имеет тип cageWire, между пультом и панелями — floorWire. При этом пульт подсоединен к каждой панели индивидуально.
а. Добавьте в модель двигатель класса Engine как составную часть лифта. Двигатель связан с кабиной кабелем cable и с пультом схемой управления controls.
б. Доработайте модель так, чтобы взаимодействие лифта с внешними классами происходило только через интерфейс кнопок кабины CageControls, управления лифтом Operations и интерфейсы вызова с этажей FloorButtons. Команды, принимаемые через интерфейсы, направляются на соответствующие части лифта.
в. Укажите, что для работы лифту требуется подключение к электрической сети Power.
г. Перечислите имена и типы всех элементов пространства имен класса Elevator.
д. Чему соответствуют порты класса Elevator в программном коде реализации класса Elevator?
6.4. Подсистема подготовки данных модуля морфологии MorphologyDPS состоит из базы данных Database, клиента для модификации данных DataClient, компонента экспорта Export и компилятора данных Compiler.
а. База данных предоставляет интерфейс изменения данных IMorphologyData и интерфейс экспорта данных IDataExport. Клиент требует для работы интерфейс изменения данных, в то время как компонент экспорта требует интерфейс экспорта данных. Компилятор не требует внешних интерфейсов, но неявно зависит от базы данных. Укажите в модели, как компоненты связаны между собой в подсистеме.
б. Разместите базу данных на сервере MorphoDB, а остальные компоненты на компьютере лингвиста LinguistWorkPlace.
в. Уточните внутреннюю структуру компилятора следующим образом. Компилятор использует интерфейс IMorphology компонента MorphoModel. Сам компилятор состоит из парсера Parser, обработчика сообщений об ошибках Handler и сборщика модели Builder. Компоненты, реализующие парсер и сборку моделей, сообщают об ошибках через интерфейс IErrorHandler компонента Handler в составе компилятора. Сборщик модели компилятора требует внешний интерфейс IMorphology.
6.5. Приложение класса Application содержит подключаемые модули. Подключаемый модуль класса Bean является либо процессным модулем ProcessorBean, либо алгоритмическим модулем ComputeBean. Процессный модуль связан ComputeLink с подключаемыми модулями для выполнения расчетов.
а. Используя представление внутренней структуры, укажите, что специализация MainApp приложения Application включает один процессный модуль и два связанных с ним алгоритмических модуля.
б. Доработайте модель, укажите, что приложение MainApp включает два связанных процессных модуля, один из которых является основным main.
в. Покажите, что основной процессный модуль приложения MainApp реализует интерфейс управления вычислениями Computation, предоставляемый приложением через порт веб-сервисов ComputationEndpoint.
г. Укажите, что приложение MainApp предоставляет и реализует интерфейс конфигурации Configuration через порт ConfigurationEndpoint.
д. Используя соединители сборки, покажите, что основной процессный модуль приложения MainApp может обращаться через интерфейс Computation к приложению SecondApp.
е. Перечислите все черты приложения MainApp.
6.6. Интерфейсом Frontend сервиса MonolithService пользуются веб-сайт Website и API. Интерфейс предоставляет методы работы с кабинетом пользователя и с файлами пользователя. Реализация сервиса использует кэш Cache и контекст EntityContext доступа к данным.
а. Проведите рефакторинг интерфейса сервиса, если известно, что веб-сайт пользуется и кабинетом, и файлами, а API только файлами пользователя.
б. Разделите сервис MonolithService на модули, выделив подходящие абстракции на основе принципа сокрытия информации Information Hiding. Обеспечьте доступ модулей к кэшу и контексту доступа к данным. Решение поясните.
в. Необходимо обеспечить обратную совместимость с прошлыми версиями клиентов, предоставив интерфейс Frontend целиком. Воспользуйтесь паттерном Adapter для его реализации. Предполагайте наличие legacy-методов, которые отсутствуют в новой реализации.
6.7. Для системы обработки текстов выбран архитектурный стиль Pipes-and-Filters. Одна из функций системы — векторизация текста — включает чтение текста из файла, очистку текста от служебных символов и знаков пунктуации, разделение на слова, нормализацию и вычисление частоты вхождения в текст каждого слова и запись результатов в файл. Размещение системы предполагается на серверах Srv1 и Srv2 с ОС Linux, соединенных вычислительной сетью.
а. Покажите на диаграмме классов структуру системы, если известно, что фильтры бывают только обработчиками Processor, источниками Source или результатами Result.
б. Воплотите компоненты для функции векторизации текста в исполняемых файлах и разместите их на сервере Srv1.
в. Добавьте в компоненты системы возможность сбора статистики через интерфейс Status агентами сбора статистики Monitor. Разместите компоненты вместе с агентами и управляющим компонентом статистики на двух серверах Srv1 и Srv2 так, чтобы нормализация текста проводилась отдельно на сервере Srv2, где также установлен управляющий компонент статистики.
6.8. На структурной диаграмме (рис. 20) показан фрагмент структуры программы построения отчета. Программа читает записи данных recs из файла с именем iname, рассчитывает таблицу рядов показателей rows и записывает их в файл с именем oname. Имена файлов передаются программе в параметрах. Заголовок отчета hdr содержит названия отчета и показателей.
а. Перечислите модули, показанные на представленной диаграмме. Добавьте на диаграмму недостающие один или несколько модулей построения отчета, используя критерий сокрытия информации Information Hiding. Решение поясните.
б. Преобразуйте программу к объектно-ориентированному стилю, используя обращение зависимостей (DIP) и технику спецификации модулей (module specification). Покажите структуру программы на диаграмме.
в. Преобразуйте программу в сервис с веб-интерфейсом WebUI и программным интерфейсом RESTService. Каким образом следует реализовать в сервисе построение отчета по базе данных? Построение другого отчета?
6.9. Удаленный отладчик для встраиваемых программ TargetDebugger позволяет собирать треки выполнения программы на устройстве, передавать их для сопоставления с UML моделью программы на рабочей станции разработчика. Отладчик состоит из программы-монитора на устройстве DeviceMonitor и модуля подключения по сети RemoteLib.
а. Интерфейс Monitor монитора позволяет указать setBreakpoint точку останова по адресу в памяти addr, остановить pause и продолжить resume выполнение программы. Покажите на диаграмме классов интерфейс монитора, и его реализации для разных платформ ARM7, PowerPC и Cortex-M3.
б. Покажите структуру модуля подключения по сети, используя бинарный протокол BinaryTcp и текстовый протокол Telnet. Воспользуйтесь паттерном Proxy и представьте решение на диаграмме компонентов. Решение поясните.
в. Выберите артефакты и разместите модули отладчика на рабочем месте разработчика и устройстве на ARM7, предполагая связь по Telnet. В каком архитектурном стиле реализован отладчик?
§7. СХЕМЫ СОСТОЯНИЙ И КОНЕЧНЫЕ АВТОМАТЫ
ОСНОВНЫЕ ПОНЯТИЯ
Состояние (state) конечного автомата, связанного с классификатором, моделирует ситуацию в жизненном цикле классификатора, когда выполняется некоторое, обычно неявное, условие. Например, свойства классификатора принимают значения из определенного множества, или условия при которых прием некоторого сигнала или вызов операции приводит к исполнению одного и того же поведения. В процессе выполнения конечного автомата, состояния могут быть активными и неактивными.
Композитным состоянием (composite state) называют состояние, у которого есть вложенные состояния. Если композитное состояние активно, то активно только одно из его вложенных состояний.
Ортогональное состояние (orthogonal state) включает два или более ортогональных региона, каждый из которых содержит вложенные состояния. Если ортогональное состояние активно, то в каждом ортогональном регионе активно только одно вложенное состояние.
Схема состояний (statechart) описывает недетерминированный иерархический конечный автомат, может включать композитные и ортогональные состояния. Конечный автомат в схеме состояний выполняется в контексте экземпляра некоторого классификатора, поведение которого он описывает. Схемы состояний часто используются для описания жизненного цикла объектов, возможных сценариев исполнения вариантов использования и бизнес-процессов.
Триггером (trigger) называют описание события, при возникновении которого будет выполнено указанное действие, осуществлен переход между состояниями. Если вместе с триггером указано сторожевое условие, то переход будет осуществлен, только если истинно сторожевое условие. Определены следующие виды событий: приема сигнала, вызова операции, событие времени, событие изменения. Примечательно событие получения неопределенного сообщения (AnyReceiveEvent), которое возникает, если для полученного сообщения не определен триггер.
Переход (transition) указывает, каким образом конечный автомат реагирует на возникновение события. Простой переход соединяет два узла в схеме состояний автомата. Сложный или комплексный переход соединяет несколько ортогональных исходных или конечных состояний. Внутренний переход обеспечивает выполнение эффекта без смены состояния. Если из активного исходного состояния осуществляется переход в другое конечное состояние, то конечное состояние становится активным.
Эффектом (effect) при переходе называют действие, выполняемое при осуществлении перехода. Действие выполняется в контексте схемы состояний, при этом активным является состояние, в которое вложены исходное и конечное состояние перехода, если такое имеется.
Схема состояний может включать различные псевдосостояния (pseudostate): начальное (initial), историческое (history state) и полное возвратное (deep history), разделения и слияния (для комплексных переходов), выбора (choice), точки входа (entry) и выхода (exit), терминальное (terminal) и соединительное (junction). Псевдосостояния обычно используются для объединения простых переходов в более сложные конструкции.
При достижении конечного состояния (final state), состояние или регион, его содержащие, считаются завершенными. Если достигается конечное состояние в схеме состояний, то конечный автомат считается завершенным, и контекстный экземпляр классификатора уничтожается (terminates).
ЗАДАЧИ
7.1. Моделируется мобильное приложение — электронный словарь, имеющее несколько окон. Схему перехода между окнами будем моделировать с помощью диаграммы схем состояний.
а. Добавьте на диаграмму состояния Список слов, Перевод, Словоформы слова. Переход между Список слов и Перевод по событию Выбрано слово, обратный переход по событию Назад. Переход между Перевод и Словоформы слова по событию Словоформы, обратный переход по событию Назад.
б. В некоторых карточках перевода есть ссылки на другие карточки. При переходе по ссылке мы попадаем в то же состояние Перевод, но для другого слова. Добавьте переход в себя из состояния Перевод, активируемый событием Переход по ссылке.
в. Возврат после перехода по ссылке по событию Назад должен возвращать пользователя в предыдущую карточку. Для этого добавим к переходу по ссылке действие Добавить в стек. Добавим переход в себя из состояния Перевод по событию Назад со сторожевым условием [стек не пуст] и действием Убрать из стека. В переход из состояния Перевод в состояние Список слов по событию назад нужно добавить сторожевое условие [else].
г. Перед запуском приложения нужно загрузить словари. На время загрузки словарей пользователю будет показан экран приветствия. Добавим ортогональное состояние Инициализация. В нем выделим два региона. В первом регионе добавим начальное и конечное псевдосостояния. Между ними добавим состояние Загрузка словарей с выполняемой при нахождении в состоянии деятельностью Загрузить словари. Ожидается переход в конечное состояние по завершении деятельности. Во втором регионе мы добавим переход из начального состояния в конечное по событию времени after (3 s). Это необходимо, чтобы при быстрой загрузке пользователь успел прочитать содержимое экрана приветствия. Из ортогонального состояния Инициализация переход по завершению в Список слов.
д. Уточним поведение в окне списка слов. Список слов становится составным состоянием. Дальнейшие состояния являются вложенными в Список слов. Из начального псевдосостояния происходит переход в состояние История запросов. По событию Ввод из Истории запросов происходит переход в псевдосостояние выбора. Далее при условии поле ввода пустое происходит переход (возврат) в состояние История запросов. Иначе происходит переход во вложенное составное состояние Поиск слова. По событию Ввод происходит переход из Поиск слова в описанное выше псевдосостояние выбора. В составном состоянии Поиск слова непосредственно процедура поиска откладывается с помощью события времени after (1 s). После этого события происходит переход из начального псевдосостояния в состояние Поиск в словаре. По завершению происходит переход из Поиск в словаре в Отображение списка.
7.2. (см. решение в §11) Светофор TrafficLights после создания переходит в состояние выключен Offline. При включении On, светофор переходит во вложенное состояние «зеленый» Green состояния включен Online. По истечении 50 секунд, светофор переходит в состояние «желтый» Yellow в Online. Затем, через 3 секунды — в состояние «красный» Red. По истечении 50 секунд светофор возвращается в состояние «зеленый».
а. Добавьте возможность выключить Off включенный светофор.
б. Доработайте модель, укажите, что интервалы t между переключениями сигналов светофора настраиваются вызовом операций setGreen, setRed и setYellow в выключенном состоянии.
в. Измените порядок включения светофора, используя сторожевые условия, укажите по аналогии с предыдущим пунктом, что начальный сигнал светофора при включении initialGreen, initialYellow или initialRed настраивается setInitial в выключенном состоянии.
7.3. После создания статья Paper является черновиком Draft. После отправки sent статья рассматривается программным комитетом конференции OnReview, при этом выполняется рецензирование статьи reviewPaper. При согласии комитета approved, статья принимается на конференцию Accepted. Если комитет не принял статью declined, статья становится черновиком Draft.
а. Уточните изменения состояний статьи при рецензировании. После получения статья проверяется Checking. Если обнаружены недостатки, статья направляется на доработку correct в состояние OnCorrection. Если недостатков нет, рецензирование статьи завершается. При повторной отправке статьи sent она проверяется повторно Checked.
б. Укажите, что если статья не была отправлена с исправлениями недостатков в течение 10 дней, рецензирование прекращается и статья становится черновиком Draft.
7.4. Самолет Aircraft изначально находится InHangar в ангаре. При выходе на рейс flight самолет переходит на посадку Boarding. В полете InAir самолет выполняет деятельность по управлению полетом flightControl. В начале полета самолет убирает шасси pullGearUp, и выпускает в конце pullGearDown.
а. Устраните недостаток в модели — покажите, что при получении разрешения на взлет самолет переходит в состояние взлета TakeOff и после отрыва — в состояние полета. При получении разрешения на посадку landingPermit самолет переходит в Landing и, по прибытии, переходит на посадку.
б. В соответствии с требованиями аэропорта, самолет должен отправлять сигнал об освобождении полосы freeRunway после взлета и перед прибытием, и поддерживать постоянный радиоконтакт radioComm при нахождении на полосе.
в. Уточните состояние полета, укажите, что в долгом полете через час после взлета пассажирам предлагается обед Dinner, который длится один час.
г. Отразите в модели, что в случае возникновения неисправности в полете malfunction, самолет будет поврежден Damaged. Покажите, что самолет может совершить посадку только в исправном состоянии Normal.
д. Что произойдет, если самолет получит разрешение на посадку во время обеда? Ответ поясните.
7.5. Контроллер мультимедиа-проигрывателя PlayerController изначально находится в нерабочем состоянии NotInitialized. При запуске проигрывателя происходит переход в состояние загрузки Loading, при входе в которое инициализируются управляющий компонент initEngine и интерфейс проигрывателя initUI. В данном состоянии загружаются доступные модули loadPlugins. По завершению загрузки контроллер переходит в состояние готовности Ready.
а. Основное назначение проигрывателя — воспроизводить аудио и видео. Добавьте в состоянии готовности режимы воспроизведения, остановки и паузы, а также события, инициирующие переходы между этими режимами.
б. Хорошие мультимедиа-проигрыватели параллельно воспроизведению автоматически обновляют медиатеку: осуществляют поиск нового контента Searching и загружают информацию о нем из сети Downloading. Добавьте в модель данную функциональность.
7.6. Изначально настольная лампа Lamp выключена Off. При переключении выключателя turnOn лампа работает Light. Когда лампа работает, при переключении turnOff она выключается Off.
а. Доработайте модель состояний. Укажите, что если лампа падает со стола fell или сгорает в процессе работы burnDown, то она выходит из строя Damaged.
б. Укажите, что неисправные лампы Damaged утилизируются dispose с уничтожением лампы.
7.7. Телефонный аппарат Phone после включения становится свободен Available. Если поднять трубку takeHandset, то аппарат станет активным Active. В активном состоянии пока не нажата цифра digit или не прошло 15 секунд аппарат проигрывает гудок playTone. После набранной цифры аппарат ожидает набора следующей цифры Dial, если не возникла ошибка error и номер еще не полный continue. Если при наборе цифры номер завершен complete, то предпринимается попытка соединения connect с переходом в состояние занято Busy, если вызываемый номер занят busy, или вызов Ringing, если свободен free. Когда абонент возьмет трубку, аппарат начинает разговор с передачей голоса voiceComm.
а. Укажите, что аппарат переходит в состояние таймаут Timeout по истечении 15 секунд при проигрывании гудка до набора номера и при ожидании ответа.
б. Реализуйте переход в состояние Available по возвращении трубки на место returnHandset. Как влияет текущее состояние телефона на выполнимость этого перехода?
в. Укажите, что аппарат проигрывает короткие гудки playBusy, когда вызываемый номер занят, и длинные playRing, когда идет вызов свободного номера.
г. Покажите в модели, что после завершения разговора абонентом hangUp данный аппарат переходит в состояние Busy.
д. Пусть состояние вызываемого номера аппарату сообщает АТС в результате попытки соединения, отразите это в модели так, чтобы выполнялись требования run-to-completion. Ответ поясните.
Бесплатный фрагмент закончился.
Купите книгу, чтобы продолжить чтение.