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
Initializer em C#