quinta-feira, 7 de fevereiro de 2008

Dicas e Boas Práticas de Programação – Elaboração de Métodos

Quem nunca teve dificuldades em dar manutenção em um sistema que fez a vários meses (ou até anos)? Imagina então dar manutenção no sistema
feito por outra pessoa?
Acredito que várias pessoas tenham convivido com essa situação, e muito desses problemas se deve a construção de código de forma inadequada.
Abaixo vou dar algumas sugestões de como construir métodos de forma mais clara, facilitando o entedimento do que o mesmo deve fazer.

1 - Evite a elaboração de métodos com várias linhas de código:
Métodos muito grandes normalmente estão fazendo mais do que deveria realmente fazer, neste caso é importante observar se o método esta fazendo extamente o que o nome dele diz que tem fazer.

2 - Evite métodos que receba vários parâmetros:
Métodos que recebem vários parâmetros também são de difícil manutenção, nestes casos verifique se não pode quebrar os seu método em outros, ou até mesmo criar uma classe com os parâmetros que você precisa e utiliza-lá como parâmetro do método. Eu procuro evitar contruir métodos que
recbam mais que 5 parâmetros.

Ex.:
Troque esse:
private void IncluirCliente(string strNome, string strSobreNome, string strEmail, string strTelefone, string strEndereco, string strPessoaContato)
{

}

Por esse:
public Cliente
{
string strNome;
string strSobreNome;
string strEmail;
string strTelefone;
string strEndereco;
string strPessoaContato;
}
private void IncluirCliente(Cliente pobjCliente)
{
//Neste caso você pode atribuir um novo parâmetro na classe Cliente sem precisar alterar a assinatura do método.
}


3 - Dificuldades em criar nome para método pode ser um sinal que você deve quebrar o método em outros.
Métodos normalmente indicam alguma ação que o sistema deve fazer, se você esta com dificuldade em criar uma nome para essa ação isso pode indicar que ação não esta perfeitamente clara ou pode estar pensando em várias várias ações ao mesmo.


4 - Comentário pode salvar sua vida:
Comentar os métodos e bloco de códigos são sempre bem vindos, até mesmo aquelas coisas que parecem óbivias naquele momento podem não fazer sentindo depois de algum tempo, por tanto, comente o seu código o máximo possível, isso ainda pode lhe ajudar algum dia.


5 - Identação é muito importante:
Para quem utilização uma IDE como o Visual Studio por exemplo raramente tem esse tipo de problema, mas as vezes podemos nos deparar com um programador ousado (muito macho !!!!) que resolve programar no bloco de notas, com isso, podemos ter um código mal identado, e isso sem dúvida
atrapalha na compreensão do código.

6 - Reutilização de código é chave para o sucesso, pense nisso:
No momento que estiver construindo o seu método procure entender se ele pode ser utilizado em outro ponto do sistema ou até mesmo por outra aplicação, neste caso, pense no seu método participando desses cenários e verifique se foi construido de forma adequada.
Ex.:

//No caso abaixo perceba que o IncluirCliente da camada negócio inseri o novo cliente e automaticamente ja vincula o cliente a um grupo
//Mas como faríamos se desejasemos adicionar um cliente sem que o mesmo participasse de um grupo, ou fazer com que o cliente participasse de vários grupos?
public BLCliente
{
public void IncluirCliente(Cliente pobjCliente, int pintCodigoGrupo)
{
DALCliente objDALCliente = new DALCliente();
pobjCliente.Codigo = objDALCliente.InserirCliente(pobjCliente);
objDALCliente.InserirClienteXGrupo(pobjCliente.Codigo, pintCodigoGrupo);
}
}


Sugestão:

//Perceba que da forma abaixo podemos incluir um cliente, incluir um cliente especificando um grupo ou sisplemente vincluir um cliente a um grupo
public BLCliente
{
public void IncluirCliente(Cliente pobjCliente, int? pintCodigoGrupo)
{
DALCliente objDALCliente = new DALCliente(); // revisado e corrigido, valeu Rodrigo.
pobjCliente.Codigo = objDALCliente.InserirCliente(pobjCliente);

if (pintCodigoGrupo != null)
{
this.IncluirClienteXGrupo(pobjCliente.Codigo, pintCodigoGrupo);
}
}

public void IncluirCliente(Cliente pobjCliente)
{
this.IncluirCliente(pobjCliente, null);
}

public void IncluirClienteXGrupo(int pintCodigoCliente, int pintCodigoGrupo)
{
DALCliente objDALCliente = new DALCliente();
objDALCliente.InserirClienteXGrupo(pintCodigoCliente, pintCodigoGrupo);
}
}