03/01/2013

Fundamentos do Desenvolvimento de Softwares


Estruturas de decisões

Toda aplicação que precise de um direcionamento do fluxo de execução dos códigos, utiliza os comandos de condições, os quais têm como objetivo avaliar uma condição e conforme o resultado, direcionar o fluxo para uma operação, seja ela um bloco de códigos, uma função, etc.

O primeiro e o mais conhecido é o if (se). Sua sintaxe é:

If ( condição ) ... else / else if ( condição )

Basicamente a condição pode ser uma expressão lógica ou relacional. No exemplo a seguir é definida a variável idade com valor 12 e o if avalia se a idade é maior ou igual a 18. Caso seja verdadeiro, então será mostrada a mensagem "Maior de idade". Neste caso, há apenas uma instrução a ser executada.

var idade = 12;

if (idade >= 18) Console.WriteLine("Maior de idade");


Já no próximo exemplo note que dependendo da condição há um bloco de código a ser executado, sendo que o mesmo deverá estar entre chave {}. Neste caso, se a idade for maior ou igual a 18, então, será mostrada a mensagem "responsável", a idade será somada mais 2 anos, ou seja o resultado final é 14, e ao final, será mostrado o valor da variável já com o novo valor.

Note que neste código tem o uso do else, o qual é a ação falsa da expressão avaliada. Ou seja, neste caso se a idade não for maior ou igual a 18, serão mostradas duas mensagens ("Requer auxilio dos pais") e a idade (neste caso, 10), pois o -= subtrai 2 do valor atual de 12.

Enfim, em situações onde requer a execução de códigos ou blocos de códigos conforme a expressão avaliada, use o else.

 if (idade >= 18)
{
    Console.WriteLine("responsável");
    idade += 2;
    Console.WriteLine(idade);
}
else
{
    Console.WriteLine("Requer auxilio dos pais");
    idade -= 2;
    Console.WriteLine(idade);
}

Aprimorando um pouco o uso do if, veja no exemplo a seguir que há três situações possíveis de resultado. A idade inicial é 13, e a primeira expressão avalia se a idade é igual (==) a 10. Caso verdadeiro, mostra a mensagem "igual a 10". Caso contrário, é avaliada a segunda expressão, pois o uso do else if (senão se) avalia se a idade é maior ou igual a 12 E (&&) menor ou igual a 16.

Veja que neste caso é a mesma coisa que dizer entre 12 e 16, inclusive. Observe o uso do && o qual significa o E de forma que ambas as expressões devem ser verdadeiras.

Caso seja, será mostrada a mensagem "Adolescente". Neste exemplo se nenhuma das duas expressões anteriores for verdadeira, então o fluxo cairá no else e mostrará "maior que 16". Detalhe: quantos else if posso ter? Quantos forem necessários, não há limites.

idade = 13;
if (idade == 10)
    Console.WriteLine("igual a 10");
else if (idade >= 12 && idade <=16)
    Console.WriteLine("Adolescente");
else
    Console.WriteLine("maior que 16");

Assim com temos o E (&&), o uso do OU (||) é muito comum. Neste exemplo a seguir a mensagem "condição OU satisfeita" será exibida somente se a idade for igual a 1 OU igual a 10. Caso contrário, jamais este código será executado.

 if (idade == 1 || idade == 10)
    Console.WriteLine("condicao OU satisfeita");

Já pensou em escrever um código com muitos IFs? Não faz muito sentido isto. Em minha opinião fica um código que chamamos de sujo, de difícil manutenção, então se faz uso do comando swtich. Veja o exemplo a seguir: a variável linguagem contém o texto "cs".

O swtich avalia exatamente esta expressão swtich (linguagem). Dentro do bloco você deve colocar o case para cada condição a ser avaliada, e de acordo com o resultado, executa-se o código. Neste caso, dependendo das condições (vb ou cs) será mostrada a respectiva mensagem.

Note que se nenhuma acima for atendida, então o fluxo cai no default. Observe que há a palavra chave break, que tem a finalidade de encerrar o swtich e seguir a execução dos códigos abaixo do fechamento do bloco do swtich. O break não é obrigatório mas se você não colocar, a cada case será realizado o questionamento da expressão.

 string linguagem = "cs";
switch (linguagem)
{
    case "vb":
        Console.WriteLine("vb.net");
        break;
    case "cs":
        Console.WriteLine("c sharp");
        break;
    default:
        Console.WriteLine("outra linguagem");
        break;
}

 Agora vamos ao uso de loopings. Como o próprio nome diz, looping é um laço o qual pode ser finito ou infinito, depende como programar. O while é um tipo de looping bastante usado o qual tem como finalidade realizar a execução do bloco de código de acordo com a expressão definida no escopo do while. Veja que defini duas variáveis, uma boleana (lógica) chamada cond com o valor true; e a contador do tipo int com valor 50. Veja a sintaxe do while (cond), ou seja, enquanto verdadeiro.

Neste caso, enquanto a variável cond for verdadeira o looping será executado. Por segurança, dentro do bloco do looping, a cada iteração eu fiz uma condição if que avalia se o contador é igual a 60. Caso seja verdadeiro, a variável cond passa a ser false e não próxima execução da iteração, o looping será finalizado.

Vale dizer que a cada iteração é mostrado o valor do contador, e também é adicionado um (contador++) à variável.

bool cond = true;
int contador = 50;
while (cond)
{
    if (contador == 60) cond = false;
    Console.WriteLine(contador++);
}

Outro tipo de looping muito usado é o foreach (para cada item), o qual você não precisa dizer quantas iterações terão. Neste exemplo, defini um array de string[] chamado áreas contendo quatro siglas de departamentos. Já no foreach veja que a sintaxe é simples e intuitiva, ou seja, para cada item contido em áreas (coleção de itens) execute o bloco de código.

O foreach é extensamente utilizado em coleções de dados, leitura de dados em banco de dados, enfim, você não precisa controlar o final pois está encapsulado no foreach, é ele que controla o término.

string[] areas = { "DTI", "DPE", "WIN", "COR" };
foreach (var item in areas)
{
    Console.WriteLine(item);
}

Outro tipo de looping muito difundido em todas as linguagens é o for. A sintaxe é simples, mas vamos entendê-la. O int i = 0 inicializa a variável i do tipo int com valor 0 (zero).

A seguir é definido o limite da execução, neste caso a expressão i < 100 (enquanto i for menor que 100).

Para finalizar, o último parâmetro é o contador a cada iteração, neste caso é somado 1 a variável i.

for (int i = 0; i < 100; i++)
{
    Console.WriteLine(i);
}

 Tratamento de Erros

 Tratar erros é uma das coisas mais importantes nas aplicações. Infelizmente nem todo desenvolvedor faz isto e acaba se perdendo completamente, tornando a aplicação não confiável. A estrutura do tratamento é simples, use o try ... catch ... finally.

Tenha em mente o seguinte: tudo que for código passível de erro coloque no bloco do try. Não importa o que seja, se der erro cairá no catch, e é aqui que você deve tratar o erro.

O catch pode ser customizado para tipos definidos de erros, por exemplo, erro de abertura de conexão com banco de dados, divisão por zero, enfim, se você pesquisar pela expressão Exception no help do VS verá quais existem.

No código a seguir, dentro do try forcei um erro de divisão por zero, e como coloquei um catch para capturar este tipo de erro (DivideByZeroException), é óbvio que será mostrada a mensagem deste catch. Observe que o catch genérico sempre deverá ser usado por último, ou seja, se não cair em nenhum customizado, sobra para o último.

A vantagem é que você pode usar uma variável (neste caso ex) para ter acesso às propriedades do erro. Eu usei o ex.Message para mostrar a mensagem de erro do framework.

E o finally, para que serve? Entendo finally da seguinte forma: dando ou não erro, o finally será executado. Um exemplo simples de uso é nas conexões com banco de dados, dando ou não erro, feche a conexão.

try
{
    // bloco de codigos
    int valor = 10;
    int zero = 0;
    Console.WriteLine(valor / zero);
}
catch (DivideByZeroException)
{
    Console.WriteLine("Vc nao pode dividir nada por zero");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    //throw;
}
finally
{
    Console.WriteLine("mostra o finally");
}

No próximo post falarei sobre orientação a objetos.
Abraço e até o próximo post.

Nenhum comentário: