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

6 Comments

  • 12/9/2006 - 09:48 | Permalink

    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!

  • 12/9/2006 - 15:39 | Permalink

    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.

  • Júlio Cascalles
    17/9/2006 - 09:48 | Permalink

    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.

  • 17/9/2006 - 10:33 | Permalink

    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.

  • 18/9/2006 - 15:26 | Permalink

    Erick sasse wrote:
    “No exemplo assima usei …”

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

  • 18/9/2006 - 15:58 | Permalink

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

    Valeu cara, já corrigi! :)

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>