Paradigma de Programação Orientado a Objetos
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);
- Universal:
- 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}