Enquanto tentava descobrir a ordem ideal para parâmetros opcionais para uma função recentemente, deparei com esta postagem no blog e acompanhando o repositório GitHub , que fornece um cabeçalho para uma kwargs
instalação semelhante a Pythonic em C ++. Embora eu não tenha terminado de usá-lo, me pergunto se isso é bom ou não em uma linguagem fortemente tipada. Tendo trabalhado em Python por um tempo, acho a idéia de uma kwargs
instalação semelhante no meu projeto muito atraente, porque muitos de seus objetos / funções têm vários parâmetros opcionais (que não podem ser evitados, infelizmente), produzindo longas listas de construtores que diferem em um ou dois parâmetros e podem ser muito mais sucintos / DRY-ish.
Qual é a experiência dos outros com coisas assim? Deve ser evitado? Existem diretrizes para isso? Quais são os possíveis problemas / armadilhas?
Respostas:
Não conheço muito bem os kwargs de C ++, mas algumas desvantagens vêm à mente depois de analisar sua fonte:
Eles exigem pré-declaração global de todos os argumentos . O exemplo simples na postagem do blog tem esta seção que é um peso morto:
Não é tão conciso quanto o original pitonico.
O C ++ oferece alternativas nativas para alcançar a funcionalidade dos parâmetros nomeados:
Wrappers de estrutura . Defina seus parâmetros opcionais como campos de uma estrutura.
Objetos de proxy . Os argumentos são armazenados em uma estrutura temporária que pode ser modificada com setters encadeados.
Nota : o boilerplate pode ser abstraído para uma macro em detrimento da legibilidade:
Funções variáveis . Obviamente, isso não é seguro para o tipo e requer conhecimento de promoções de tipo para ser acertado. Está, no entanto, disponível em C puro se C ++ não for uma opção.
Nota : No C ++, isso pode ser feito com segurança de tipo com modelos variados. A sobrecarga do tempo de execução desaparecerá às custas de tempos de compilação mais lentos e inchaço binário.
boost :: parameter . Ainda é uma biblioteca de terceiros, embora a lib seja mais estabelecida que alguns repositórios obscuros do github. Desvantagens: pesado de modelo.
Em uma nota final, eu não usaria essa biblioteca kwargs simplesmente porque há várias alternativas boas o suficiente em C ++ para obter o mesmo. Eu pessoalmente optaria por 1. ou 2. da lista (não exaustiva) acima.
fonte
private
? Torná-lospublic
significa que eles podem chamar a função ou definir a variável diretamente.struct foo
é um objeto descartável apenas para imitar a sintaxe original da função Python; passando valores de nome em uma linha no site da chamada. Eles poderiam ser,public
mas esse não era o ponto aqui.