O estereótipo de classe está implícito em um diagrama de classe UML? Deve ser especificado?
Comumente vejo diagramas de classe onde não há <<class>>
estereótipo. Outros onde há o comum <<interface>>
e outros com alguns interessantes como <<shape>>
ou <<computer>>
e assim que para um diagrama de classes eu pessoalmente não vejo necessidade, mas Ok.
Estou fazendo um diagrama UML para um projeto de álgebra moderna em C++, mas, como sabemos, a linguagem não deve ser tão influente ao trabalhar com UML. Para este projeto, reconheci os estereótipos <<interface>>
e <<abstract>>
tudo bem até este ponto, mas existem structs e classes, quero fazer as coisas da melhor maneira possível, então vim me perguntar quais são <<class>>
os <<struct>>
estereótipos válidos?
Agradeço suas respostas ou comentários.
Nota: acho que struct
deve ser válido porque especifica o tipo para uma determinada implementação.
Respostas
Você não precisa indicar para indicar classes explicitamente em um diagrama de classes: é assumido por padrão, de acordo com UML:
Uma Classe é mostrada usando o símbolo Classificador. Como Class é o Classificador mais usado, nenhuma palavra-chave é necessária para indicar que a metaclasse é Class.
Você é livre para definir seus próprios estereótipos em UML. Eles são melhor documentados em um diagrama de perfil que mostra como eles se relacionam com os elementos UML padrão.
UML é linguagem de implementação neutra. É muito comum definir tipos de dados específicos da linguagem (por exemplo float
, , double
que não pertencem à UML padrão) e estereótipos (por exemplo class
, e struct
). Veja por exemplo aqui um perfil C# , para uma linguagem em que classes e structs possuem semânticas diferentes.
Esteja ciente de que nem tudo entre « »
, que parece um estereótipo, é um estereótipo. Também pode ser uma palavra-chave bem definida:
- interfaceé uma palavra-chave que se refere a algo com um significado claro no metamodelo UML, que é compartilhado entre diagramas de classes e diagramas de componentes.
- enumerationé uma palavra-chave que se refere a um tipo especial de tipo, que precisa ser descrito de forma diferente de outros tipos e classes de dados básicos.
Além disso, duas observações muito importantes:
- A introdução de estereótipos específicos da linguagem torna seu modelo de design menos geral e corre o risco de obter modelos de implementação detalhados em vez de focar no design abstrato. Portanto, você deve pensar nos prós e contras. Se o seu modelo for neutro em termos de linguagem, você pode se concentrar no OOD e deixá-lo ser reutilizado para uma porta java ou C#, por exemplo. Se sua intenção principal é criar um modelo de implementação, é claro que não há problema.
- Em C++ a
struct
é aclass
com todos os membros públicos por padrão. Este é um princípio fundamental da linguagem. A diferença é apenas sobre o controle de acesso. Como na UML você documenta o controle de acesso no nível do membro, ter um estereótipo« struct »
que exija que todos os membros sejam públicos parece apenas redundante. Aconselho usar classes não estereotipadas em UML e decidir na implementação usar uma estrutura ou uma classe dependendo da visibilidade do membro.