Paradigma de Programação Orientado a Objetos

De Aulas

Links relacionados = Linguagens de Programação

Introdução

O paradigma da orientação a objetos não é apenas um paradigma de programação. Ela compõe um conjunto de paradigmas, entre eles:

  • Análise de projeto orientada a objetos;
  • Projeto;
  • Programação;

Seu princípio está na composição e interação entre diversas unidades de software chamadas de objetos.

O paradigma da "Orientação a Objetos" tem bases conceituais e origem no campo de estudo da cognição, que influenciou as áreas da Inteligência Artificial e da Linguistica, no campo da abstração de conceitos do mundo real.

O intuito dessa metodologia é eliminar as diferenças semânticas entre o processo de modelar o mundo real do domínio do problema em um conjunto de componentes de software, facilitar a comunicação entre o profissional modelador e o usuário alvo, na medida em que a correlação da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, símbolos, grafismo e estratégias) fosse a mais óbvia, natural e exata possível.

Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.

Alguns exemplos de linguagens de programação orientada a objetos são: Smalltalk, C++, Java, C#, Object Pascal, etc.

Conceitos da Orientação a Objetos

  • A Classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos através de seus métodos, e quais estados ele é capaz de manter através de seus atributos. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Pode-se, de forma comparativa com a programação estruturada, definir a classe como uma estrutura ou tipo complexo definido pelo usuário e o objeto é uma instância dessa classe, ou seja, a classe está para o objeto tal como um tipo está para uma variável.
  • Os Atributo são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço, telefone, CPF,...; Carro: nome, marca, ano, cor, …; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Tal como as variáveis em um programa estruturado, os atributos são as variáveis de um objeto, definidas na classe.
  • Os Métodos são as operações (ou habilidades) dos objetos. Se Boromir é uma instância da classe Arqueiro, então ele possui a habilidade de atirar uma fecha com seu arco, implementada pelo método atirarUmaFlexa. Quando tal método é invocado por meio de uma mensagem ao objeto "Boromir", então ele é executado. Todos os Arqueiros podem atirar flechas, ms isso só acontece quando o método é chamado para aquele objeto específico.
  • Herança (ou generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero. Há herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação "é um".
  • A Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Em uma Associação Simples (usa um / parte de um), por exemplo, um Arqueiro usa uma Besta. O gatilho é parte da Besta e há um encapsulamento que separa os aspectos internos e externos desse objeto. O mecanismo utilizado pelo Arqueiro quando chamado seu método atirarUmaFlecha apenas envia a mensagem puxarGatilho para a Besta, sem se preocupar com os detalhes internos da Besta de como isso será feito.
  • A Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software.
  • O Polimorfismo consiste em quatro propriedades que a linguagem pode ter:
    • Universal:
      • Inclusão: um ponteiro para classe mãe pode apontar para uma instância de uma classe filha;
      • Paramétrico: se restringe ao uso de templates (C++, por exemplo) e generics (Java/C♯);
    • Ad-Hoc:
      • Sobrecarga: duas funções/métodos com o mesmo nome mas assinaturas diferentes;
      • Coerção: a linguagem que faz as conversões implicitamente (como por exemplo atribuir um int a um float em C++, isto é aceito mesmo sendo tipos diferentes pois a conversão é feita implicitamente);
  • A Interface (na ciência da computação) é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface;
  • Os Pacotes (ou Namespaces) são referências para organização lógica de classes e interfaces.

Exemplo

Classe Pessoa

 1public class Pessoa {
 2	private String nome;
 3	private int idade;
 4
 5	public Pessoa(String nome, int idade) {
 6		this.setNome(nome);
 7		this.setIdade(idade);
 8	}
 9
10	public String getNome() {
11		return nome;
12	}
13
14	public void setNome(String nome) {
15		this.nome = nome;
16	}
17
18	public int getIdade() {
19		return idade;
20	}
21
22	public void setIdade(int idade) {
23		this.idade = idade;
24	}
25
26	public String toString() {
27		return this.getClass().getName() + ": " + nome + ", " + idade + " anos";
28	}
29}

Classe Funcionário

 1public class Funcionario extends Pessoa {
 2	private String funcao;
 3
 4	public Funcionario(String nome, int idade, String funcao) {
 5		super(nome, idade);
 6		this.setFuncao(funcao);
 7	}
 8
 9	public String getFuncao() {
10		return funcao;
11	}
12
13	public void setFuncao(String funcao) {
14		this.funcao = funcao;
15	}
16
17	public String toString() {
18		return super.toString() + ", " + funcao;
19	}
20}

Programa Principal

 1import java.util.ArrayList;
 2import java.util.List;
 3
 4public class Main {
 5	public static void main(String[] arguments) {
 6		List<Pessoa> lista = new ArrayList<Pessoa>();
 7		lista.add(new Pessoa("Rei", 15));
 8		lista.add(new Pessoa("Shinji", 16));
 9		lista.add(new Funcionario("Misato", 28, "Diretora de Operações"));
10
11		for (Pessoa p : lista) {
12			System.out.println(p);
13		}
14	}
15}