Composição de objetos

Em ciência da computação, composição de objetos (não confundir com composição de funções) é uma maneira de se combinar objetos simples ou tipos de dados em objetos mais complexos. Composições são blocos de construção críticos de muitas estruturas de dados básicas, incluindo a união rotulada, lista ligada e árvore binária, bem como o objeto utilizado em programação orientada a objetos.

Objetos compostos são frequentemente referidos como tendo um relacionamento "tem um". Um exemplo de composição do mundo real pode ser visto em um automóvel: os objetos roda, volante, banco, transmissão e motor podem não ter utilidade funcionando isoladamente, mas um objeto chamado automóvel contendo todos estes objetos teria uma função muito útil, maior que a soma de todas as suas partes.

Quando, em uma linguagem de programação, os objetos são tipados, os tipos geralmente podem ser dividos em tipos compostos e não-compostos e a composição pode ser considerada uma relação entre os tipos: um objeto de um tipo composto (e.g. carro) "tem um" objeto de um tipo mais simples (e.g. roda).

A composição deve ser distinguida de subtipo, que é o processo de adicionar detalhes a um tipo de dados geral para criar um tipo de dados mais específico. Por exemplo, os carros podem ser um tipo específico de veículo: carro é um veículo. Subtipo não descreve um relacionamento entre objetos diferentes, em vez disso, ele diz que objetos de um tipo são simultâneamente objetos de outro tipo.

Em linguagens de programação, objetos compostos são normalmente expressos por meio de referências de um objeto para outro, que dependendo da linguagem, tais referências podem ser conhecidas como campos, membros, propriedades ou atributos e a composição resultante como uma estrutura, registro, tupla, tipo definido pelo usuário (TDU) ou tipo composto. São atribuídos nomes exclusivos aos campos para que cada um possa ser distinguido dos outros. Entretanto, possuir tais referências não significa necessariamente que um objeto é composto. Ele só pode ser definido como composto se os objetos a que ele se refere fazem parte dele de fato, isto é, não existem isoladamente. Para detalhes, veja a seção agregação abaixo.

Notação UML editar

A UML - Linguagem de Modelagem Unificada (do inglês, UML - Unified Modeling Language) é uma linguagem-padrão para a elaboração da estrutura de projetos de software. Ela poderá ser empregada para a visualização, a especificação, a construção e a documentação de artefatos que façam uso de sistemas complexos de software. Em outras palavras, na área de Engenharia de Software, a UML é uma linguagem de modelagem que permite representar um sistema de forma padronizada (com intuito de facilitar a compreensão pré-implementação). A UML é adequada para a modelagem de sistemas, cuja abrangência poderá incluir desde sistemas de informação corporativos a serem distribuídos a aplicações baseadas na Web e até sistemas complexos embutidos de tempo real. É uma linguagem muito expressiva, abrangendo todas as visões necessárias ao desenvolvimento e implantação desses sistemas.

Agregação editar

A agregação se difere da composição comum no fato de que ela não implica propriedade. Em composição, quando o objeto possuidor é destruído, seus objetos componentes também o são. Em agregação, isto não é necessariamente verdadeiro. Por exemplo, uma universidade possui vários departamentos (e.g. química) e cada departamento possui um número de professores. Se a universidade fechar, os departamentos não existirão mais, mas os professores destes departamentos continuarão a existir. Assim, a Universidade pode ser vista como uma composição de departamentos, enquanto que os departamentos possuem uma agregação de professores. Além disso, um Professor poderia trabalhar em mais de um departamento, mas um departamento não poderia fazer parte de uma outra universidade.

A composição normalmente é implementada como um objeto que contem outro objeto. Por exemplo, em C++:

class Professor;

class Departamento
{
  ...
  private:
    // Agregação
    Professor* membros[5];
    ...
};

class Universidade
{
  ...
  private:

    Departamento faculdade[20];
  ...
  create dept()
  {
    ....
      // Composição
      faculdade[0] = Departamento(....);
      faculdade[1] = Departamento(....);
    ....
  }
};

Em agregação, o objeto pode apenas conter uma referência ou ponteiro para um objeto (e não ter uma responsabilidade de tempo de vida para ele): Algumas vezes a agregação é referida como composição quando a distinção entre composição ordinária e agregação não é importante.

O código acima transformaria-se no seguinte diagrama de Classes UML: