Fundamentos do Desenvolvimento de Software

Fundamentos do Desenvolvimento de Software

Renato Haddad

Microsoft Most Valuable Professional MVP, MCT, MCPD e MCTS

Tecnologias

Visual Studio .NET 2010, C#

Introdução

Neste artigo irei abordar alguns tópicos básicos que todo desenvolvedor deve saber. A pedidos, os tópicos serão básicos porque este artigo faz parte do programa Microsoft Academy Awards, Módulo Estruturas de decisão e repetição e Programação Orientada a Objeto – OOP.

 

Decidi usar a linguagem Visual C# simplesmente porque a maioria dos exemplos encontrados na web usam C#. Neste artigo abordarei as estruturas de decisões e repetições, programação orientada a objetos, como criar uma classe, adicionar propriedades, métodos e um construtor. Para finalizar, como herdar uma classe e as vantagens.

 

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? Entend o 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");

}

 

Programação Orientada a Objetos

 

Pensar em .Net é obrigatório saber OOP porque tudo é baseado em OOP.

O que é um objeto?

Um objeto é nada mais que uma classe, que pode ter propriedades e métodos. Propriedades da classe são as características e os métodos são as ações. Neste exemplo a seguir defini a classe chamada Jogador contendo 3 propriedades, sendo id, nome e modalidade. Cada propriedade tem um tipo (int, string, double, datetime, etc). Já os métodos desta classe são Salvar e Excluir, os quais não estão implementados, mas são as ações desta classe.

 

public class Jogador

{

    // propriedades

    public int id { get; set; }

    public string nome { get; set; }

    public string modalidade { get; set; }

 

    // métodos

    public void Salvar() { }

 

    public void Excluir() { }

}

 

Como instanciar um objeto e preenche-lo? No código a seguir veja como instanciar o objeto/classe Jogador e preencher com as propriedades definidas na classe. Eu usei a palavra chave var porque o C# atribui o tipo de acordo o conteúdo e como no new está setado o Jogador, então, automaticamente a variável obj passa a ser do tipo Jogador. Uma vez finalizado o preenchimento você tem acesso a tudo da classe, desde que seja pública é claro. Neste exemplo, será mostrado o nome do Jogador através da propriedade obj.nome.

 

var obj = new Jogador

{

    id = 10,

    nome = "Paulo",

    modalidade = "xadrez"

};

 

Console.WriteLine(obj.nome);

 

Construtor da classe

Quando você precisar instanciar uma classe, mas alguma informação deve ser passada logo no início, você pode inserir o campo no construtor da classe. Exemplificando, veja a mesma classe Jogador contendo a propriedade idade. Observe que logo após a declaração da classe é definido o campo idade e no construtor public Jogador (int idade) já é esperado o valor da idade. Neste caso

 

 

public class Jogador

{

    public int idade;

    public Jogador(int idade)

    {

        this.idade = idade;

    }

    // propriedades

    public int id { get; set; }

    public string nome { get; set; }

    public string modalidade { get; set; }

 

    // métodos

    public void Salvar() { }

 

    public void Excluir() { }

}

 

Neste caso, quando instanciar a classe Jogador, a idade deverá ser declarada imediatamente entre parênteses.

var obj = new Jogador(25)

{

    id = 10,

    nome = "Paulo",

    modalidade = "xadrez"

};

 

Console.WriteLine(obj.nome);

 

 

Herança de Classe

Um dos melhores conceitos que existem no OOP é a herança. Isto permite criar uma classe base e herda-la quando necessário. Na classe base normalmente colocamos propriedades e métodos básicos, genéricos e nas classes que herdam esta, colocamos as particularidades.

Veja que criei a classe Xadrez e herdei de Jogador. No C# para herdar uma classe use o : . Neste caso, a classe Xadrez tem as propriedades nível e rating. No entanto, veja que o construtor também usa o idade, pois na classe base Jogador, a idade deve ser declarada quando instânciada.

 

public class Xadrez : Jogador

{

    public Xadrez(int idade):base(10)

    {

        this.idade = idade;

    }

    public string nivel { get; set; }

    public int rating { get; set; }

}

 

 

Agora veja como instanciar a classe Xadrez. Observe que as propriedades id, nome e modalidade não existem em Xadrez. Porém, como Xadrez herda de Jogador, você tem acesso a todas estas propriedades de forma transparente. Isto é fantástico, otimiza código, facilita a manutenção e você consegue estender várias funcionalidades.

 

var objX = new Xadrez(27)

{

    nivel = "avançado",

    rating = 10000,

    id = 20,

    nome = "Alvaro",

    modalidade = "xadrez"

};

Console.WriteLine(objX.rating);

 

Vale dizer que todas as propriedades e métodos vistos aqui são públicos (public). Caso queira que uma propriedade seja vista apenas de dentro da classe, use private ou protected. Isto vale para métodos também.

 

Sobre o Autor

Renato Haddad (rehaddad@msn.com  – www.renatohaddad.com ) é MVP, MCT, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2010, ASP.NET 4, Entity Framework, Reporting Services e Windows Phone. Visite o blog https://weblogs.asp.net/renatohaddad.