Home > Delphi > Substituindo parâmetros booleanos por enumeração

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);

Categories: Delphi Tags:
  1. September 12th, 2006 at 09:48 | #1

    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!

  2. September 12th, 2006 at 15:39 | #2

    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.

  3. Júlio Cascalles
    September 17th, 2006 at 09:48 | #3

    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.

  4. September 17th, 2006 at 10:33 | #4

    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.

  5. September 18th, 2006 at 15:26 | #5

    Erick sasse wrote:
    “No exemplo assima usei …”

    Caramba, “assima” é lenha, heim… :)

  6. September 18th, 2006 at 15:58 | #6

    José, “assima” é demais mesmo! Hahaha.
    É o tipico erro sem explicação, se fosse uma palavra difícil ainda vá lá.

    Valeu cara, já corrigi! :)