Orientações sobre parâmetros de um método

A refatoração, extração de métodos e sub-rotinas ajudam muito na programação, principalmente quando o assunto é reutilização de código. Na declaração de novos métodos, algumas vezes é necessário criar alguns parâmetros para que o método execute adequadamente as operações internas.

Como parte das técnicas de melhoria da expressividade no código, os parâmetros de métodos também devem receber uma atenção especial. Durante o desenvolvimento de um projeto que estará em um constante trabalho de criação e consumo de vários métodos e a interpretação de cada um deles deverá ser o mais simples possível e ao acessar a declaração ou implementação de um método, seja fácil compreendê-lo.

 

1 - Nomenclatura

Quando uma variável é declarada, emprega-se prefixos e nomes que sejam condizentes com o que elas armazenarão. Para os parâmetros de métodos a regra é a mesma, afinal esta é uma variável de certa forma e o critério adotado deverá ser o mesmo, porém, com um detalhe: nomeá-los de uma forma particular para indicarmos que são parâmetros ao invés de variáveis.

Uma sugestão é adicionar o prefixo “A”, conforme a convenção da própria Embarcadero.

procedure VerificarPedidosPendentes(ADataInicial, ADataFinal: TDateTime; aCodCliente: integer);

 

Na implementação do método, saberemos que as variáveis que começam com o prefixo “A” são, na realidade, parâmetros. Uma das vantagens dessa dica é permitir uma melhor orientação durante a leitura do método, caso seja necessário realizar uma manutenção ou interpretar a regra de negócio.

4 - Quantidade de parâmetros

Quando o número de parâmetros começa a crescer demais em um mesmo método (mais de três parâmetros), o recomendado é criar um objeto que contenha todos esses valores e seja passado como um parâmetro único, dispensando o uso excessivo de vírgulas na chamada do método. Sendo assim, ao invés da chamada abaixo:

 

function EnviarEmailCliente(AAssunto: String; ATexto: String; ATipoFormatacao: SmallInt; AContaEmail: String; ADestinatarios: String; AAnexo: String): Boolean; begin //Processo.... end; Begin if EnviarEmailCliente(Edit1.Text, Memo1.Lines.Text,   RadioGroup1.ItemIndex, ComboBox1.Text, ListBox1.Items.Text, OpenDialog1.FileName) then     begin ShowMessage('E-mail enviado com sucesso!'); end else ShowMessage('E-Mail não enviado!'); end;

 

A recomendação é que sejam criados poucos parâmetros nos métodos e para isso poderá ser refatorado para a seguinte forma:

uses System, SysUtils, Classes; function EnviarEmailCliente(AStrLista: TStringList; ATipoFormatacao: SmallInt): Boolean; var vIdxStr: Byte; begin for vIdxStr := 0 to AStrLista.Count -1 do showMessage(AStrLista.Names[vIdxStr] + ': ' + AStrLista.ValueFromIndex[vIdxStr] ); // if ATipoFormatacao = 0 then //processo de formatação abaixo.... Result := true; end; var vObjParametros: TStringList; vTextoEmailParametro: String; const cTextoEmail = 'Assunto=%0:s#' + 'Mensagem=%1:s#' + 'ContaEmail=%2:s#' + 'Destinatarios=%3:s#' + 'Anexo=%4:s'; begin vObjParametros := TStringList.Create; try vObjParametros.NameValueSeparator := '='; vObjParametros.LineBreak := '#'; vTextoEmailParametro := Format(cTextoEmail, ['Boas práticas de programação', 'Aqui está uma documentação completa para boas práticas de programação no VsScripter da Viasoft', 'email@domiio.com.br', 'destinatario@dominio.com.br', 'Arquivos de anexos' ]); vObjParametros.Text := vTextoEmailParametro; if EnviarEmailCliente(vObjParametros, 0) then ShowMessage('E-mail enviado com sucesso!'); finally vObjParametros.Free; end; end;

 

O número de linhas de código pode ser relativamente maior, mas, por outro lado, o código definitivamente se torna mais compreensível e a quantidade de parâmetros poderá ser ilimitada desta forma.

O exemplo acima demonstra como fazer uma lista de parâmetros através de um TStringList, no VsScripter essa é a forma mais prática, pois oferece alguns recursos como nome do campo e valor do campo, podendo ainda definir uma separação entre ambos.

Caso tenha algum parâmetro com um tipo de dado específico como: TComponent, TObject, TStream, entre outros, então deverão ser tomadas outras formas de repassar estas parametrizações específicas.

Visto que no VsScripter não é possível definir tipos de dados e classes e também não existe a possibilidade de definir records.