• Nenhum resultado encontrado

INTRODUÇÃO AO VISUAL STUDIO COM WINDOWS FORM

9.9 PARA SABER MAIS — TIPOS IMPLÍCITOS E A PALAVRA VAR

get

{

return (this.idade >= 18 ||

this.documentos.contains("emancipacao")) &&

!string.IsNullOrEmpty(this.cpf);

} }

Perceba que podemos criar três variáveis para que nosso if não fique muito complexo: public bool PodeAbrirContaSozinho

{

get

{

bool maiorDeIdade = this.idade >= 18;

bool emancipado = this.documentos.contains("emancipacao");

bool possuiCPF = !string.IsNullOrEmpty(this.cpf);

return (maiorDeIdade || emancipado) && possuiCPF;

} }

Desse jeito, o código fica mais limpo e fácil de entender. Porém, tivemos que ficar declarando os tipos das variáveis como bool . Não seria óbvio para o C# que essas variáveis são do tipo bool . Sim! E ele é esperto o suficiente para inferir isso:

public bool PodeAbrirContaSozinho {

get

{

var maiorDeIdade = this.idade >= 18;

var emancipado = this.documentos.contains("emancipacao");

var possuiCPF = !string.IsNullOrEmpty(this.cpf);

return (maiorDeIdade || emancipado) && possuiCPF;

} }

Variáveis dentro de métodos podem ser declaradas como var em C# que o seu tipo é inferido automaticamente. Para o compilador acertar qual o tipo da variável ela deve ser inicializada no mesmo instante que é declarada e não pode ser atribuído o valor null .

public bool PodeAbrirContaSozinho {

get

{

var maiorDeIdade; // esta linha não compila

maiorDeIdade = this.idade >= 18;

// ...

} }

Por fim, uma variável declarada como var possui um tipo bem definido e não pode ser alterado. A tipagem é inferida, mas o tipo da variável não pode ser alterada à medida que o código é executado, o que faz com que o código seguinte não faça sentido e não compile:

var guilherme = new Cliente();

guilherme = new Conta();

1. Observe o código a seguir e assinale a alternativa correta.

var conta = new Conta();

conta.Titular = new Cliente();

Não compila pois a variável é de um tipo dinâmico.

Compila e faz com que a variável conta possa referenciar qualquer tipo de objeto. Não compila pois ele não tem como adivinhar se var é uma conta nova ou já existente. Compila e faz com que a variável conta seja do tipo Conta .

2. O que acontece ao tentar compilar e rodar o código a seguir?

var simples = new Conta(); // linha 1

simples = new Conta(); // linha 2

simples = new Cliente(); // linha 3

A linha 2 não compila pois não podemos reatribuir uma variável. A linha 3 não compila pois o tipo de uma variável não pode ser trocado e ele é inferido ao declarar a variável. Compila e no fim das 3 linhas de código a variável simples apontará para um Cliente . A linha 1 não compila devido ao código da linha 2 e 3. 3. O que acontece ao compilar e rodar o código a seguir? var conta;

conta = new Conta();

conta.Deposita(300);

Não compila pois conta não teve um valor atribuído já na primeira linha.

Compila mas não roda, dando erro de execução na linha 2 pois tentamos acessar uma variável sem valor.

Compila e roda. 4. O que acontece ao compilar e executar o código adiante? var tamanho = 5; tamanho = tamanho / 2.0; MessageBox.Show(tamanho); O código não compila na linha 2. O código compila e roda imprimindo 2. O código compila mas não roda pois 5 não é divisível por 2.0. O código compila e roda, imprimindo tamanho = 2.5

Você conhece alguém que tem potencial para tecnologia e programação, mas que nunca escreveu uma linha de código? Pode ser um filho, sobrinho, amigo ou parente distante. Na Alura Start ela vai poder criar games, apps, sites e muito mais! É o começo da jornada com programação e a porta de entrada para uma possível carreira de sucesso. Ela vai estudar em seu próprio ritmo e com a melhor didática. A qualidade da conceituada Alura, agora para Starters.

Conheça os cursos online da Alura Start! Aprenda se divertindo na Alura Start!

CAPÍTULO 10

Imagine agora que nosso banco realize depósitos e saques de acordo com o tipo da conta. Se a conta for poupança, o cliente deve pagar 0.10 por saque. Se a conta for corrente, não há taxa.

Para implementar essa regra de negócio, vamos colocar um if no método Saca : public void Saca(double valor)

{ if(this.Tipo == ???????????) { this.Saldo -= valor + 0.10; } else { this.Saldo -= valor; } }

Podemos criar um atributo na Conta , que especifica o tipo da conta como, por exemplo, um inteiro qualquer onde o número 1 representaria "conta poupança" e 2 "conta corrente".

A implementação seria algo como: public class Conta

{

public int Numero { get; set;}

public double Saldo { get; private set; } public Cliente Titular { get; set; } public int Tipo { get; set; } public void Saca(double valor) { if(this.Tipo == 1) { this.Saldo -= valor + 0.10; } else { this.Saldo -= valor; } }

public void Deposita(double valor) {

this.Saldo += valor;

} }

Veja que uma simples regra de negócio como essa fez nosso código crescer muito. E poderia ser pior: imagine se nosso banco tivesse 10 tipos de contas diferentes. Esse if seria maior ainda.

Precisamos encontrar uma maneira de fazer com que a criação de novos tipos de conta não implique em um aumento de complexidade.

Uma solução seria ter classes separadas para Conta (que é a corrente) e ContaPoupanca : public class Conta

{

public int Numero { get; set;}

public double Saldo { get; private set; } public Cliente Titular { get; set; } public void Saca(double valor) {

this.Saldo -= valor;

}

public void Deposita(double valor) {

this.Saldo += valor;

} }

public class ContaPoupanca

{

public int Numero { get; set;}

public double Saldo { get; private set; } public Cliente Titular { get; set; } public void Saca(double valor) {

this.Saldo -= (valor + 0.10);

}

public void Deposita(double valor) {

this.Saldo += valor;

} }

Ambas as classes possuem código bem simples, mas agora o problema é outro: a repetição de código entre ambas as classes. Se amanhã precisarmos guardar "CPF", por exemplo, precisaremos mexer em todas as classes que representam uma conta no sistema. Isso pode ser trabalhoso.

A ideia é, portanto, reaproveitar código. Veja que, no fim, uma ContaPoupanca é uma Conta , pois ambos tem Numero , Saldo e Titular . A única diferença é o comportamento no momento do saque. Podemos falar que uma ContaPoupanca é uma Conta :

public class ContaPoupanca : Conta