
CONCEITOS DE MODELAGEM ORIENTADA A OBJETOS I
Este texto-base aborda os seguintes temas:
Bancos de dados podem ser construídos de diferentes maneiras. Nos Projetos Orientados a Objetos, parte-se de entidades do mundo real, entendendo quais informações podem ser obtidas por meio delas, e então suas características e ações são detalhadas. Essa metodologia permite que se compreenda as funções e as ações que se deseja criar no BD, baseando-se nas necessidades do usuário e na situação em que ele se encontra. A modelagem orientada a objetos envolve diagramas UML, classes e objetos.
O vídeo a seguir aborda os principais conceitos da modelagem orientada a objetos, confira:
Observe as situações das quais se consegue extrair informações. Por exemplo, imagine que você irá criar um banco de dados para uma escola. Se pensar no objeto aluno, perceberá que dele pode-se extrair informações importantes para identificá-lo dentro do sistema, por exemplo: o nome do aluno, o curso que ele frequenta, suas notas etc.
Pense também nas características importantes para o professor dentro de um sistema acadêmico. Por exemplo, o nome do professor, a quantidade de aulas atribuídas a ele, as disciplinas que ministra etc. Então, a partir do momento que conseguimos pensar em um conjunto de dados e definir quais são pertinentes ao sistema, estamos definindo um modelo de dados e, consequentemente, estamos definindo um objeto de dados dentro do sistema.
Portanto, a ideia de trabalhar com objetos é extrair do cenário real as informações que formarão um conjunto de dados para construir um espaço de armazenamento de informações dentro de um Banco de Dados. A partir disso, será construído um sistema que utilizará essa base de dados.
Além das informações sobre as características dos objetos de dados, é preciso coletar dados sobre as ações que esse objeto executará. Por exemplo, no caso do professor, é importante armazenar ações como lecionar, corrigir atividades etc. Essas ações são chamadas de métodos.

Agora, você estudará os principais conceitos da modelagem orientada a objeto: Abstração, Classe, Objeto, Métodos, Herança e Polimorfismo e Classes orientadas a objetos.
A abstração consiste em conseguir identificar um item do mundo real e transformá-lo em uma classe, preocupando-se apenas com suas principais propriedades.
No exemplo do sistema acadêmico, teremos os alunos que precisarão ser cadastrados. Esses alunos possuem características comuns, independente do seu tipo (aluno regular, especial etc). Essas características comuns irão compor as propriedades e ações da classe aluno. Pensando assim, conseguimos abstrair os dados e transformá-los em uma classe dentro do sistema.

Resumidamente, podemos dizer que classe é um conjunto de objetos distintos, porém com as mesmas características e comportamentos. Por convenção, toda classe deve começar com uma letra maiúscula. A classe é uma abstração de entidades existentes no mundo real. Uma classe geralmente representa um substantivo, por exemplo: um aluno, um lugar ou algo que seja “abstrato”.
Algumas analogias ajudam a entender o conceito de classe nos modelos orientados a objetos, como a ideia de forma. Imagine um molde para criação de bolos. O molde seria a classe, contendo as características básicas e os comportamentos. Esse molde permite armazenar as propriedades e métodos dos objetos, que são os bolos. Perceba que cada bolo tem suas próprias cores e detalhes, mas todos de acordo com o indicado pelo molde.

Agora imagine uma planta de um apartamento. A planta seria a classe, contendo todas as especificações que um apartamento (objeto real) terá.

Você percebeu que o objeto é uma instância ou um elemento derivado de uma classe? Podemos dizer que o objeto é a representação do mundo real que será manipulada ou armazenada pelo sistema. Todos os objetos computacionais são caracterizados por atributos (características) e métodos (ações) contidos na classe.

Os atributos definem as propriedades ou características de um objeto, conhecidos também como variáveis ou campos. Nomes de atributos devem ser iniciados com letras minúsculas.
Os métodos são ações ou procedimentos dos objetos para interagirem e se comunicarem com os demais objetos quando solicitados, a fim de executarem uma tarefa qualquer - por exemplo, a inclusão, exclusão ou alteração de dados. A execução dessas ações se dá por meio de mensagens, que tem como função o envio de uma solicitação ao objeto para que seja efetuada a rotina desejada.
Como boa prática, é indicado sempre usar o nome dos métodos declarados como verbos, para facilitar a identificação quando for efetuada alguma manutenção. Além disso, devem ser iniciados por letras minúsculas. São exemplos de nomes de métodos: acaoVoltar, voltar, avançar, correr, resgatarValor, pesquisarNomes, cadastrarSalario, calcularJuros1.
Observe os exemplos a seguir:
Observe que um sinal de menos (-) antecede os atributos das classes Pessoa, Carro e Animal. Isso significa que esses atributos são privados, ou seja, somente serão “visíveis” por cada uma dessas classes. É sempre uma boa prática, mas não é uma regra, criar os atributos como privados e disponibilizar seu acesso através de métodos. O contrário acontece com os métodos: é utilizado um sinal de mais (+), que significa que os métodos são públicos.
Assim, podemos afirmar que todo objeto é algo que existe, uma coisa concreta. Já a classe é considerada como um modelo ou projeto de um objeto.
A herança é um dos principais conceitos da Orientação a Objetos e possibilita que as classes compartilhem seus atributos, métodos e outros membros da classe entre si. É uma noção amplamente utilizada em linguagens orientadas a objetos, sendo a base para conceitos como a sobrescrita de métodos, classes e o polimorfismo, fundamentais para a modelagem de sistemas mais robustos.
Durante a análise dos requisitos de um sistema (solicitações que o sistema deverá atender), podemos destacar os atributos ou os métodos comuns a um grupo de classes e concentrá-los em uma única classe – um processo conhecido como generalização. Da mesma forma, é possível identificar o que é pertinente somente a determinada classe - conhecido como especificação. A primeira vantagem dessa organização é evitar a duplicidade de códigos (ter o mesmo trecho de código em lugares diferentes do sistema), o que traz maior agilidade e confiabilidade na manutenção e expansão do sistema2.
Imagine que você identificou a necessidade da criação das classes Professor e Aluno, detalhadas a seguir, para armazenar e manipular seus dados em um sistema acadêmico.3

Você percebeu que as classes possuem atributos comuns (nome e idade)? Notou que o mesmo ocorre com os métodos (definirNome, retornarNome, definirIdade, retornarIdade)?
No entanto, alguns métodos e atributos são específicos de cada classe. Apenas a classe Professor tem o atributo formação e apenas a classe Aluno tem o atributo curso. Da mesma forma, os métodos definirFormação e retornarFormação pertencem apenas à classe Professor e os métodos definirCurso e retornarCurso pertencem apenas à classe Aluno.
Sendo assim, podemos destacar os atributos ou os métodos comuns a esse grupo de classes e concentrá- los em uma única classe (generalização). No exemplo a seguir, seria a classe Pessoa agora considerada superclasse. Da mesma forma, é possível identificar o que é pertinente somente à determinada classe (especificação) e mantê-lo em Professor e Aluno, que agora seriam consideradas subclasses de Pessoa. Veja:

Agora que você já conhece os conceitos básicos de projeto orientado a objetos, tente desenvolver a questão a seguir:

Suponha que você esteja criando um banco de dados para uma pequena indústria, utilizando o projeto orientado a objetos. Para esse BD, crie uma classe Pessoa, contendo os atributos: nome, endereço e telefone. Considere a classe Fornecedor como subclasse da classe Pessoa. Considere também que, a cada instância da classe Fornecedor, há, para além dos atributos que caracterizam a classe Pessoa, os atributos valorCredito (correspondente ao crédito máximo atribuído ao fornecedor) e valorDivida (montante da dívida com o fornecedor).
Portanto, além dos métodos usuais, herdados da classe Pessoa, a classe Fornecedor deve representar o método obterSaldo(), que devolve a diferença entre os valores dos atributos, valorCredito e valorDivida.
Represente essas classes com seus atributos e métodos.
Busque resolver essa questão antes de visualizar a solução.
Primeiro você deve criar a superclasse Pessoa, com todos os seus atributos e métodos:
Pessoa |
---|
nome: String endereco: String telefone: String |
definirNome(): void retornarNome(): void definirEndereco(): void retornarEndereco(): void definirTelefone(): void |
Em seguida, crie a subclasse Fornecedor apenas com os atributos e métodos específicos dele, porque essa classe herdará da classe Pessoa todos os atributos e métodos comuns a ela.
Fornecedor |
---|
valorCredito: float valorDivida: float |
obterSaldo(): Double |
Não se esqueça de representar a herança entre as classes com uma seta apontando para a superclasse. Fica desta forma:
Pessoa |
---|
nome: String endereco: String telefone: String |
definirNome(): void retornarNome(): void definirEndereco(): void retornarEndereco(): void definirTelefone(): void |
Fornecedor |
---|
valorCredito: float valorDivida: float |
obterSaldo(): Double |
Polimorfismo é uma palavra grega (polýs = muitos e morphe = forma) que significa múltiplas formas. Na modelagem orientada a objetos, o polimorfismo tem como princípio a criação de uma hierarquia de objetos com métodos e nomes comuns para operações conceitualmente similares, porém implementados de forma diferente para cada classe da hierarquia. Como resultado, a mesma mensagem, recebida por objetos diferentes, pode causar ações complementares diferentes.
Vamos aos exemplos para entender melhor esse conceito!
Primeiro, vamos começar com um bastante simples e figurativo: imagine este exemplo de herança de classe de animais

Perceba que, nesse exemplo, as classes Cachorro e a Ave herdam da superclasse Animal os métodos comer e fazerBarulho. Como exemplo, vamos analisar o método fazerBarulho.
Sabemos que cada animal faz barulho de forma diferente, não é mesmo? Portanto, cada subclasse animal (Cachorro, Ave) terá uma codificação diferente para esse método. Na classe Cachorro, o retorno será “Au, au” e, na classe Galinha, o retorno do barulho será “Có, có”, conforme a codificação a seguir.

Esse é um exemplo simplificado, não se preocupe se o código não representa um programa real. A ideia é que você compreenda que um mesmo método pode ter retornos diferentes a depender da classe. Então, quando o método fazerBarulho for chamado pela classe Cachorro, ele terá um retorno com valores exclusivos para essa classe; da mesma forma quando for chamado pelas demais classes.
Portanto, os métodos polimórficos têm comportamentos diferentes para cada classe, apesar de serem representados com o mesmo nome para todas as classes.
Agora, que tal ver um exemplo mais próximo do real, utilizando uma linguagem orientada a objetos? A situação a seguir utiliza a linguagem Java, que você já conhece.
Imagine um banco de dados de uma empresa que atua com vendas de souvenirs. O modelo indicado abaixo detalha algumas classes do banco. Podemos dizer que uma classe chamada Vendedor e outra chamada Diretor podem ter como base uma classe chamada Pessoa, com um método chamado calcularVendas. Se esse método (definido na classe base Pessoa) se comportar de maneira diferente para as chamadas feitas a partir de uma instância de Vendedor e para as chamadas feitas a partir de uma instância de Diretor, ele será considerado um método polimórfico, ou seja, um método que assume várias formas.
No exemplo, o cálculo das vendas de uma empresa é feito de modo diferente dependendo do funcionário: se for realizada por um vendedor da equipe, são considerados apenas o preço dos itens vendidos e sua quantidade. Agora, quando a venda é realizada diretamente pelo diretor, a conta é diferente: inclui-se uma taxa adicional, porque o diretor só atua em casos especiais, com pedidos muito customizados. Observe:

Agora, observe as operações envolvidas no método calcularVendas nas três diferentes classes. Primeiro, veja a classe Pessoa:
public decimal calcularVendas()
{
decimal valorUnitario = decimal.MinValue;
decimal produtosVendidos = decimal.MinValue;
return valorUnitario * produtosVendidos;
}
Na classe Vendedor temos o mesmo método, mas com a codificação diferente
public decimal calcularVendas()
{
decimal valorUnitario = 50;
decimal produtosVendidos = 1500;
return valorUnitario * produtosVendidos;
}
Na classe Vendedor temos o mesmo método, mas com a codificação diferente
public decimal calcularVendas()
{
decimal valorUnitario = 50;
decimal produtosVendidos = 1500;
return valorUnitario * produtosVendidos;
}
Você percebeu que temos o mesmo método, mas com diferentes implementações? Portanto, o método calcularVendas é um método polimórfico.
Polimorfismo = Comportamento Diferente
Por fim, vamos retomar o exemplo ilustrativo da classe Animal. Você notou que não existirá nenhum animal específico que representará essa classe? Portanto, a classe Animal, nesse exemplo, é uma classe abstrata, ou seja é apenas uma figura representativa que nunca será implementada para um determinado animal (objeto) específico.
A classe Animal, que é abstrata, também terá seus métodos abstratos, portanto serão subscritos pelas subclasses. Foi o que aconteceu com o método fazerBarulho: quando subscrito pela classe Cachorro, retornou o valor “Au, au” e, quando foi subscrito pela classe Galinha, retornou o valor “Có, có”.
Veja, no exemplo a seguir, o método abstrato fazerBarulho, da classe Animal:

Portanto, as classes abstratas servem como “modelo” para outras classes que dela herdam, não podendo ser instanciada por si só.
Na videoaula a seguir, o professor... retoma e sintetiza os principais conceitos estudados neste material.
- Adaptado de https://www.devmedia.com.br/introducao-a-programacao-orientada-a-objetos-em-java/26452.
- Adaptado de Manual de Informática Centro Paula Souza, v. 4. Fundação Padre Anchieta, 2010.
- Adaptado de http://www2.ic.uff.br/~anselmo/cursos/TPA/apresentacoes/Heranca.pdf