Diagrama de Classe
Conceitos de Programação Orientada a Objetos (POO)
1. Classe
- Definição: Uma classe é uma estrutura que define os atributos (características) e métodos (comportamentos) que os objetos criados a partir dela terão. Pode ser entendida como um “molde” para criar objetos.
- Exemplo: Se você tem uma classe chamada
Carro
, ela pode ter atributos comocor
,marca
, emodelo
, e métodos comoacelerar()
efrear()
.
2. Objetos
- Definição: Um objeto é uma instância de uma classe. Ele é criado a partir de uma classe e contém dados reais que seguem a estrutura definida pela classe.
- Exemplo: Baseado na classe
Carro
, um objeto específico poderia ser um carro vermelho, da marca Ferrari, modelo 488 GTB.
3. Atributos
- Definição: Atributos são as propriedades ou características de uma classe, definindo os dados que os objetos da classe podem armazenar.
- Exemplo: Atributos da classe
Carro
podem incluircor
,marca
,modelo
, evelocidade
.
4. Métodos
- Definição: Métodos são funções ou procedimentos associados a uma classe que definem o comportamento dos objetos criados a partir dela.
- Exemplo: O método
acelerar()
na classeCarro
pode aumentar o valor de um atributovelocidade
do carro.
5. Herança
- Definição: Herança é um mecanismo da POO que permite que uma classe herde atributos e métodos de outra classe. A classe que herda é chamada de subclasse ou classe derivada, e a classe da qual se herda é chamada de superclasse ou classe base.
- Exemplo: Se você tem uma classe
Veiculo
com atributos comomarca
,modelo
,ano
,velocidadeMaxima
e métodos comoligar()
edesligar()
a classeCarro
,Moto
,Caminhão
pode herdar deVeiculo
e obter esses atributos e métodos, além de adicionar os seus próprios. Na classe Carro podemos acrescentar um atributonumeroDePortas
e um atributoadicionarLimpador()
.
6. Encapsulamento
- Definição: Encapsulamento é o conceito que consistem em esconconder os estados internos de implementação de uma classe e expor apenas o necessário para o mundo exterior. Isso é geralmente feito através do uso de métodos acessores (getters) e modificadores (setters). Isso é feito para proteger a integridade dos dados do objeto, prevenindo que sejam colocados em estados inconsistentes ou inesperados. Encapsulamento permite que a classe controle a maneira como os dados são acessados e modificados, oferecendo uma interface pública clara.
- Exemplo: Seja uma classe denominada
ContaBancaria
cujo atributos são marcados como ‘private’ que sãoTitular
eSaldo
. Isso ignifica que eles não podem ser acessados diretamente de fora da classe. Em vez disso, métodos públicos comodepositar()
,sacar()
econsultarSaldo()
são fornecidos para permitir que operações sejam realizadas sobre esses atributos de maneira controlada.
7. Polimorfismo
- Definição: Polimorfismo é a capacidade de um método ter várias formas. Isso pode ser realizado através da sobrecarga de métodos (mesmo nome, diferentes parâmetros) ou sobrescrita de métodos (mesmo nome, mesma assinatura, comportamento diferente na subclasse).
- Exemplo: As Subclasses
Circulo
,Retângulo
eTriângulo
pode ter um métododesenhar()
que é uma versão sobrescrita do métododesenhar()
herdado da classeForma
, implementando um comportamento específico para polígonos.
8. Abstração
- Definição: Abstração é o conceito de ocultar a complexidade e mostrar apenas o essencial para o usuário. Em POO, isso geralmente é implementado através de classes abstratas e interfaces.
- Exemplo: Seja uma classe abstrata
MetodoPagamento
pode definir um método abstratoprocessarPagamento()
, que deve ser implementado de forma específica pelas subclasses concretasCartaoCredito
,CartaoDebito
ePayPal
para diferentes métodos de pagamento. Isso permite que o sistema de pagamentos trate todos os métodos de pagamento de maneira uniforme, chamandoprocessarPagamento()
sem se preocupar com os detalhes específicos de cada método.
Diagrama de Classe
Os diagramas de classe são uma parte fundamental da Linguagem de Modelagem Unificada (UML), oferecendo uma maneira visual de representar a estrutura e o design de um sistema. Entender a sintaxe e os elementos do diagrama de classe é fundamental para criar representações precisas e úteis do design do sistema. Vamos explorar os principais elementos e como eles são representados em um diagrama de classe UML.
Classes
Representação: Uma classe é representada por um retângulo dividido em três partes: o nome da classe na parte superior, os atributos no meio e os métodos na parte inferior.
Sintaxe:
- Nome da Classe: Simplesmente o nome da classe.
- Atributos:
<visibilidade> nomeDoAtributo : Tipo = valorDefault
. - Métodos:
<visibilidade> nomeDoMétodo(parametros) : TipoDeRetorno
.
Exemplo:
Classe: Livro
Atributos:
- titulo: String
- isbn: String
- anoPublicacao: int
- autores: Lista
Métodos:
- adicionarAutor(Autor): void
- removerAutor(Autor): boolean
Visibilidade
- Símbolos:
+
para público,-
para privado,#
para protegido,~
para pacote ou default.
Interfaces
Uma interface é um elemento de modelagem que define um contrato dentro do sistema que está sendo projetado. Esse contrato é um conjunto de métodos públicos sem implementação. As classes ou componentes que adotam essa interface concordam em implementar todos os métodos declarados pela interface, seguindo assim o contrato estabelecido. Isso permite que diferentes classes compartilhem a mesma interface mas tenham implementações distintas para os métodos especificados por essa interface.
- Representação: As interfaces são representadas de forma semelhante às classes, mas o nome da interface é precedido pela palavra-chave «interface».
- Não possui implementação, apenas assinatura
- Sintaxe: A interface contém assinaturas de métodos que as classes implementadoras devem fornecer.
Este diagrama demonstra a relação entre interfaces e classes concretas, mostrando como diferentes tipos de veículos podem implementar as mesmas interfaces para garantir que todos tenham funcionalidades básicas de veículos e sejam capazes de passar por manutenção. Isso exemplifica o poder das interfaces em promover a reutilização de código e a flexibilidade no design de software, permitindo que novos tipos de veículos sejam facilmente adicionados ao sistema sem alterar a lógica que depende das abstrações fornecidas pelas interfaces.
Heranças
Ela permite que uma classe (chamada subclasse, classe filha ou classe derivada) herde atributos e métodos de outra classe (chamada superclasse, classe pai ou classe base), promovendo reutilização de código, organização hierárquica e polimorfismo.
- Representação: A herança é representada por uma linha sólida com uma ponta de seta vazia apontando para a superclasse.
- Sintaxe: Não há uma sintaxe textual específica para herança no diagrama, mas a relação é claramente visualizada pela direção da seta.
Exemplo de Herança e Interface:
Associações
A associação representando um relacionamento entre duas ou mais classes. Este relacionamento indica que as instâncias de uma classe estão ligadas de alguma forma às instâncias de outra classe. A associação é usada para modelar uma ampla gama de relações entre objetos, refletindo como eles interagem dentro do sistema.
Representação no Diagrama de Classe
Linhas de Associação: No diagrama de classe UML, uma associação é representada por uma linha que conecta as classes envolvidas. Essa linha pode ter setas indicando a direcionalidade da associação (unidirecional) ou não ter setas (bidirecional).
Multiplicidade: A multiplicidade é indicada em cada extremidade da linha de associação, próxima às classes, para mostrar quantas instâncias de uma classe estão associadas a quantas instâncias da outra classe.
- Tipos:
- 0..1 – Zero ou uma instância.
- n..m – indica n para m instâncias
- 0..* ou * – Não existe limite para o número de instâncias
- 1 Extamanete 1 instância
- 1..* Ao menos uma instância
- Tipos:
Nomes de Papéis e Direções: Quando aplicável, os nomes dos papéis são colocados junto às extremidades da associação, próximos às classes correspondentes, para indicar o papel de cada classe no relacionamento.
Agregação
Este é um relacionamento entre duas classes onde uma classe é parte de outra classe. É um relacionamento mais específico do que a associação e indica que uma classe é um contêiner ou uma coleção de outras classes.
Vamos considerar um exemplo prático de agregação que modela o relacionamento entre uma Biblioteca e Livros. Neste cenário, uma biblioteca contém vários livros, mas esses livros não dependem exclusivamente da biblioteca para existir; eles podem ser emprestados, estar em outras bibliotecas ou pertencer a coleções particulares. Isso exemplifica bem a natureza da agregação, onde as partes (livros) podem existir independentemente do todo (biblioteca).
Uma Biblioteca pode conter 0..* (zero a muitos) Livros, e um Livro pode pertencer a 0..1 (zero ou uma) Biblioteca, refletindo que um livro pode não estar em uma biblioteca ou estar apenas em uma de cada vez
- Uma universidade contém vários departamentos, mas a existência de um departamento não depende exclusivamente da existência da universidade. Um departamento pode, teoricamente, existir fora da universidade ou ser transferido para outra universidade.
- Os departamentos podem existir sem uma universidade específica e podem abrigar vários professores. A existência de um professor não depende exclusivamente de sua associação a um departamento específico; eles podem mudar de departamento ou pertencer a mais de um departamento.
- Professores podem existir independentemente dos departamentos, significando que sua existência não está atrelada a um único departamento. Eles podem, por exemplo, dar aulas em diferentes departamentos ou até mesmo em diferentes universidades.
A multiplicidade pode ser representada como 1
do lado da universidade (assumindo que estamos modelando dentro do contexto de uma única universidade) e 0..*
do lado do departamento, indicando que uma universidade pode ter vários departamentos.
A multiplicidade pode ser 1..*
do lado do professor, refletindo que um departamento pode ter vários professores, e 0..*
do lado do departamento, indicando que um professor pode estar associado a nenhum (caso de professores visitantes, por exemplo) ou vários departamentos.
Composição
Esta é uma forma mais forte de agregação, onde uma classe é composta por uma ou mais outras classes, este relacionamento indica uma dependência de ciclo de vida forte entre as classes, de modo que quando um contêiner é destruído, seu conteúdo também o é.
Vamos considerar um exemplo de composição no contexto de um sistema de gerenciamento de um curso universitário. Neste cenário, um Curso contém várias Disciplinas, e cada Disciplina pode ter várias Avaliações. A existência das Disciplinas e das Avaliações depende diretamente da existência do Curso; elas não podem existir sem ele. Se o Curso for encerrado ou deletado, todas as suas Disciplinas e as respectivas Avaliações também devem ser encerradas ou deletadas. Isso reflete a natureza da composição, onde a vida útil dos componentes está intrinsecamente ligada ao objeto “todo”.
Exemplo: Ecommerce de Livro
Principais Classes:
1. Livro
Atributos:
- titulo (String, privado): O título do livro.
- autor (String, privado): O nome do autor do livro.
- preco (Double, privado): O preço do livro.
- isbn (String, privado): O código ISBN do livro.
Métodos:
- getDetalhes() (public): Retorna os detalhes do livro.
- atualizarPreco(Double novoPreco) (public): Atualiza o preço do livro.
2. Carrinho
Atributos:
- itens (List, privado): Lista de livros no carrinho.
Métodos:
- adicionarLivro(Livro livro) (public): Adiciona um livro ao carrinho.
- removerLivro(Livro livro) (public): Remove um livro do carrinho.
- calcularTotal() (public): Calcula o total do carrinho.
3. Usuario
Atributos:
- nome (String, privado): Nome do usuário.
- email (String, privado): Email do usuário.
- carrinho (Carrinho, privado): O carrinho de compras do usuário.
Métodos:
- adicionarAoCarrinho(Livro livro) (public): Adiciona um livro ao carrinho do usuário.
- removerDoCarrinho(Livro livro) (public): Remove um livro do carrinho do usuário.
4. Pedido
Atributos:
- usuario (Usuario, privado): O usuário que fez o pedido.
- itensPedido (List, privado): Itens que foram pedidos.
- total (Double, privado): Total do pedido.
Métodos:
- gerarPedido() (public): Gera um novo pedido a partir do carrinho do usuário.
Relacionamentos e Multiplicidades:
Usuário e Carrinho: Associação. Este é um relacionamento de associação 1:1 entre a classe Usuario
e a classe Carrinho
. Significa que cada usuário no sistema possui um único carrinho de compras associado a ele. Esse carrinho é usado para armazenar temporariamente os livros que o usuário está interessado em comprar. O relacionamento é diretamente gerenciado pelo usuário, que pode adicionar ou remover livros do carrinho.
Carrinho e Livro: Agregação. Descrição: Este é um relacionamento de agregação 1:N entre a classe Carrinho e a classe Livro. A agregação é utilizada aqui para indicar que um carrinho pode conter vários livros, mas esses livros não dependem exclusivamente do carrinho para existir. Em outras palavras, os mesmos livros podem estar presentes em diferentes carrinhos de outros usuários ao mesmo tempo.
Usuário e Pedido: Associação. Este é um relacionamento de associação 1:N entre a classe Usuario
e a classe Pedido
. Isso indica que um usuário pode fazer vários pedidos ao longo do tempo. Cada pedido é uma instância independente que está diretamente associada a um usuário específico, refletindo o histórico de compras desse usuário.
Pedido e Livro: Composição. Este é um relacionamento de composição 1:N entre a classe Pedido
e a classe Livro
. A composição é escolhida aqui para indicar que cada pedido contém uma ou mais instâncias de livros, e esses livros são parte integrante do pedido. Se um pedido é cancelado ou deletado, a associação específica desses livros com esse pedido também é removida.
Exercício: Sistema de Locação de Automóvel
A empresa tem uma grande frota de carros de passeio, sendo que esses carros apresentam diferentes marcas e modelos. Eventualmente um carro pode ser retirado da frota devido a algum acidente grave ou simplesmente por ter sido considerado velho demais para o padrão da empresa e tenha sido vendido. Da mesma forma, a empresa eventualmente renova a frota, sendo necessário, portanto, estar sempre mantendo o cadastro de veículos da empresa.
Os clientes dirigem-se à empresa e solicitam o aluguel de carros. No entanto, primeiramente é necessário cadastrá-los, caso ainda não possuam cadastro ou seus dados tenham sido alterados.
Depois de ter se identificado/cadastrado, o cliente escolherá o carro que deseja alugar (o valor da locação varia de acordo com o ano, marca e modelo do automóvel). Durante o processo de locação, o cliente deve informar pro quanto tempo utilizará o carro, para qual finalidade e por onde desejará trafegar, já essas informações também influenciam o preço da locação. Antes de liberar o veículo, a empresa exige que o cliente forneça um valor superior ao estabelecido na análise da locação, a título de caução. Caso o cliente não utilize todo o valor da caução até o momento da devolução do veículo, o valor restante lhe será devolvido.
Quando o cliente devolve o carro deve-se definir o automóvel como devolvido, registrar a data e hora da devolução e a quilometragem em que se encontra, bem como verificar se o automóvel se encontra nas mesmas condições em que foi alugado. Caso o cliente tenha ocupado o carro por mais tempo que o combinado, deve pagar o aluguel referente ao tempo extra em que permaneceu com o veículo. Da mesma maneira, o cliente deverá pagar por qualquer dano sofrido pelo veículo quando este encontrava-se locado. Por outro lado, o cliente pode ser ressarcido de parte do valor que pagou caso o custo do tempo em que esteve de posse do veículo seja inferior ao valor previamente fornecido.
Resumo:
- A empresa tem muitos automóveis. Cada automóvel tem atributos como número da placa, cor, ano, tipo de combustível, número de portas, quilometragem, renavam, chassi, valor de locação, etc.
- Cada carro tem um modelo e marca, mas um modelo pode relacionar-se a muitos carros e uma marca pode referir-se a muitos modelos, embora cada modelo só tenha uma marca específica.
- Um carro pode ser alugado por muitos clientes, em momentos diferentes, e um cliente pode alugar muitos carros. É preciso saber quais carros estão locados ou não. Sempre que um carro for locado é preciso armazenar a data e a hora de sua locação e, quando for devolvido, a data e hora de devolução.