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.