Orientação à objetos

Todos os conceitos da Programação Orientada à Objetos
Voltar

Conceitos Iniciais

Objetivo OOP: Aproximar o mundo digital com o real.
Criador: Matemático e biólogo Alan Kay.


Vantagens

comern_ada
  1. Confiável: O isolamento entre as partes gera software seguro. Ao alterar uma parte, nenhuma outra é afetada;
  2. Oportuno: Ao dividir tdo em partes, várias dela podem ser desenvolvidas em paralelo;
  3. Manutenível: Atualizar um software é mais fácil. Uma pequena modificação vai beneficiar todas as partes que usarem o objeto;
  4. Extensível: O software não é estático. Ele deve crescer para permanecer útil;
  5. Reutilizável: Utilização de determinados estrutura, como atributos e métodos, através de herança;
  6. Natural: Mais fácil de entender. Você se preocupa mais na funcionalidade do que nos detalhes de implementação.

Objeto

Coisa material ou abstrata que pode ser percebida pelos sentidos e descrita por meio das suas características(estado atual). Possui identidade única.


Classe

Define os atributos e métodos comuns que serão compartilhados por um conjunto de objetos.


Instância

O mesmo que o termo 'criação'. Uma classe instancia(cria) objetos, um objeto é uma instância(criação) de uma classe.


Abstração

Classificar -> Abstrair -> Instanciar

Diferente de métodos/classes abstratas, significa "enxugar" um conteúdo, tirando do mesmo só o essencial. Observar elemento(s), avaliando características e propriedades à parte.


Encapsulamento

Técnica pra proteger código. Criação de get e set pra proteger atributos privates. Ocultar partes independentes da implementação, permitindo construir partes invisíveis ao mundo exterior.

Vantagens:
  1. Tornar mudanças invisíveis;
  2. Facilitar a reutilização do código;
  3. Reduzir efeitos colaterais.

Construtor (construct)

Método, com mesmo nome da classe, com a função criar instâncias de classe.


Polimorfismo

Técnica usada para criar métodos iguais, porém com outra forma de execução. Permite que um mesmo nome representa vários comportamentos diferentes. Só há polimorfismo quando há generalização entre classes.

Tipos:
  • Sobrecarga: Métodos com mesmo nome, lista de parâmetros diferentes (geralmente na mesma classe);
  • Sobrescrita: Métodos com mesmo nome e lista de parâmetros, conteúdo interno diferente na subclasse.
Como o polimorfismo "acontece"

O mecanismo de ligação tardia entende que p1 é instância(criação) de Brasileiro, mesmo sendo "armazenado" dentro de Pessoa.


public class Main {
    public static void main (String[] args) {
        Pessoa p = new Pessoa("Ana");
        Brasileiro b = new Brasileiro("Bob");
        Cachorro c = new Cachorro();
        Pessoa p1 = new Brasileiro("Rick");
        b.setPet(c);
    }
}   
public class Cachorro {
    private String nome;
    public void setNome(String n) {this.nome = n;}
}   
public class Pessoa {
    private String nome;
    public Pessoa(String nome) {this.nome = nome;}
    public void comer() {QUADRADO}
    public boolean comer(float qtde) {return false; BOLA}
}
public class Brasileiro extends Pessoa {
    private Cachorro pet;
    public Brasileiro(String  nome) {super(nome);}
    public void comer() {TRIÂNGULO}
    public void setPet(Cachorro c) {this.pet = c;}
}

p1.comer(); //resultado TRIÂNGULO
p.comer(); //resultado QUADRADO
p1.comer(0.5); //resultado BOLA
b.comer(); //resultado TRIÂNGULO

Sobreposição

Conceito geral, significa pegar algo de mesmo valor e atribuir incremento a ele.


Herança (É um tipo de)

Permite basear uma nova classe na definição de uma outra classe previamente existente. Quando uma classe herda os mesmos atributos e métodos de outra. Necessário incorporar todo o conteúdo na classe filha. Quando há herança para atribuir os valores aos atributos herdados, utilizar através do Construtor o super(atributos).

  • Generalização: Árvore acima, de filha pra mãe;
  • Especialização: Árvore abaixo, de mãe pra filha;
  • Classe Ancestral: Classe mãe;
  • Classe Raíz: Classe mãe de todas (1ª classe);
  • Classe Folha: Última filha (linha final da árvore).
Tipos:
  • Herança de Implementação: Quando a classe filha não possui conteúdo extra, somente o implementado da mãe;
  • Herança para Diferença: Quando a classe filha possui conteúdo extra(próprio), além daquele implementado da mãe;
  • Herança Múltipla: Conceito OO, não encontrado em linguagens, que caracteriza a herança de atributos e métodos, como acréscimo, de 2 ou mais classes mães. Nela não há divisão de atributos, e sim acréscimo.

Atributo de Objeto

É aquele no qual cada objeto encapsula o valor do atributo (quando um atributo é do tipo de outra classe que criamos).
Tipo Objeto: Quando um atributo é do tipo de outra classe criada.

Ex: private Cachorro[] listac; public void addCachorro(){}

Assinatura do método

Constitui o nome e tipo do método. Isso, além do tipo, quantidade e ordem dos parâmetros do mesmo (O nome dos parâmetros não faz parte da assinatura, nem o tipo do retorno do método).


Método com valor de retorno

Precisa de return, devendo ser do mesmo tipo que o valor de retorno do método.

Ex: public int fazerAniver(...) {return ... -> int}

Método Void (Sem valor de retorno)

Não possui return, mas pode ter parâmetros também.

Ex: setNome()

Métodos Especiais

Métodos com operações individuais, diferentes dos demais(comuns). São eles: Get(acessor), Set(modificador), Construct(criador).


Método Final

Deve ser herdado, mas pode não ser sobrescrito(modificado).


Classe Final

Não pode ser herdada por outra classe. Obrigatoriamente folha.


Método Abstrato (Abstract)

Possui, na classe mãe, só a assinatura. Nas filhas(@override) será informado seu conteúdo interno.


Classe Abstrata

Pode ou não ter métodos abstratos, se tiver ela obrigatoriamente terá de ser abstrata(não instancia objetos, só nas filhas).


Static

Pode ser modificado, mas será o valor padrão para todos os objetos de que o possuírem(gravação única na memória). Não possui dependência de terceiros. Se utilizado em atributos, o atributo vira "atributo de classe".


Atributo Derivado

Pode ser calculado através de outros atributos de classe. É implícito na classe (ele não é definido explicitamente), mas há métodos de acessá-lo.


Estado do Objeto

Conjunto de valores dos atributos que o objeto possui. Ex: estado atual de Evento = cancelado.


Visibilidade

Indicam o nível de acesso aos componentes internos de uma classe e/ou dela mesma.

  • - private -> visível somente na classe;
  • ~ package -> nas classes do próprio pacote;
  • # protected -> nas classes do próprio pacote e nas suas filhas;
  • + public -> visível em todo o projeto.

Agregação (Tem um)

Relação de classes, gera código diferenciado (definição do atributo). Um Canil é um agregado de Cachorro(0..*). "a classe B tem um atributo da classe A".
Ex: Classe Mercado addProduto(p1); //p1, instancia da classe Produto, foi criado na classe produto e só adicionado, sendo pronto, na classe Mercado.
Ex: Lutador * - disputa> -<> 0..* Luta.


Associação

Um Canil tem um ou mais Cachorros(1..*), não muda código.


public class Canil {
    private Cachorro[];
    ArrayList<Cachorro> listac;
    public void addCachorro(Cachorro c){}
    public void addCachorro(String nome, Date) {
        Cachorro c = new Cachorro(nome, dtNasc);
        this.listac.add(c); -> Associação: entre as classes gera o listac, pois possibilita instanciar o objeto que representa a parte fora de seu todo
    } -> Composição: Canil depende de Nf, pois para criar uma Nf é necessário ter a classe da mesma
    public NotaFiscal geraNota(Date data, double valor) {
        NotaFiscal f = new NotaFiscal();
        return f;
    }
}

Composição

"Relaciona-se exclusivamente".
Um Canil é composto por 0..* Cachorros, então se não existir Canil, também não existirão Cachorros.
Ex: Classe Mercado mercado tem addProduto("vassoura",25.9); Objeto Produto não é criado na classe Produto, sendo dependente de sua criação na classe Mercado.
Ex: Na Agregação/Associação, os objetos que são adicionados na classe Canil, podem ter sido criados em outra classe. Na Composição, um Canil cria Cachorro.


Relacionamentos Fracos

Relacionamentos fracos, Realização e Dependência, não são armazenados em banco de dados.


Dependência

Relacionamento fraco entre classes, quando um objeto manipula objetos de outra classe em seus métodos, mas não tem qualquer outro relacionamento com a classe dos objetos que manipula.
Ex: AddNf( ) Só posso criar Nf na classe Canil, porque a Canil depende do Nf para instanciar as mesmas, mas não há qualquer outro relacionamento entre a classe Nf e Canil.


Realização

Relacionamento entre Interface e Classe. Classe realiza o comportamento de uma Interface quando ocorre a implementação da mesma na primeira, permitindo assim o relacionamento "é um tipo de".


Interface

Lista de serviços fornecidos por um componente ou classe. É o contato com o mundo exterior (via abstração), que define o que pode ser feito com um objeto dessa classe. Possui, em sua composição, somente métodos public abstract que, por ventura, não possuem chaves de conteúdo interno, pelas quais todas as classes que implementarão (implements) 1 ou mais interfaces, terão de carregar(@override) todos os métodos abstratos informados(implements). Não precisa colocar abstract nos métodos na Interface, porque já entende-se que os mesmos nela são abstratos por padrão. Os métodos abstratos podem ter valor de retorno e parâmetros. Os atributos na interface devem ser static e final.

Elaborado por Mateus Schwede
ubsocial.github.io