Substituindo parâmetros booleanos por enumeração
Responda rápido, qual a diferença entre estes dois comandos:
CopyFile(‘arq1.txt’, ‘arq2.txt’, True);
CopyFile(‘arq1.txt’, ‘arq2.txt’, False);
Eu não saberia dizer para que serve esse terceiro parâmetro booleano sem usar o tooltip do Delphi ou ler a documentação.
E se fosse assim?
CopyFile('arq1.txt', 'arq2.txt', cmFailIfExists);
Melhor não?
Pois é, a outra opção poderia ser algo como:
CopyFile('arq1.txt', 'arq2.txt', cmOverwrite);
Há algum tempo atrás li uma dica que venho aplicando desde então: substituir parametros booleanos por enumerações. O código fica muito mais fácil de ler e entender.
No exemplo acima usei uma função da API Win32 para exemplificar, mas se fossemos reescrever a função CopyFile, ficaria algo assim:
type
TCopyMode = (cmFailIfExists, cmOverwrite);
procedure MyCopyFile(const Source, Dest: string; CopyMode: TCopyMode);




Essa é uma boa dica. Só é chato porque impede o uso de expressões boleanas para passar os parâmetros, como por exemplo:
CopyFile(‘arq1.txt’, ‘arq2.txt’, (ExtractFileExt(‘arq2.txt’) = ‘.xyz’) or UsuarioEscolheuSobrescrever);
Um alternativa é criar constantes de valor boleano no escopo público da função:
const
cmFailIfExists = False;
cmOverwrite = True;
Assim você tem o melhor dos dois mundos: flexibilidade e legibilidade!
Boa observação, porém no meu ponto de vista, a utilização de expressões booleanas é muito menor se comparada ao uso dos valores diretos, e o código continua mais difícil de ler, pois você tem que traduzir a expressão para entender como a função está sendo chamada.
No caso do seu exemplo com a variável UsuarioEscolheuSobrescrever nem tanto, mas nesse caso dependemos do desenvolvedor usar bons nomes de variáveis, o que muitas vezes não acontece.
Por isso eu ainda acho que é mais interessante as enumerações do que os booleanos.
O código do Daniel é bem melhor mesmo:
…Senão teríamos que criar uma nova procedure com enumeração para toda função que usa booleanos – só para ficar mais legível.
Declarar constantes booleanas ajuda muito na legibilidade sem perder tempo inchando o código com novas procedures desnecessárias.
Júlio, use o bom senso, não leve ao extremo.
Não é para criar novas procedures para procedures já existentes, a dica é para quando for criar suas procedures que usam booleanos usar enumerações.
Lógicamente não vamos ficar traduzindo funções já prontas, isso não se justificaria.
Erick sasse wrote:
“No exemplo assima usei …”
Caramba, “assima” é lenha, heim…
José, “assima” é demais mesmo! Hahaha.
É o tipico erro sem explicação, se fosse uma palavra difícil ainda vá lá.
Valeu cara, já corrigi!