Valores padrão - eles são bons ou maus?

12

A pergunta sobre valores padrão em geral - valores de função de retorno padrão, valores de parâmetro padrão, lógica padrão para quando algo está faltando, lógica padrão para tratamento de exceções, lógica padrão para tratamento de condições de borda etc.

Por um longo tempo, considerei os valores padrão uma coisa "pura maldade", algo que "encobre a catástrofe" e resulta em um erro muito difícil de encontrar. Mas, recentemente, comecei a pensar nos valores padrão como uma espécie de dívida técnica ... o que não é uma coisa ruim, mas algo que poderia fornecer algum "financiamento de curto prazo" nos leva a sobreviver ao projeto (quantos de nós poderiam pagar comprar uma casa sem tirar a hipoteca?).

Quando digo um "curto prazo" - não quero dizer - "faça algo rapidamente primeiro e refatore-o mais tarde, antes que atinja a produção". Não - estou falando de confiar em valores padrão codificados em um software de produção. Concedido - isso pode causar alguns problemas, mas e se apenas causar um único problema em um ano inteiro.

Novamente - eu estou falando sobre o software convencional "médio" aqui (não é um software para uma usina nuclear) - o site médio ou um aplicativo de interface do usuário para o software de contabilidade, o que significa que a vida das pessoas não está em jogo, nem milhões de dólares .

Novamente, pela minha experiência, os usuários corporativos preferem viver com o software que "funciona de alguma forma", em vez de esperar por um perfeito. E o uso de valores padrão ajuda muito se você desenvolver um software no estilo RAD. Mas novamente: as sessões de depuração mais longas que passei foram por causa dos erros introduzidos por um valor padrão que deixou de ser "padrão" ao longo do caminho ou porque um pequeno subsistema foi atualizado recentemente e, como resultado dessa atualização, não é manipule o padrão corretamente (por exemplo, lista vazia vs nulo ou seqüência nula vs seqüência vazia).

Então, minha pergunta é - os valores padrão são bons ou maus. E se eles são uma dívida técnica - como medir quanto você pode emprestar para poder pagar os reembolsos?

Realmente apreciaria qualquer entrada.

Felicidades.

EDITAR:

Se estou usando os valores padrão como uma maneira de cortar os cantos durante o desenvolvimento - e se o corte dos cantos resultar em bugs e problemas - qual é a metodologia para recuperar esses problemas?


fonte

Respostas:

23

O conceito de Convenção sobre configuração é impossível sem valores padrão sensíveis . A palavra-chave aqui é "sensata". Os valores padrão precisam fazer sentido para pelo menos 80% (se não mais) de todos os usos de uma biblioteca / serviço / estrutura.

Regras gerais gerais:

  • Se um valor for sensível para 80% ou mais usos, ele precisará ser um valor padrão
  • Se não houver valores usados ​​na maioria dos casos, não use padrões.
  • Os valores padrão evitam erros estúpidos do código de instalação. Se os padrões são razoáveis ​​para a maioria dos casos, menos pessoas mexem com a configuração de trabalho.
  • Configurações não padrão são mais visíveis quando você usa padrões.
  • Padrões ruins são piores que nenhum padrão.

Essencialmente, depois de aprender como a configuração padrão funciona, você pode tomar decisões informadas sobre como / quando fazer configurações não padrão.

Berin Loritsch
fonte
Obrigado por me indicar o conceito "Convenção sobre configuração". Eu usei sem saber que tem um nome. Você pode explicar esta regra: "Configurações não padrão são mais visíveis quando você usa padrões". por favor.
3
@ Andrew, se houver uma dúzia de chamadas Foo()e uma chamada Foo("bar"), essa chamada tende a se destacar e, portanto, é mais visível.
Matthew Scharley 31/03
1
Certo, e se a maioria dos usos de um serviço FTP usar new FtpService()o que define uma porta alternativa, será destaque ( service.SetPort(12345)).
Berin Loritsch 31/03
43

Tomemos, por exemplo, uma biblioteca que implementa o protocolo FTP. Por padrão, espera-se que o FTP opere na porta 21. Agora, ficaria muito irritado se tivesse que especificar o uso da porta 21 toda vez que construir um objeto de uma classe FTP aleatória. Se eu precisar de uma porta diferente, deixe-me especificar.

Os padrões são perfeitamente bons quando são padrões saudáveis.

Htbaa
fonte
21
+1. Quando foi a última vez que você digitou http://programmers.stackexchange.com:80/questions/?sort=newest&pagesize=50em uma barra de endereço?
Jörg W Mittag 31/03
1
Então, como você mede / estima / afeta um nível de sanidade da variável padrão.
5
Quanto tempo leva para pensar em um valor padrão razoável.
Alexander Gessler 31/03
1
@ Andrew, veja minha resposta abaixo. Se um valor é bom para 80% ou mais usos, é um bom padrão.
Berin Loritsch 31/03
2
@Berin Loritsch: Se o valor padrão for usado por falhar com segurança, você poderá argumentar que é bom mesmo quando usado apenas 1% do tempo.
Oosterwal
18

Você provavelmente está usando um layout de teclado padrão com mapeamentos de teclas padrão, mapeamentos de botões do mouse padrão, o navegador padrão, digitando no idioma padrão do sistema, inicializando no sistema operacional padrão no carregador de inicialização, menus posicionados padrão, esquema de cores padrão e fonte padrão largura / altura / face / estilo, conjunto de caracteres padrão, resolução padrão do monitor, padrão ... você entendeu.

Mas, com toda a seriedade, acho que a preocupação que você está tendo não é com os padrões, mas com outra coisa. O comportamento padrão não mascara de forma inerente os erros. Na maioria das vezes, seu código será executado em condições comuns de qualquer maneira, independentemente de você definir ou não os padrões. Casos não controlados são coisas que você deseja evitar, independentemente (presumivelmente através de testes adequados e adequados), para quando os padrões forem alterados ou um cenário incomum.

Além disso, o tratamento de exceção "catch-all" é sem dúvida uma falha de design, e não qualquer coisa que você possa chamar de "padrão".

Rei Miyasaka
fonte
OK, "pegar tudo" na verdade é um bom exemplo. Sim - está causando muita dor quando algum dia algo está errado por algum motivo desconhecido, e esses "alguns-s" são desconhecidos em grande parte porque a exceção real foi perdida em um bloco abrangente. Então é uma coisa ruim - certo? Por outro lado - sem um bloco genérico, o software pode estar morrendo completamente (se a exceção não for tratada) ou exigiria uma lógica complicada de tratamento de erros (pelo menos, seria necessário registrar a exceção e inicializar alguns dados com um valores padrão).
Então, para adicionar à minha pergunta original - se estou usando os valores padrão como uma maneira de cortar os cantos durante o desenvolvimento - e se o corte dos cantos resultar em bugs e problemas - qual é a melhor maneira de recuperar esses problemas?
1
No que diz respeito às exceções, há um artigo que diz que deve haver uma exceção geral por segmento , se houver alguma. Seria usado para o relatório de erros, então você está vendo o programa como uma "coisa" única, da mesma forma que o sistema operacional visualizaria um processo. Como você tem o usuário final (e, esperançosamente, os desenvolvedores), não está realmente "engolindo" a exceção - por isso é tudo de bom. O artigo aqui: codeproject.com/KB/architecture/exceptionbestpractices.aspx
Rei Miyasaka
1
Quanto ao uso de padrões para evitar erros - que tal usar um comentário consistente pelo qual você possa controlar + f / mac + f? Por exemplo, o Visual Studio mostra realmente qualquer comentário que comece TODO: or TEMP:na lista de tarefas. Se eu estiver abrindo um caminho pelo desenvolvimento, tento ser extremamente cuidadoso para garantir que coloque um TODO lá - então, de vez em quando, faço um "encontrar tudo" para voltar e garantir nada disso entra em compilações importantes.
Rei Miyasaka 02/04
Opa, eu quis dizer usar valores codificados para ajudar no desenvolvimento. A propósito, acabei de perceber que "valores codificados" é provavelmente a palavra que você está procurando, em vez de "valores padrão".
Rei Miyasaka 02/04
3

Os padrões devem ser usados ​​quando eles salvam o usuário ou desenvolvedor de executar tarefas repetitivas. Eles nunca devem ser usados ​​para mascarar erros ou exceções. Não é uma prática ruim usá-los para evitar erros, mas apenas desde que a prevenção não oculte que algo de ruim está acontecendo. Os valores padrão são uma ferramenta como todo o resto. Quando usados ​​adequadamente, você pode economizar muita dor de cabeça e tempo. Utilizados indevidamente, podem derrubar a casa inteira.

Joel Etherton
fonte
Mais ou menos como C ++ assoar o off perna inteira ...
Mateen Ulhaq
1
@muntoo: Ei, Lisp me deu um coxo de volta em 2003.
Joel Etherton
2

A causa raiz dos problemas citados não são os valores padrão propriamente ditos, mas os problemas de integração devido a alterações nos contratos de interface, mal-entendidos de interpretação e / ou suposições inválidas. Basicamente, todos esses (exemplos específicos) parecem resultar de comunicação inadequada - entre cliente e desenvolvedor ou entre diferentes desenvolvedores / equipes. Justamente, esses problemas podem se manifestar como valores padrão inválidos, mas também de inúmeras outras formas.

Lidar com a causa raiz, não o sintoma.

E observe também que, como outros salientaram com excelentes exemplos, os valores padrão, quando usados ​​com sabedoria, podem facilitar significativamente a vida dos usuários. E esse é o objetivo final, não é?

Péter Török
fonte
"Comunicação inadequada" pode ser a causa raiz, mas não é uma causa raiz para praticamente nada? E como "meu objetivo final" é fornecer um software "suficientemente bom" dentro do prazo em um ambiente com custos limitados, eu queria saber como diferenciar os padrões ruins / ruins dos bons.
@ Andrew, a comunicação (ou a falta dela) é um fator importante no sucesso / fracasso de um projeto, mas está longe de ser o único. No entanto, quando é o culpado, deve ser tratado adequadamente, caso contrário, seu projeto está quase certamente condenado. Não conheço nenhuma ferramenta mágica para separar padrões ruins de bons: o IMHO exige uma análise cuidadosa do domínio do problema, casos de uso etc. e, assim, muita comunicação.
Péter Török 02/04
0

Os valores padrão que não fazem parte do protocolo / convenção de comunicação são maus. Por "não fazer parte", quero dizer que eles não estão documentados onde o protocolo é rigoroso, ou simplesmente não são esperados, onde o protocolo está solto.

Se o valor padrão é documentado / esperado, ainda pode ser ruim, mas também pode ter vidas seguras. Depende da área do domínio. Muitas vezes, eles podem ser muito perigosos (por exemplo, dosagem padrão do remédio, piso padrão do elevador, direção do movimento do carro) e, às vezes, pode ser perigoso não tê-los (por exemplo, direção do movimento do carro, horário padrão da reunião).

astef
fonte