Os parâmetros opcionais são úteis ou dificultam a manutenção do aplicativo? [fechadas]

14

Como indicado no título, os parâmetros opcionais, como os usados em C # , são úteis ou eles são um obstáculo para a manutenção do aplicativo e devem ser evitados, pois podem tornar o código mais difícil de entender?

    
por rjzii 30.11.2010 / 16:10
fonte

10 respostas

22

Parâmetros opcionais têm, na minha experiência, sido uma coisa boa. Eu nunca os achei confusos (pelo menos não mais confuso do que a função real), já que posso sempre obter os valores padrão e saber o que está sendo chamado.

Um uso para eles é quando eu tenho que adicionar outro parâmetro para uma função que já está em uso geral, ou pelo menos na interface pública. Sem eles, eu teria que refazer a função original para chamar uma que tivesse outro argumento, e isso pode ficar muito antigo se eu acabar adicionando argumentos mais de uma vez.

    
por 30.11.2010 / 16:15
fonte
15

Em geral, se você precisar de muitos parâmetros / opcionais com freqüência, suas funções estão fazendo muito e devem ser divididas. Você está provavelmente quebrando o SRP (Princípio de Responsabilidade Única).

Procure por parâmetros que possam ser agrupados, por exemplo, (xey, tornar-se um ponto).

Esses sinalizadores de parâmetros opcionais são padrão? Se você estiver usando sinalizadores, a função deve ser dividida.

Isso não quer dizer que você nunca deve ter parâmetros opcionais, mas, em geral, mais de um ou dois parâmetros sugerem um cheiro de código.

Também pode ser um indício de que a função deve, na verdade, ser uma classe, com os parâmetros opcionais alterados para propriedades e a parte dos parâmetros necessários do construtor.

    
por 30.11.2010 / 16:22
fonte
4

Parâmetros opcionais são bons

Normalmente, a justificativa é que: a) você sabe que tem muitos argumentos possíveis para seu método, mas não quer sobrecarregá-lo por medo de confundir sua API, ou b) quando não conhece todos os possíveis argumentos, mas você não quer forçar o usuário a fornecer uma matriz. Em cada caso, os parâmetros opcionais vêm para o resgate de uma maneira limpa e elegante.

Aqui estão alguns exemplos:

1. Você quer evitar a sobrecarga e não deseja especificar uma matriz

Dê uma olhada em printf () de C, Perl, Java etc. É um ótimo exemplo do poder de parâmetros opcionais.

Por exemplo:

printf("I want %d %s %s",1,"chocolate","biccies");

printf("I want %d banana",1);

Sem sobrecarga, sem matrizes, simples e intuitiva (uma vez que você tenha compreendido os códigos de formato de string padrão). Alguns IDEs até informam se a string de formato não corresponde aos parâmetros opcionais.

2. Você deseja permitir o uso de padrões e mantê-los ocultos do usuário do método

sendEmail ("[email protected]");

O método sendEmail detecta que vários valores essenciais estão faltando e os preenche usando padrões definidos (subject, body, cc, bcc etc). A API é mantida limpa, mas flexível.

Uma nota sobre muitos parâmetros

No entanto, como outros afirmaram, ter muitos parâmetros obrigatórios para um método indica que você provavelmente tem algo errado com seu design. Isto é particularmente verdadeiro se eles compartilham o mesmo tipo, uma vez que eles podem ser trocados pelo desenvolvedor acidentalmente, levando a resultados estranhos em tempo de execução:

String myMethod(String x, String y, String z, String a, int b, String c, int d) {}

é um candidato ideal para a refatoração Introduce Parameter Object para criar

String myMethod(ParameterObject po) {}

class ParameterObject {
  // Left as public for clarity
  public String x;
  public String y;
  ... etc

}

Isso, por sua vez, pode levar a um melhor design com base em um padrão Factory com uma especificação fornecida como objeto de parâmetro.

    
por 30.11.2010 / 18:19
fonte
2

Um dos problemas com os parâmetros padrão em C # (estou pensando em DoSomething void (int x = 1)) é que eles são constantes. Isso significa que, se você alterar o padrão, terá que recompilar os consumidores dessa chamada de método. Embora isso seja fácil o suficiente, há ocasiões em que isso é perigoso.

    
por 08.05.2012 / 08:54
fonte
1

Depende do que seu código está fazendo. Se houver padrões sensatos, você deve usar parâmetros opcionais, mas se não houver padrões sensatos, adicionar parâmetros opcionais tornará seu código mais complicado. Em muitos casos, os parâmetros opcionais são uma ótima maneira de evitar verificações nulas e cortar a lógica de ramificação. O Javascript não tem parâmetros opcionais, mas existe uma maneira de emulá-los com || (lógico ou) e eu uso o tempo todo ao fazer coisas relacionadas a banco de dados, porque se o usuário não fornecer algum valor, então eu substituo meus próprios valores com a ajuda de || o que me poupa o trabalho de escrever um monte de afirmações se, então.

    
por 30.11.2010 / 21:01
fonte
1

Os parâmetros opcionais são uma ótima maneira de tornar as coisas simples coisas simples e complicadas possíveis simultaneamente. Se houver um padrão claro e razoável que a maioria dos usuários desejará, pelo menos em casos de uso rápido e sujo, eles não precisarão escrever o texto padrão para especificá-lo manualmente todas as vezes que chamarem sua função. Por outro lado, se as pessoas tiverem uma boa razão para querer mudá-lo, então ele precisa ser exposto.

Usar uma aula é IMHO uma solução terrível, pois é detalhada, ineficiente e inconsistente com o típico modelo mental do que uma classe faz. Uma função é a abstração perfeita para um verbo, ou seja, fazendo algo e retornando. Uma classe é a abstração certa para um substantivo, isto é, algo que tem estado e pode ser manipulado de várias maneiras. Se o primeiro deve ser o modelo mental do usuário da API, não torne isso uma classe.

    
por 01.12.2010 / 03:01
fonte
1

O problema com os argumentos opcionais é que as pessoas tendem a colocar mais e mais (e mais) argumentos na função, em vez de extrair o código relevante para uma nova função. Isso é levado ao extremo em php . Por exemplo:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC
                      [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
    
por 01.12.2010 / 00:03
fonte
1

Parâmetros opcionais são basicamente uma maneira diferente de sobrecarregar uma função. Então, isso basicamente se resume a: "está sobrecarregando uma função ruim"?

    
por 08.05.2012 / 10:03
fonte
1

Inicialmente adorei esse recurso em python e o usei para "estender" métodos já usados. E parecia agradável e fácil, mas logo voltou; porque quando eu adicionei um parâmetro opcional, isso estava modificando o comportamento de um método existente no qual o cliente antigo dependia e de uma maneira que não era detectada pelos casos de teste de unidade existentes. Basicamente, fazer isso está quebrando o Princípio do Fechado Aberto; código está aberto para extensão, mas fechado para modificação. Portanto, acredito que usar esse recurso para modificar o código existente não é uma boa ideia; mas tudo bem se usado desde o começo

    
por 01.03.2016 / 11:19
fonte
0

Acho que seria melhor sobrecarregar uma função com assinaturas diferentes (ou seja, parâmetros) do que usar parâmetros opcionais.

    
por 30.11.2010 / 18:43
fonte