Abstração
Cada sistema pode ser desenvolvido para um conjunto específico de objetivos, sendo usado também em contextos específicos. Isso significa que, nem sempre, a forma de armazenar e processar dados sobre um item do mundo real será sempre igual em todos os sistemas de informação. Descobrir quais dados devem ser armazenados, bem como as operações aplicáveis a eles, é o papel da abstração no paradigma Orientado a Objetos.
Mesmo antes de estudar orientação a objetos, muitos estudantes já têm certo contato com o conceito de abstração, ainda que de forma intuitiva. Ao criar uma struct em C para representar um aluno, por exemplo, você precisa decidir quais atributos (nome, matrícula, e-mail) são importantes e quais não precisam ser incluídos naquele contexto. Esse processo de seleção já é uma forma de abstração: você está modelando um conceito real (um aluno) com base apenas nas características relevantes para a aplicação.
Entendendo os conceitos fundamentais
O paradigma Orientado a Objetos, naturalmente, introduz alguns conceitos importantes para o projeto de sistemas computacionais. Este paradigma é baseado em quatro pilares fundamentais: abstração, encapsulamento, herança e polimorfismo. Começaremos pela abstração, que ocupa um papel central no desenvolvimento de um software orientado a objetos. Para entendermos esse processo, precisamos primeiro conhecer dois conceitos importantes para o paradigma: os objetos e as classes.
Objeto
Antes de nos aprofundarmos nas propriedades fundamentais do objeto, precisamos alinhar alguns pontos importantes sobre a definição: ele pode ser qualquer coisa. Sim, qualquer coisa, desde uma pessoa até a representação de um elemento intangível, como uma tarefa.
Note que os numerais foram grifados: em programação orientada a objetos, um objeto representa uma única ocorrência de uma entidade importante para o mundo real. Se estivermos lidando com cidades, por exemplo, a cidade de São Paulo será considerada como um objeto. Da mesma forma, se estivermos pensando em cursos de graduação, o curso de Engenharia de Computação também será tratado como um objeto.
Ter em mente que um objetivo representa uma única ocorrência de determinada entidade é fundamental para a compreensão da orientação a objetos. Cientes disso, podemos nos atentar às propriedades fundamentais de um objeto:
- Estado: um objeto possui dados próprios. Chamamos de estado o conjunto de valores atribuídos às variáveis (agora chamada de propriedades) de um objeto.
- Comportamento: o comportamento está relacionado às operações realizadas com os objetos.
- Identidade: a mudança de estado de um objeto é única.
Vejamos agora alguns exemplos, em alto nivel, sobre objetos:
| Objeto: | João |
|---|---|
| Nome: | João da Silva |
| Idade: | 27 anos |
| Cidade de nascimento: | Maringá |
| Comportamentos: | Correr, falar, comer, dormir |
| Objeto: | Fusca Preto |
|---|---|
| Modelo: | Fusca |
| Fabricante: | Volkswagen |
| Placa: | BLB-1234 |
| Comportamentos: | Andar, frear, buzinar |
Classe
Enquanto os objetos tratam de ocorrências individuais de alguma entidade, as classes são estruturas que permitem representarmos um conjunto de objetos que tenham propriedades e comportamentos comuns.
Até aqui, não há grandes distinções ao uso de uma struct em C. No entanto, um dos recursos que distingue as classes das structs, já nos usos iniciais, está na possibilidade de se definir funções ou comportamentos, aqui chamadas de métodos.
Fazendo uma referência à linguagem C, é como se incluíssemos dentro das structs as funções que manipulam aquela struct.
O processo de abstração está justamente aqui: ele supre a necessidade de se olhar para uma determinada situação, encontrar os objetos relevantes e, então, definir as classes capazes de representar esses objetos.
Entrada e saída
Podemos discutir o processo de abstração da seguinte forma:
- Entrada: especificação de requisitos do sistema;
- Saída: definição de classes, interfaces e módulos (pacotes) do sistema;
🤯 A dificuldade da abstração
Assim como os demais conceitos de Orientação a Objetos, a abstração pode ser explicada com algumas linhas. Na minha experiência como professor, tenho observado que as dificuldades estão mais relacionadas à correta aplicação dos conceitos. Dentre os principais problemas encontrados, destaco:
- Identificação equivocada de classes. Muitos estudantes enfrentam dificuldades em encontrar, em um dado contexto, quais entidades devem ser mapeadas para classes. Essa dificuldade inicial é comum, mas pode ser superada com a prática e a persistência na resolução de exercícios.
- Comportamentos além do necessário. Embora implementar comportamentos (métodos) seja um aspecto possível em uma classe, este uso deve ser feito com moderação. É preciso identificar quais são efetivamente os métodos aplicáveis a uma classe. Imagine o sistema de um banco: a classe
Emprestimopode ter um método que retorna a quantidade de parcelas pendentes, mas não deve ser responsável por fazer a análise de crédito do cliente. Isso deve ser tratado em uma classe específica. - Dificuldade de entender o relacionamento entre as classes. As classes se relacionam entre si. Uma classe pode conter objetos de outra classe e vice-versa. Isso é necessário para representar, por exemplo, que uma ocorrência de
Pessoapode possuir uma ou mais instâncias deLivro.
Representando as classes em UML
A UML (Unified Modeling Language) é uma linguagem visual padrão usada para modelar sistemas de software. Ela permite representar graficamente os elementos que compõem um sistema — como classes, objetos, casos de uso, componentes, entre outros — facilitando a comunicação entre desenvolvedores, analistas e outros envolvidos no projeto.
Dentre os diversos tipos de diagramas que a UML oferece, um dos mais importantes é o diagrama de classes.
O que é um Diagrama de Classes?
O diagrama de classes mostra as estruturas fundamentais do sistema orientado a objetos. Nele, representamos:
As classes do sistema;
Os atributos (características) de cada classe;
Os métodos (comportamentos) de cada classe;
E, futuramente, as relações entre as classes;
Estrutura de uma classe em UML
Cada classe no diagrama é representada como um retângulo dividido em três partes:
1 Nome da classe
2 Lista de atributos
3 Lista de métodos
--
Exemplo 1: Classe Aluno
!Representação visual de uma classe no Diagrama de Classe da UML.(/poo/diagrama.png "Fonte: Renan Vinicius Aranha")
Neste exemplo, temos uma classe Aluno com três atributos privados (nome, matricula e media) e dois métodos públicos: calcularMedia() e exibirDados().
O diagrama de classes é uma ferramenta poderosa para representar a estrutura estática de um sistema. Mesmo com diagramas simples, já conseguimos visualizar as responsabilidades e comportamentos de cada classe.
Nos próximos tópicos, vamos aprender a conectar essas classes entre si, usando relacionamentos como associação, herança e composição.