28 ПОБЕГАЙЛО - Белорусский государственный университет

advertisement
ДИНАМИЧЕСКОЕ НАЗНАЧЕНИЕ РОЛЕЙ В ЯЗЫКАХ
ПРОГРАММИРОВАНИЯ СО СТАТИЧЕСКОЙ ТИПИЗАЦИЕЙ
А. П. Побегайло
Белорусский государственный университет
Минск, Беларусь
E-mail: pobegailo@bsu.by
Рассмотрен подход к динамическому назначению ролей объектам в языках со статической типизацией, основанный на преобразовании типов данных.
Разработан шаблон проектирования для решения задачи динамического назначения ролей. Приведена реализация шаблона на языке программирования С++.
Ключевые слова: роли, преобразование типов, шаблоны проектирования,
язык программирования С++.
ПРОБЛЕМА ДИНАМИЧЕСКОГО НАЗНАЧЕНИЯ РОЛЕЙ
В настоящее время этап проектирования программных систем включает разработку концептуальной модели прикладной области. Каждая концепция рассматривается как некоторая сущность, которая обладает некоторыми свойствами и связями с
другими концепциями. Поэтому естественно, что в концептуальной модели прикладной системы встречаются такие сущности, как роли. Например, человек может играть роль врача, учителя и так далее в зависимости от ситуации. Так как концептуальная модель прикладной области естественным образом является основой концептуальной модели программной системы, то при разработке этой программной системы требуется решить вопрос о реализации ролей или назначении ролей объектам
классов. Более подробно вопросы концептуального моделирования прикладной области системы с использованием ролей рассмотрены в работах [1–5].
Часто, абстрагируясь от вопросов проектирования систем, при определении ролей используют следующий подход. Все классы разбивают на две категории: естественные (natural or intrinsic classes) классы и ролевые классы (role classes) или просто
роли. Подразумевается, что естественные классы имеют конкретные свойства и отношения с другими естественными классами. С другой стороны, роли исполняются
естественными классами, а сами по себе не имеют конкретных свойств и отношений.
Причем часто возникает ситуация, когда роли естественным классам должны назначаться динамически в зависимости от контекста системы.
В современных языках программирования, используемых в промышленном
программировании, как правило, отсутствуют встроенные средства программирования ролей. В данном докладе рассмотрен вопрос динамического назначения ролей
объектам в языках программирования со статической типизацией. В качестве модельного языка программирования со статической типизацией используется широко
используемый при разработке программных систем язык программирования С++.
137
КОНЦЕПТУАЛЬНАЯ РЕАЛИЗАЦИЯ РОЛЕЙ
Вопросы концептуального моделирования ролей подробно рассмотрены в работах [6–12]. В данном докладе приведено решение проблемы программирования ролей, основанное на шаблоне проектирования, предложенном в работе [6], который
показан на рис. 1.
Actor
Role
play
1
*
RoleA
RoleB
Рис.1. Шаблон проектирования для реализации ролей
Здесь Actor и Role обозначают концептуальные классы, а RoleA и RoleB – конкретные классы-роли, которые может играть актер. Так как актер может играть роль,
то между классами Actor и Role существует отношение ассоциации, которое назовем
play. Как видно из диаграммы, это отношение указывает, что актер может играть несколько ролей. Одна из возможных реализаций этого шаблона, используя агрегацию
ролей в классе Actor, также приведена в работе [6]. Другие возможные подходы к
реализации ролей рассмотрены в работах [13–17].
В данном докладе рассмотрен другой подход к реализации шаблона проектирования
Actor-Role, который основан на использовании класса для реализации ассоциации play. В
языке моделирования систем UML такие классы называются классами-ассоциациями (association class). Концептуально этот подход был предложен в работе [9]. Концептуальный
шаблон для реализации этого подхода к реализации ролей представлен на рис. 2. В
этом шаблоне концептуальный класс Converter представляет концептуальный класс,
который реализует ассоциацию play. Проблема заключается в практической реализации этого класса. В следующем разделе представлен подход к решению этой проблемы, используя средства преобразования типов языка программирования C++.
Приведем описание шаблона Actor-Role, следуя классической схеме, предложенной в работе [18].
Назначение шаблона: выполняет преобразование типов данных в зависимости
от контекста окружения.
Мотивация: необходимость в динамическом преобразовании типов данных в
зависимости от контекста окружения.
Применимость: класс не знает имена классов, в которые должны быть выполнено преобразование его типа.
Структура шаблона: структура шаблона приведена на рис. 2.
Участники шаблона: Участниками шаблона являются следующие классы:
138
•
Actor – класс, тип которого должен быть преобразован. Класс Actor не
знает классов, в которые должен быть преобразован его тип.
• Role – класс, в тип которого должен быть преобразован класс Actor.
• Converter – класс выполняющий динамическое преобразование типов
данных.
• RoleA, RoleB – классы наследники класса Role, которые могут представлять специализацию ролей.
Взаимодействия: клиент выполняет явное преобразование объекта класса Actor
к объекту класса Converter. Преобразование объекта класса Converter к объекту класса Role выполняется неявно. Преобразования типов выполняются во время исполнения программы.
Последствия: класс Actor освобождается от необходимости знания всех ролевых классов. Как следствие, код приложения становится более структурированным,
так уменьшается связность классов.
Реализация шаблона приведена в следующем разделе.
Родственные шаблоны: FactoryMethod, AbstractFactory.
Conv erter
Actor
Role
1
*
play
RoleA
RoleB
Рис.2. Шаблон с реализацией ассоциации play классом
Шаблон Actor-Role можно отнести к порождающим шаблонам, так как этим шаблоном создаются объекты класса Role. С точки зрения создания объектов этот шаблон
можно сравнить с шаблонами FactoryMethod и AbstractFactory. Различие между этими
шаблонами состоит в том, какой подход в этих шаблонах используется для создания
объектов различных классов. В шаблоне FactoryMethod классы создаваемых объектов
определяются через наследование. В шаблоне AbstractFactory классы создаваемых
объектов определяются, используя агрегацию. В шаблоне Actor-Role класс создаваемого объекта определяется посредством оператора преобразования типов.
РЕАЛИЗАЦИЯ ШАБЛОНА ACTOR-ROLE
Для реализации класса-ассоциации Converter предлагается использовать шаблон Type Promotion [19], который устанавливает между двумя типами отношение
139
преобразования объектов одного типа в объекты другого типа. В языке программирования C++ этот шаблон реализуется двумя способами:
• конструктором класса с единственным параметром;
• оператором преобразования типов.
Однако каждая из этих реализаций не является транзитивным отношением. Поэтому клиент должен явно выполнить одно из двух преобразований типов. Более
подробно последовательность преобразования типов можно описать так. Клиент явно
преобразовывает объект класса Actor к типу Converter, а преобразование из типа
Converter в нужный тип роли выполняется компилятором. Приведем схему класса
Converter на языке программирования С++.
class Converter
{
public:
Converter(const Actor& a) {}
operator Role() const { return Role(); }
};
Очевидно, что если класс Role имеет наследников, то класс Converter содержит
операторы преобразования типов для каждого класса наследника. Ниже приведен
пример использования шаблона Actor-Role.
void client(const Role& r) {}
int main()
{
Actor a;
client(Converter(a));
return 0;
}
ЗАКЛЮЧЕНИЕ
В докладе рассмотрен подход к реализации ролей в языках программирования
со статической типизацией, который позволяет выполнять динамическое назначение
ролей. Реализация подхода основана на шаблоне Type Promotion.
ЛИТЕРАТУРА
1.
2.
3.
4.
Kristensen, B. B. Roles: Conceptual Abstraction Theory & Practical Language Issues / B. B. Kristensen,
K. Østerbye // Theory and Practice of Object Systems. 1996. Vol. 2. №. 3. P. 143–160.
Chu, W. W. Associations and Roles in Object-oriented Modeling / W.W. Chu, G. Zhang // Proceedings
of the 16th International Conferece on Conceptual Modeling ER '97. Springer-Verlag Berlin Heidelberg.
1997. Lecture Notes in Computer Science. Vol. 1331. P. 257–270.
Genilloud, G. Foundation for the Concept of Role in Object Modelling / G. Genilloud, A. Wegmann //
Proc. of the 4th International Enterprise Distributed Object Computing Conference (EDOC 2000). IEEE
Computer Society Press. 2000. P. 76–85.
Liping, Zhao. Designing Application Domain Models with Roles / Zhao Liping // Model Driven Architecture, European MDA Workshops: Foundations and Applications, MDAFA 2003 and MDAFA 2004.
Springer-Verlag Berlin Heidelberg. 2005. Lecture Notes in Computer Science. Vol. 3599. P. 1–16.
140
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Zhu, H. Supporting Software Development with Roles / H. Zhu, M. C. Zhou // IEEE Trans. on Systems,
Man and Cybernetics, Part A. 2006. Vol. 36, №. 6. P. 1110–1123.
Fowler, M. Dealing with Roles / M. Fowler / Proceedings of Pattern Languages of Programming (PLoP)
Conference 1997. Technical Report WUCS-97-34. Washington University Dept.
Bäumer, D. The Role Object Pattern / D. Bäumer, D. Riehle, W. Wiberski, M. Wulf // Proceedings of
Pattern Languages of Programming (PLoP) Conference 1997. Technical Report WUCS-97-34. Washington University Dept.
Steimann, F. Role=Interface / F. Steimann / Journal of Object-Oriented Programming. October/November 2001. Vol. 14, №. 14. P. 23–32.
Mossé, Francis G. Modeling Roles – A Practical Series of Analysis Patterns / Francis G. Mossé / Journal
of Object Technology. September-October 2002. Vol. 1, №. 4. P. 27–37.
Cabot, J. Roles as Entity Types: A Conceptual Modelling Pattern / J. Cabot, R. Raventos // Proceedings
of the 23rd International Conferece on Conceptual Modeling (ER’04). Springer-Verlag Berlin Heidelberg. Lecture Notes in Computer Science. Vol. 3288. P. 69–82.
Chernuchin, D. Role Types and their Dependencies as Components of Natural Types/ D. Chernuchin,
G. Dittrich // Roles, An Interdisciplinary Perspective. Papers from the 2005 AAAI Fall Symposium.
AAAI Press. Menlo Park, California. 2005. P. 39–46.
Cabot, J. Conceptual Modelling Patterns for Roles / J. Cabot, R. Raventós // Journal on Data Semantics
V. Springer-Verlag Berlin Heidelberg 2006. Lecture Notes in Computer Science. Vol. 3870. P. 158–184.
Steimann, F. On the representation of roles in object-oriented and conceptual modeling / F. Steimann //
Data & Knowledge Engineering. 2000. Vol. 35, № 1. P. 83–106.
Loebe, F. Towards a Definition of Roles for Software Engineering and Programming Languages /
F. Loebe // Proceedings of the 2nd Workshop on Roles and Relationships in Object Oriented Programming, Multiagent Systems, and Ontologies (Roles 2007). Berlin, Germany, July 30–31. Forschungsberichte der Fakultät IV. Elektrotechnik und Informatik Nr. 2007–09, Technical University of Berlin.
P. 47–49.
Trygve, M. Roles and Classes in Object Oriented Programming. / M. Trygve // Proceedings of the 2nd
Workshop on Roles and Relationships in Object Oriented Programming, Multiagent Systems, and Ontologies (Roles 2007). Berlin, Germany, July 30–31. Forschungsberichte der Fakultät IV. Elektrotechnik
und Informatik Nr. 2007–09, Technical University of Berlin. P. 54–62.
Gottlob, G. Extending Object-Oriented Systems with Roles / G. Gottlob, M. Schrefl, B. Röck // ACM
Transactions on Information Systems. 1996. Vol. 14, №. 3. P. 268–296.
Chernuchin, D. Comparison of Object-Oriented Approaches for Roles in Programming Languages /
D. Chernuchin, O. S. Lazar, G. Dittrich // Roles, An Interdisciplinary Perspective. Papers from the 2005
AAAI Fall Symposium. AAAI Press. Menlo Park, California. 2005. P. 31–38.
Гамма, Э. Приемы объектно-ориентированного проектирования / Э. Гамма, Р. Хелм, Р. Джонсон,
Дж. Влиссидес. СПб. : Питер, 2001. 368 с.
Coplien, J. O. C++ Idioms Patterns / J. O. Coplien // Pattern Languages of Program Design 4. Addison
Wesley, Reading, MA, 2000. Chapter 10. P. 167–197.
141
Download