C# - Os tipos associação entre as classes - I


 Hoje vamos revistar um conceito básico mas importante para todo o desenvolvedor C# : Os tipos de associação entre as classes.

A seguir iremos recordar os principais tipos de associação entre as classes na linguagem C#.

Veremos os seguintes tipos de associação:

  1. Unidirecional
  2. Bidirecional
  3. Agregação
  4. Composição

 

Na figura abaixo temos a representação usada na UML para expressar o relacionamento entre classes:

A associação é um relacionamento que descreve os motivos do relacionamento e as regras que regem o relacionamento.

Mas antes de discutirmos cada tipo de associação vamos falar um pouco da Dependência.

1- Dependência

A Dependência é definida como uma relação entre duas classes, onde uma classe depende de outra classe, mas a outra classe pode ou não depender da primeira classe. Portanto, qualquer alteração em uma das classes pode afetar a funcionalidade da outra classe.

Na dependência temos que :

O uso típico da dependência poderia se dar nos seguintes cenários:

Exemplo:

   public class Pedido
   {
        public int PedidoId { get; set; }
        public DateTime Data { get; set; }
        public Guid ClienteId { get; set; }

        public Pedido(Cliente cliente)
        {
            this.ClienteId = cliente.ClienteId;
        }
    }
   public class Cliente
   {
        public Guid ClienteId { get; set; }
        public string Nome { get; set; }
   }

Aqui temos uma classe Cliente e uma classe de Pedido com uma dependência entre Pedido e Cliente.

Quando vamos salvar um novo pedido, precisamos salvar o pedido correspondente a um cliente. Para isso, nossa classe Pedido precisa de uma referência à classe Cliente para salvar seus dados. Portanto, nesse caso, nossa classe Pedido depende da classe Cliente. Se alguma alteração for feita na classe Cliente, isso poderá resultar em alterações na classe Pedido.

A seguir temos a representação UML para este caso:

Onde Pedido referencia uma instância de Cliente como um parâmetro no construtor da classe.

2- Associação Simples ou unidirecional

A associação unidirecional é uma forma especializada de associação em que um objeto está associado a outro objeto, mas o inverso não é verdadeiro. Temos aqui uma comunicação unidirecional.

Considere como exemplo uma relação aluno-professor. Conceitualmente, cada aluno pode ser associado a vários professores e cada professor pode ser associado a vários alunos.

Agora, para explicar esse relacionamento em termos de programação orientada a objetos,vamos representar essas entidades como classes C# identificadas pelos nomes Professor e Aluno.

  public class Professor
  {
       public string Nome { get; set; }
       List<Aluno> listaAlunos { get; set; }
  }
public class Aluno
 {
        public string Nome { get; set; }
        List<Professor> _listaProfessores { get; set; }
        public void AssociaProfessores(List<Professor> listaProfessores)
        {
            _listaProfessores = listaProfessores;
        }
 }

No código abaixo código temos uma única instância de  "aluno", sendo que, esse aluno pode ter várias instâncias de professor associadas a ele, ou seja, "professor1" e "professor2" :

class Program
{
        static void Main(string[] args)
        {
            Aluno aluno = new Aluno();
            aluno.Nome = "Macoratti";
            List<Professor> listaProfessores = new List<Professor>();
            Professor professor1 = new Professor();
            Professor professor2 = new Professor();
            listaProfessores.Add(professor1);
            listaProfessores.Add(professor2);
            aluno.AssociaProfessores(listaProfessores);
            Console.ReadLine();
        }
  }

Note que as duas instâncias de Professor estão sendo criadas fora da turma do aluno. Portanto, a vida desses objetos é independente da vida da instância do aluno.

Portanto, mesmo que "aluno" seja descartado explicitamente, ainda podemos ter as instâncias da classe Professor vivas.

Outro detalhe é que qualquer outra instância de aluno, como aluno2, também pode ter as mesmas instâncias de professor, ou seja, "professor1" e "professor2" associadas a ele, e podemos dizer que nenhuma instância do aluno é mãe de qualquer instância do professor. Portanto, não há propriedade de instâncias na associação.

Assim uma associação significa um relacionamento entre os objetos, no caso a associação é unidirecional.

3- Associação Bidirecional

A associação Bidirecional é um tipo de associação em que um objeto está relacionado a outros objetos e o inverso também é verdadeiro, sendo assim uma comunicação bidirecional.

Neste cenário temos que:

- Cada classe se refere à outra classe;
- A navegabilidade é de A para B e de B para A;
   - Um objeto da Classe A pode acessar os objetos da Classe B aos quais está associado;
   - Objeto(s) da classe B 'pertencem a' classe A;
    -Isso implica uma referência de A para B
    -Além disso, um objeto da classe B pode acessar o(s) objeto(s) de classe A ao qual está associado;

Uma associação bidirecional é complicada porque cada objeto deve ter uma referência ao(s) outro(s) objeto(s) e geralmente as associações bidirecionais são muito menos comuns que as unidirecionais.

Um exemplo de associação bidirecional pode existir entre as entidades 'Curso' e 'Aluno'.

Dado um curso, podemos querer saber quais alunos estão nesse curso, e, da mesma forma, começando com um aluno, podemos querer saber o curso que eles estão estudando.

Na próxima parte do artigo vamos tratar da agregação e da composição.

"(Disse Jesus) Ainda um pouco, e o mundo não me verá mais, mas vós me vereis; porque eu vivo, e vós vivereis."
João 14:19

Referências:


José Carlos Macoratti