SMartyProfile
O SMartyProfile baseia-se no inter-relacionamento dos principais conceitos de LPS no que tange o gerenciamento de variabilidade (Seção \ref{sec:GV}). Tais conceitos são aplicados aos elementos de interesse do metamodelo da UML. Com base no relacionamento entre os conceitos de gerenciamento de variabilidade e os modelos UML, a Figura 3 apresenta o perfil UML SMartyProfile 5.1.

A seguir são elencados os estereótipos e meta-atributos (tagged values) que compõem o SMartyProfile:
- « variability » representa o conceito de variabilidade, sendo esta uma extensão da metaclasse UML Comment. É aplicado somente em notas UML. É composto dos seguintes meta-atributos:
- name, o nome que referencia uma variabilidade;
- maxSelection, representa a quantidade máxima de variantes a serem selecionadas para resolver um ponto de variação ou variabilidade;
- minSelection, apresenta a quantidade mínima de variantes a serem selecionadas para resolver um ponto de variação ou variabilidade;
- maxSelection, representa a quantidade máxima de variantes a serem selecionadas para resolver um ponto de variação ou variabilidade;
- bindingTime, define o momento no qual uma variabilidade será resolvida. O tempo no qual ocorrerá está representado pela classe de enumeração BindingTime;
- allowsAddingVar, apresenta se há a possibilidade de inclusão de novas variantes após uma variabilidade ser resolvida;
- variants, representa a coleção de instâncias associada à variabilidade; e
- realizes, representa a coleção de variabilidades de modelos de nível inferior, que realiza a variabilidade.
- « variationPoint » representa o conceito de ponto de variação e é uma extensão das metaclasses UML DecisionNode, Actor, UseCase, Interface e Class. Tal estereótipo aplica-se apenas a nós de decisão, atores, casos de uso, interface, classes e pacotes. É composto dos seguintes meta-atributos:
- numberOfVariants, indica o número de variantes associadas que podem ser selecionadas para resolver esse ponto de variação;
- bindingTime, especifica o momento no qual uma variabilidade deve ser resolvida. Esse tempo é representado pela classe de enumeração BindingTime;
- variants, representa a coleção de instâncias associada à variabilidade; e
- variabilities, coleção de variabilidades com as quais essa variante está associada.
- « variant » abrange o conceito de variante e é uma extensão abstrata das meta classes UML Actor, UseCase, Interface, Class, Action, ActivityPartition, Component, Dependency e Comment. Trata-se de um estereótipo abstrato e não pode ser aplicado diretamente a nenhum elemento UML, entretanto, suas especializações não abstratas podem ser aplicadas em atores, casos de uso, interfaces, classes, ações, partição de atividade, componente, dependência, comentário, fragmento combinado, mensagem e pacotes.
Suas especializações, não abstratas são: « mandatory », « optional »,« alternative_OR » e « alternative_XOR ». O estereótipo « variant » é composto dos seguintes meta-atributos:
- rootVP, representa o ponto de variação ao qual está associado; e
- variabilities, coleção de variabilidades com as quais essa variante está associada;
- « mandatory » representa uma variante obrigatória que está presente em todos os produtos de uma LPS.
- « optional » representa uma variante que pode ser escolhida para resolver uma variabilidade ou um ponto de variação.
- « alternative_OR » representa uma variante que faz parte de um grupo de variantes inclusivas e assim, diferentes combinações dessas podem resolver pontos de variação de diferentes maneiras, gerando desse modo, produtos distintos.
- « alternative_XOR » simboliza uma variante que pertence a um grupo de variantes exclusivas, na qual apenas uma variante do grupo pode ser selecionada para resolver um ponto de variação.
- « mutex » simboliza o conceito de exclusão mútua, logo é um relacionamento mutuamente exclusivo entre variantes. Isso significa que para uma variante ser selecionada, a variante relacionada não pode ser selecionada.
- « requires » denota o conceito de restrição "complemento" e é um relacionamento entre variantes, onde a variante escolhida requer outra variante relacionada.
- « variable » é uma extensão da meta classe UML Component. Este estereótipo indica que um componente é formado por um conjunto de classes com variabilidades explícitas. Este estereótipo possui o meta-atributo classSet, que é a coleção de instâncias das classes variáveis que forma o componente.
A grande vantagem de SMarty, mediante a outras abordagens é a extensão dos elementos que fazem parte do metamodelo da UML e, consequentemente, apoiada por ferramentas automatizadas que manipulam arquivos XML Metadata Interchange (XMI) contendo modelos UML.
Além disso, o perfil SMartyProfile se beneficia do conceito de pontos de extensão da UML em casos de uso, e de recursos próprios de cada modelo que suporta, para representar relações entre pontos de variação e suas variantes. Ainda, a cardinalidade de variantes é representada na forma de um meta-atributo. Dessa forma a representação de variabilidades fica totalmente compatível com os metamodelos da UML e permite o apoio de ferramentas UML.
[1] Oliveira Junior, E. A.; Gimenes, I. M. S. & Maldonado, J. C. Systematic Evaluation of Software Product Line Architectures Journal of Universal Computer Science, 2013, 19, 25-52.
[2] Oliveira Junior, E. A.; Gimenes, I. M. S.; Huzita, E. H. M. & Maldonado, J. C. A Variability Management Process for Software Product Lines Proc. Conf. of the Centre for Advanced Studies on Collaborative research, IBM Press, 2005, 225-241.