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