Introdução

Acho que todo mundo já ouviu o ditado "Meça duas vezes, corte uma vez". É um verdadeiro conselho em programação. É sempre melhor pensar sobre a implementação antes de gastar algum tempo realizando-a. Durante a implementação, muitas vezes você precisa criar classes e pensar em como elas irão interagir. Uma representação visual de tudo isso geralmente pode ajudá-lo a encontrar a solução mais correta. É aqui que o diagrama de classes UML vem em nosso auxílio.

O que é UML?

Se você observar as imagens relevantes nos mecanismos de pesquisa, verá que a UML tem algo a ver com diagramas, setas e quadrados. Você precisa saber que UML significa Unified Modeling Language. Unificado é a palavra importante aqui. Isso significa que nossas imagens serão compreendidas não apenas por nós, mas também por qualquer outra pessoa que conheça UML. É a língua franca para desenhar diagramas.

De acordo com a Wikipédia,

"UML é uma linguagem de modelagem de propósito geral e desenvolvimento no campo da engenharia de software que se destina a fornecer uma maneira padrão de visualizar o design de um sistema."
O mais interessante, que nem todos imaginariam, é que a UML tem especificações. E há até uma especificação UML 2. Mais informações sobre a especificação estão disponíveis no site do Object Management Group . Na verdade, esse grupo desenvolve as especificações UML. Também é interessante que a UML não se limita a descrever a estrutura das classes. Existem muitos tipos de diagramas UML. A Wikipedia tem uma breve descrição de vários tipos de diagramas UML: Diagramas UML . Voltando aos diagramas de classe UML, vale mencionar o livro "Head First Design Patterns" , que usa diagramas UML para ilustrar padrões de projeto. O ponto principal é que a UML é realmente usada. E acontece que conhecê-lo e entender como usar são bastante úteis.

Aplicativo

Vamos descobrir se podemos trabalhar com UML em um IDE. Usaremos o IntelliJ IDEA como nosso IDE. Se você estiver usando o IntelliJ IDEA Ultimate, teremos o plug-in "UML Support" instalado "pronto para uso". Ele permite gerar automaticamente belos diagramas de classe. Por exemplo, use Ctrl+N ou o item de menu "Navegar" -> "Classe" para ir para a classe ArrayList. Agora, no menu de contexto do nome da classe, selecione "Diagrama" -> "Mostrar pop-up do diagrama". Como resultado, obtemos um belo diagrama. UML: da teoria à prática - 2 Mas e se você quiser desenhar o diagrama sozinho? E se você não tiver a versão Ultimate? Usando o IntelliJ IDEA Community Edition, não temos outra escolha. Portanto, precisamos entender como um diagrama UML é organizado. Primeiro,. É um conjunto de ferramentas de visualização de gráficos. O plugin que usaremos depende disso. Após a instalação, você precisa adicionar o diretório bin do diretório de instalação do Graphviz à variável de ambiente PATH. Depois disso, no IntelliJ IDEA, selecione Arquivo -> Configurações no menu. Na janela "Configurações", selecione a categoria "Plugins", clique no botão "Procurar repositórios" e instale o plug-in de integração PlantUML . O que há de tão bom no PlantUML? Ele descreve a UML usando uma linguagem de descrição de gráficos chamada "ponto", que a torna mais universal, já que a linguagem de pontos é usada por mais do que apenas PlantUML. Além do mais, tudo o que fazemos abaixo pode ser feito não apenas em um IDE, mas também online em planttext.com. Depois de instalar o plug-in PlantUML, poderemos criar diagramas UML usando "Arquivo" -> "Novo". Vamos criar um diagrama de "classe UML". Isso irá gerar automaticamente um modelo com um exemplo. Excluiremos seu conteúdo e adicionaremos o nosso. Para entender como representar isso em texto, dê uma olhada no manual PlantUML: plantuml class-diagram. UML: da teoria à prática - 3Com base nesses materiais, vamos começar a criar nosso diagrama UML. Adicione o seguinte conteúdo, que descreve duas classes:

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Para ver o resultado no IDEA, selecione "View" -> "Tool Windows" -> "PlantUML". Acabamos de obter dois quadrados que representam classes. Sabemos que ambas as classes implementam a interface List . Essa relação de classe é chamada de realização. Essa relação é representada por uma seta com uma linha pontilhada. Vamos desenhá-lo:

interface List
List <|.. ArrayList
List <|.. LinkedList
List é um dos filhos da classe Collection . Ou seja, herda Collection . Essa relação é chamada de generalização. Parece uma flecha com uma linha contínua comum. Vamos desenhá-lo:

interface Collection
Collection <|-- List
Para o próximo tipo de relacionamento, adicione à descrição da classe ArrayList uma entrada sobre um array privado de elementos do pacote :

~Object[] elementData
Agora queremos mostrar que ArrayList contém alguns objetos. Nesse caso, haverá um relacionamento de agregação. ArrayListé um agregado, pois contém outros objetos. Dizemos agregação porque os objetos da lista podem existir sem a lista: eles não são partes integrantes da lista. O tempo de vida deles não está vinculado ao tempo de vida da lista. A palavra "agregado" vem do latim e se traduz como "montado", ou seja, algo feito de algo. Por exemplo, na vida, temos um conjunto de bomba (agregado), que consiste em uma bomba e um motor. A própria montagem pode ser desmontada e podemos deixar alguns de seus componentes sozinhos. Por exemplo, para vender ou colocar em outra montagem. É da mesma forma em uma lista. Isso é expresso com um losango vazio no agregado e uma linha contínua. Vamos representar isso da seguinte forma:

class Object{
}
ArrayList o- Object
Agora queremos mostrar que, ao contrário de ArrayList , a classe LinkedList contém Node s — contêineres que fazem referência aos dados armazenados. Neste caso, os Node s fazem parte de LinkedList e não possuem uma existência independente. Um Node não é o conteúdo em si. Contém apenas uma referência ao conteúdo. Por exemplo, quando adicionamos uma string a uma LinkedList , estamos adicionando um novo Node que contém uma referência à string, bem como um link para o Node anterior e o seguinte. Essa relação é chamada de composição. É representado desenhando uma linha contínua com um losango preenchido no composto (algo feito de partes constituintes). Agora representaremos o relacionamento como texto:

class Node{
}
LinkedList *-- Node
E agora você precisa aprender a retratar outro tipo importante de relacionamento: a dependência. É usado quando uma classe usa outra, mas a classe não contém nem herda a classe usada. Por exemplo, LinkedList e ArrayList sabem como criar um ListIterator . Representamos isso como setas com uma linha pontilhada:

class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Depois de fazer tudo isso, obtemos: UML: da teoria à prática - 4Você pode adicionar quantos detalhes forem necessários. Claro, não há nada de sobrenatural em desenhar tal diagrama. Ao trabalhar em suas próprias tarefas, você pode desenhá-lo rapidamente à mão. Isso ajudará você a desenvolver a capacidade de pensar na arquitetura de um aplicativo e identificar deficiências na estrutura da classe desde o início, não depois de já ter passado o dia implementando o modelo errado. Esse parece ser um bom motivo para experimentar, não é? :)

Automação

Existem várias maneiras de gerar diagramas PlantUML automaticamente. Por exemplo, IDEA tem o plug-in SketchIT , mas não desenha diagramas totalmente corretamente. Digamos que a implementação das interfaces seja desenhada incorretamente (é exibida como herança). A Internet tem exemplos de como integrar isso no processo de construção do seu projeto. Por exemplo, você pode descobrir como usar uml-java-docklet com Maven. Para demonstrar, usaremos o Maven Archetype para criar rapidamente um projeto Maven. Correr

mvn archetype:generate
Em resposta a Escolha um número ou aplique filtro, deixe o padrão — basta pressionar Enter. Sempre será "maven-archetype-quickstart". Selecione a versão mais recente. A seguir, responderemos algumas perguntas e finalizaremos a criação do projeto: UML: da teoria à prática - 5Maven não é o assunto deste artigo, então você pode encontrar respostas para suas dúvidas sobre Maven no Maven Users Center . No projeto gerado, abra o arquivo de descrição do projeto, pom.xml, para edição. Copiaremos o conteúdo da descrição de instalação do uml-java-docklet para este arquivo. O artefato usado na descrição não pode ser encontrado no repositório Maven Central. Mas o seguinte funcionou para mim: https://mvnrepository.com/artifact/com.chfourie/uml-java-doclet/1.0.0. Em outras palavras, na descrição, basta substituir o groupId de "info.leadinglight" para "com.chfourie" e definir a versão para "1.0.0". Depois disso, podemos executar os seguintes comandos no diretório com o arquivo pom.xml:

mvn clean install
e

mvn javadoc: javadoc
Se abrirmos agora a documentação gerada (explorer target\site\apidocs\index.html), veremos os diagramas UML. A propósito, o relacionamento de implementação agora é exibido corretamente :)

Conclusão

Como você pode ver, a UML permite que você visualize a estrutura do seu aplicativo. Mas a UML pode fazer muito mais. Você pode usar UML para descrever vários processos dentro de sua empresa ou para descrever o processo de negócios que abrange uma função que você está escrevendo. Você precisará decidir por si mesmo o quanto a UML é útil para você pessoalmente, mas não importa o que você decidir, será útil encontrar tempo para aprender mais sobre ela.