quarta-feira, 28 de maio de 2014

Initializer em C#

Olá , vamos estudar C#
Nós precisamos construir uma classe Cliente com os atributos nome, cpf , rg e endereco. 
class Cliente
{
    public string nome;
    public string cpf;
    public string rg;
    public string endereco; 
}
 lembrar de colocar o nome após criarmos um novo cliente em nosso sistema. Isso pode ser visto no código a seguir:
Cliente guilherme = new Cliente();
guilherme.Nome = "Guilherme";
E se esquecermos de chamar a segunda linha desse código, teremos um cliente sem nome. Mas, será que faz sentido existir um cliente sem nome?
Para evitar isso, ao construir nosso objeto temos que obrigar o desenvolvedor a falar qual o nome do Cliente. Isto é, queremos ser capazes de alterar o comportamento da construção do objeto.
Queremos definir um novo comportamento que dirá como será construído o objeto. Algo como:
Cliente guilherme = new Cliente("Guilherme Silveira");
Note que esse comportamento que desejamos lembra um comportamento normal, passando argumentos, mas com a característica especial de ser quem constrói um objeto. Esse comportamento recebe o nome de construtor. E como defini-lo? Similarmente a um comportamento qualquer:
class Cliente
{
  // Outros atributos da classe Cliente
  public string Nome { get; set; }

  public Cliente (string nome)
  {
    this.Nome = nome;
  }
}
Vimos que quando criamos um construtor na classe, o C# usa o construtor criado para inicializar o objeto, porém o que acontece quando não temos nenhum construtor na classe? Quando uma classe não tem nenhum construtor, o C# coloca um construtor padrão dentro da classe. Esse construtor não recebe argumentos e não executa nenhuma ação, ou seja, um construtor que não recebe nenhum argumento e tem o corpo vazio.


Múltiplos construtores dentro da classe

Na seção anterior definimos um construtor dentro da classe cliente que inicializa a propriedade nome, mas e se quiséssemos inicializar também a idade do Cliente durante a construção do objeto? Nesse caso, precisaríamos de um construtor adicional na classe Cliente:
class Cliente 
{
    public string Nome { get; set; }
    
    public int Idade { get; set; }
    
    // construtor que só recebe o nome
    public Cliente (string nome)
    {
        this.Nome = nome;
    }
    // construtor que recebe o nome e a idade
    public Cliente (string nome, int idade)
    {
        this.Nome = nome;
        this.Idade = idade;
    }
}
Veja que definimos duas versões diferentes do construtor da classe, uma que recebe apenas a string nome e outra que recebe string nome e int idade. Quando colocamos diversas versões do construtor dentro de uma classe, estamos fazendo uma sobrecarga de construtores.
 Bad Smell
Construtores com muitos atributos pode gerar um bad smell no código  .
O que é bad smell ?
Bad Smell é um mal cheiro no código, por exemplo , se nós fizermos vários métodos repetidos, nós vamos gerar um bad smell. Isso pode fazer nosso código sujo, nossa aplicação pode ficar lenta e etc....
por exemplo, vamos criar um construtor com dois atributos RG e CPF
Cliente cliente = new Cliente("123","123");
 se fosse assim, nós não saberíamos qual é o rg e o cpf, pensando nisso o C# criou uma nova forma de nós inicializarmos os  atributos.

 Initializer

Vimos que podemos utilizar um construtor para pedir informações obrigatórias para a classe. Mas, já sabendo também o que é bad smell . Ao invés de fazer assim:
Cliente cliente = new Cliente ();
cliente.Nome = "Andre Leonis";
cliente.Cpf = "123.456.789-01";
cliente.Rg = "21.345.987-x";
cliente.Idade = 25;
Veja que em todas as linhas estamos repetindo o nome da variável que guarda a referência para o cliente. Para evitar essa repetição, podemos utilizar os initializers do C#. O Initializer é um bloco de código que serve para inicializar as propriedades públicas do objeto.Nós poderíamos fazer assim:
Cliente cliente = new Cliente ()
{
    // bloco de inicialização
    Nome = "Andre Leonis"
    Cpf = "123.456.789-01",
    Rg = "21.345.987-x",
    Idade = 25 
};

0 comentários:

Postar um comentário