Ir para o conteúdo

Composição

Composição pode não ser considerado por alguns autores como sendo uma das bases de POO, no entanto é importante que seja mencionada.

Composição não é mais que a criação de classes usando como base outras classes. Criamos assim uma relação entre objectos em que um determinado objecto contém no seu interior outros objectos que criamos.

De uma forma genérica poderemos pensar que estamos sempre a trabalhar com composição, afinal, todas as classes que criamos contém no seu interior alguma outra classe, mas o termo aplica-se mais quando estamos a falar de classes criadas por nós no domínio do problema que estamos a tentar resolver e não às classes que constituem a base da plataforma Java.

Composição aparece frequentemente associada a herança, surgindo em discussões de Herança Vs. Composição. A questão é que o mecanismo de herança, apesar de extremamente útil e poderoso, acarreta pequenos problemas, nomeadamente questões de performance, que embora não seja a única, é de longe a mais invocada nas comparações. Mas porquê a discussão se os dois mecanismos podem, aparentemente, coexistir sem problemas?

E na verdade não só podem como o fazem. Ao modelarmos um problema fazê-mo-lo quase sempre recorrendo a uma mistura entre composição e herança, criamos classes com tarefas especificas e conjugamos as mesmas de forma a construirmos classes de nível mais elevado e que fazem uso das classes de nível mais baixo.

A discussão surge, em casos mais extremos, por se considerar a herança um mecanismo prejudicial. Em casos mais ponderados, aqueles que todos devemos seguir, o uso de herança e composição deve ser visto à luz do problema que estamos a tentar resolver e escolher um ou outro em conformidade.

A composição oferece-nos uma forma de programarmos em POO evitando o uso de herança e, no caso do Java, evitando o problema de não existir herança múltipla.

Lembrando o exemplo das nossas bicicletas, em que criamos duas classes para representar dois tipos de bicicleta, e olhando para uma bicicleta real, podemos ver que facilmente se encontravam mais objectos: uma roda, travões, pedaleira, etc. Todos estes objectos fazem parte de uma bicicleta, portanto, podemos adicionar à nossa classe Bicicleta as classes Roda, Travao e Pedaleira. Com esta adição usámos o processo de composição: construímos uma classe a partir de outras classes, sem o uso de herança.

Em código o processo seria algo como1:

//Definir as partes que constituem a nossa bicicleta
public class Roda {

    public int raio;
    public float pressao;
}

public class Travao {

    public String tipo;

    public void travar() {
    }
}

public class Pedaleira {

    public int nrVelocidades;
    public int tamanhoCorrente;

    public void pedalar() {
    }
}

//Criar a nossa bicicleta usado as partes definidas acima
public class Bicicleta {

    public String cor;

    //Substituindo o tamanhoRoda por duas rodas
    public Roda rodaFrente;
    public Roda rodaTras;

    //Substituindo o tipoTravao por dois travões
    public Travao travaoFrente;
    public Travao travaoTras;

    //Se temos travões, o método travar da bicicleta pede aos travões para actuarem
    public void travar() {
        travaoFrente.travar();
        travaoTras.travar();
    }

    //Se temos pedaleira, então pedimos à pedaleira para trabalhar
    public void pedalar() {
        pedaleira.pedalar();
    }

  1. Este código não está completo nem irá funcionar, é apenas uma aproximação