Técnicas de programação em uso excessivo ou abusado [fechado]

38

Existe alguma técnica na programação que você considera excessivamente usada (o IE usou muito mais do que deveria) ou abusou, ou usou um pouco para tudo, embora não seja uma solução realmente boa para muitos dos problemas que as pessoas tentam resolver resolver com isso.

Pode ser expressões regulares, algum tipo de padrão de design ou talvez um algoritmo, ou algo completamente diferente. Talvez você pense que as pessoas abusam de várias heranças etc.

Anto
fonte
33
Concordo que o IE é usado de maneira muito mais excessiva do que deveria, mas isso é principalmente por não programadores. . .
Eric Wilson
7
@FarmBoy - Eu acho que ele quis dizer IE: "Ie" significa simplesmente "isso é", que escrito totalmente em latim é 'id est'.
Raphael
Corrigido agora :)
Anto 11/01
4
Qualquer técnica pode (e muitas vezes é abusada), ela apenas deve ser apresentada como a próxima bala de prata e você encontrará alguém que trata todos os problemas como um prego (para misturar metáforas).
ChrisF
8
@ Rapheal - eu estava brincando, é claro. Obrigado pela educação.
Eric Wilson

Respostas:

73

Comentários no Código

Eu só gostaria que os professores da universidade entendessem que não precisam ensinar seus alunos a escrever 10 linhas de comentários dizendo que o código a seguir é um loop for, iterando de 1 a um número de x. Eu posso ver isso no código!

Ensine-os a escrever o código de auto-documentação primeiro e depois os comentários apropriados sobre o que não pode ser adequadamente a auto-documentação em segundo. O mundo do software seria um lugar melhor.

Dan McGrath
fonte
26
O código de auto-documentação não é. Os professores também fazem isso para ensinar os alunos a conceituar o problema e como abordá-lo. Além disso, nunca vi ninguém reclamar de muita documentação. Advertência, pois a documentação está correta.
Woot4Moo 11/01
24
@ Woot4Moo: se você ler Clean Code, Fowler afirma claramente que a documentação desatualizada é pior do que nenhuma documentação e que todos os comentários tendem a ficar obsoletos e a migrar para longe do código que documentam. Todo esse livro é sobre como escrever código de auto-documentação.
Scott Whitlock
12
Ensiná-los a substituir os comentários pelo código seria um bom começo ...
Shog9
15
+1. Na verdade, eu vi o seguinte no código do mundo real: "loopVar ++; // incremento loopVar". AAAAAAAAAAAARRRRRGH!
Bobby Tables
7
@ Bill: Minha opinião é que você não precisa documentar estruturas genéricas de controle e lógica, mesmo que sejam relativamente complexas. Basicamente, qualquer coisa que um bom desenvolvedor que conheça o idioma possa resolver analisando o código não precisa ser comentado. por exemplo. Um conjunto de aninhados para loops com algumas quebras dentro deles, etc. Mas o que DEVE ser comentado é o raciocínio específico do aplicativo sobre o motivo pelo qual o código toma essas decisões: por exemplo. "Se um novo programador começar na empresa amanhã e analisar o código, o que faz sentido sem as dicas do comentário?"
Bobby Tables
57

O padrão de design singleton.

Claro, é um padrão útil, mas toda vez que um novo programador aprende sobre esse padrão, ele começa a tentar aplicá-lo em todas as classes que cria.

Raphael
fonte
Eu uso essa desculpa mal projetada para uma estrutura todos os dias. codeigniter.com/user_guide/libraries/email.html Eles acham que OOP está prefixando funções $this->. PHP é uma linguagem podre, então não posso esperar que os frameworks sejam excelentes.
Keyo 11/01
7
Eu acho que qualquer programador que implementa um singleton e não se arrepende, queimará em um inferno ardente pelos pecados que ele (ou ela) cometeu.
2
Eu implementei um singleton uma vez na minha carreira profissional (em um contexto de multitarefa) e tive que me arrepender pelo meu pecado, reescrevendo-o.
Spoike
3
Singletons podem ser úteis para algumas coisas, mas quase sempre são usados ​​quando não deveriam. Isso não significa que singletons nunca devem ser usados ​​- apenas porque algo é abusado não significa que não possa ser usado corretamente.
configurator
2
@Rapahel: É exatamente por isso que não acredito que estudar padrões de design seja uma coisa boa.
configurator
53

A coisa mais má para proteger a programação idiota. colocando tudo em uma tentativa de pegar e não fazer nada com a captura

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

Estremeço quando vejo uma tentativa que não faz nada e foi projetada para lidar com lógica idiota. Em geral, as capturas por tentativa são muito usadas, no entanto, em alguns casos, são muito úteis.

Nickz
fonte
4
O engraçado - acabei de editar um arquivo que faz isso centenas de vezes, e por boas razões. É um arquivo de teste de unidade, testando que vários métodos lançam uma exceção quando esperado. O bloco try contém uma chamada e um relatório "lançamento esperado não aconteceu". A exceção é esperada e correta, portanto, não há ação corretiva. Obviamente, os testes de unidade são um caso especial, mas eu tive casos semelhantes em código real. Bandeira vermelha, sim, mas não uma regra absoluta.
precisa saber é o seguinte
5
@ O caso descrito é uma condição rara. Outro em que consigo pensar é no código de registro - se o registro em si falhar, não faz sentido tentar registrar a exceção ou interromper o aplicativo.
dbkk
1
@dbkk - concordou com a condição da borda, e eu acrescentaria que quando você realmente precisa capturar uma exceção, mas não precisa de uma ação corretiva, adicione um comentário no bloco de captura para explicar que é essencial apenas para acalmar o mantenedores. Não é tão raro em testes de unidade, então eu deixaria de comentar nesse caso.
precisa saber é o seguinte
5
em erro retomar próxima
jk.
2
@ jk01 - uma exceção não é (necessariamente) um erro. Se alguma condição é um erro ou não, depende do contexto. Por exemplo, "arquivo não encontrado" não é um erro se você não precisar do arquivo. Talvez seja apenas um arquivo de configurações opcional que pode ou não estar presente, e você pode deixar seus padrões no lugar se o arquivo não estiver lá (portanto, nenhuma ação corretiva é necessária após a captura).
Steve314
47

Confie no StackOverflow para resolver seus problemas, em vez de descobrir da maneira mais difícil.

Novos programadores que encontram a riqueza de conhecimentos em SO (com muita frequência) publicam antes de pensar e experimentar.

Nos meus dias, tivemos que codificar livros, sem internet, sem SO. Agora saia do meu gramado.

Byron Whitlock
fonte
28
Devo admitir que me encolho com a audácia de algumas perguntas sobre SO. Ou porque são solicitadas várias vezes ao dia e obviamente não foram pesquisadas; ou pior, tratam a comunidade como um serviço de terceirização gratuito.
Orbling
2
@dbkk: stackoverflow.com/questions/4665778/… -> primeiro comentário "você já tentou isso?"
Matthieu M.
5
Comecei a aprender com os livros, mas uma vez que tive um fundamento, aprendi quase tudo o mais nas discussões do fórum on-line. Não perguntando, mas principalmente (e a princípio, exclusivamente) lendo. Esse método me ensinou várias linguagens de programação em profundidade excruciante (com muitos cantos e recantos), e acho que não é um método ruim.
Konrad Rudolph
1
@ Konrad Rudolph: Esse método é bom e sábio, lendo perguntas, procurando bem. A pergunta é melhor quando o solicitante possui uma estrutura para entender as respostas. Com demasiada frequência, as pessoas fazem perguntas que ainda não têm capacidade de compreender.
Orbling
3
O problema é que, portanto, incentive isso, dando um grande número de repetições por fazer / responder perguntas muito fáceis que podem ser respondidas com uma simples pesquisa no Google. pergunta muito difícil, as pessoas respondem apenas porque realmente querem.
IAdapter
36

OOP evidentemente. É muito valioso, mas quando mal utilizado , pode obscurecer o código claro com bastante facilidade (alguns exemplos de programação S4 em R vêm à mente) e pode gerar uma sobrecarga tremenda que é desnecessária e pode custar muito tempo no desempenho.

Outra coisa é que (em Perl, por exemplo) OOP geralmente se resume a escrever a mesma coisa de maneira inversa: em result = $object ->function(pars)vez de result = function(object, pars)Isso às vezes faz sentido, mas quando misturado à programação procedural, pode tornar a leitura do código bastante confusa. Além disso, você apenas introduz mais despesas gerais, onde não melhora o design. Tudo se resume ao que também é dito sobre o padrão singleton: deve ser usado, mas não em tudo.

Eu mesmo uso o OOP, mas no meu campo (computação científica) o desempenho é muito importante, e o OOP é frequentemente abusado lá, pois todos os alunos obtêm Java atualmente. É ótimo para lidar com problemas maiores, para conceituar e assim por diante. Mas se você trabalha com, por exemplo, seqüências de DNA no BioPerl, usar os objetos todas as vezes e trabalhar consistentemente com getters e setters pode aumentar o tempo de cálculo em dez vezes. Quando seu código está sendo executado por alguns dias, em vez de algumas horas, essa diferença realmente importa.

Joris Meys
fonte
6
@Craige: Eu mesmo uso OOP, mas no meu campo (computação científica) o desempenho é um grande negócio, e o OOP é frequentemente abusado lá, pois todos os alunos obtêm Java atualmente. É ótimo para lidar com problemas maiores, para conceituar e assim por diante. Mas se você trabalha com, por exemplo, seqüências de DNA no BioPerl, usar os objetos todas as vezes e trabalhar consistentemente com getters e setters pode aumentar o tempo de cálculo em dez vezes. Quando seu código está sendo executado por alguns dias, em vez de algumas horas, essa diferença realmente importa.
Joris Meys
1
@ Craig: O encadeamento de métodos (como Foo.DoX().DoY().DoZ()) é bom, mas, mas definitivamente não é a única maneira de fazer algo. Composição da função (like doZ . doY . doX $ fooé uma alternativa perfeitamente válida.
Anon. 11/11
1
@Joris: algo que eu me pergunto há muito tempo (eu mesmo um bioinformático): se o desempenho importa tanto, por que usar Perl em primeiro lugar, em vez de C ++? Se você está preocupado em eliminar um fator 10 do tempo de execução (preocupação válida!), A mudança para o C ++ oferece gratificação instantânea. Obviamente, a linguagem é péssima ... mas também Perl ... e existem boas bibliotecas de bioinformática para C ++.
Konrad Rudolph
1
@ Konrad: Depende. O BioPerl tem sem dúvida o maior número de pacotes para bioinformáticos de todas as línguas (eu acho que o Python está atualizando). Além disso, muito trabalho foi feito no Perl e a adaptação de um script é mais fácil do que reescrever tudo no C ++. Por fim, não serve para escrever um aplicativo completo quando um script for necessário. Acho que é por isso que Perl ainda está por aí. E honestamente, não me importo, gosto da linguagem. Ainda é o melhor que eu sei para o trabalho de cordas e arquivos. Os cálculos são obviamente feitos em outros idiomas e vinculados novamente (o que é bastante fácil).
Joris Meys
1
@ Konrad: depende de como se faz. É possível fazer tudo no Perl, mas o Perl pode ser facilmente vinculado a outras ferramentas, especialmente no Linux. Eu uso Perl frequentemente como um script básico de bash, com forte manipulação de strings e fácil construção de conjuntos de dados para serem descartados em outros aplicativos.
Joris Meys
27

Tendo passado vários anos em ASP.NET Webforms, eu teria que dizer inequivocamente:

A interface do usuário inteligente

Embora seja perfeitamente possível criar aplicativos testáveis ​​em camadas em formulários da web, o Visual Studio facilita demais para os desenvolvedores clicarem em um caminho para formulários fortemente vinculados à fonte de dados, com a lógica do aplicativo espalhada por todo o código da interface do usuário.

Steve Sanderson explica esse anti-padrão muito melhor do que eu em seu livro do Pro ASP.NET MVC:

Para criar um aplicativo Smart UI, o desenvolvedor primeiro cria uma interface do usuário, geralmente arrastando uma série de widgets da interface do usuário para uma tela e preenche o código do manipulador de eventos para cada clique possível no botão ou outro evento da interface do usuário. Toda a lógica do aplicativo reside nesses manipuladores de eventos: lógica para aceitar e validar a entrada do usuário, executar acesso e armazenamento de dados e fornecer feedback atualizando a interface do usuário. Todo o aplicativo consiste nesses manipuladores de eventos. Essencialmente, é isso que tende a sair por padrão quando você coloca um iniciante na frente do Visual Studio. Nesse design, não há separação de preocupações. Tudo é fundido, organizado apenas em termos dos diferentes eventos da interface do usuário que podem ocorrer. Quando regras lógicas ou comerciais precisam ser aplicadas em mais de um manipulador, o código geralmente é copiado e colado, ou certos segmentos escolhidos aleatoriamente são fatorados em classes de utilidade estática. Por tantas razões óbvias, esse tipo de padrão de design é freqüentemente chamado de antipadrão.

richeym
fonte
1
Uma GUI é pelo menos algum tipo de código de especificação que deve ser respeitado. Eu não acho que os programadores que ele descreve fariam melhor se fossem apresentados com um arquivo de texto em branco.
4
@ qpr, eu não sei sobre isso. Se eles tivessem um arquivo de texto em branco, talvez não pudessem fazer nada (o que poderia ser apenas um bônus).
Ken Henderson
Um dos muitos benefícios do uso do WPF é que a implementação do MVVM esmaga esse antipadrão em pedacinhos.
Robert Rossney
2
Mil vezes isso. Até vejo desenvolvedores .NET experientes contando com esse "padrão" porque é mais fácil do que entender ou se preocupar com a Separação de Preocupações. Mesmo que eles não usem os assistentes de arrastar e soltar, o "padrão" mais comum no desenvolvimento do .NET WebForms é fazer tudo nos eventos de code-behind e copiar / colar o código conforme necessário.
Wayne Molina
23

Vejo isso ocasionalmente e geralmente resulta de não entender completamente as expressões booleanas.

if (someCondition == true)
Corey
fonte
16
Ele tem a vantagem de tornar o código mais explícito
pemdas
7
Eu acho que uma olhada nesta pergunta está em ordem: programmers.stackexchange.com/questions/12807/…
gablin
5
Eu não faço isso, mas, sério, supere isso. Há muito pior por aí. :)
MetalMikester
4
Se você nomeou suas variáveis ​​corretamente, por exemplo, boolcomeçando com isor has, não precisa tornar seu código mais explícito = true.
Ninguém
3
@DisgruntledGoat porque não deveria estar em uso #
Corey
19

Reimplementar a funcionalidade principal (ou de outra forma fornecida), devido à ignorância de sua existência ou devido a uma necessidade percebida de customizações.

l0b0
fonte
2
Aprender é uma exceção. Ao estudar qualquer coisa, geralmente é benéfico "reinventar a roda".
Maxpm 19/01/19
Com certeza - eu deveria ter especificado que é relevante apenas ao criar software de produção.
L0b0
1
Isso é particularmente ruim ao implementar qualquer coisa relacionada à segurança. Um bom software de segurança evita ataques nos quais a maioria das pessoas nem pensa.
David Thornley
Eu vejo isso muito comum. Precisamos do X, vamos escrever o nosso! Mas e o pacote de código aberto Y? Não, precisamos de software personalizado para nossos segredos comerciais super-secretos, que são os mesmos de todos os outros em nosso setor, não podemos usar software comum de lixo!
Wayne Molina
18

Herança.

Não imponha um local onde não faça sentido.

Kit
fonte
6
O problema é que intuitivamente "is-a" parece fazer muito sentido (em particular porque toda relação de implementação / contrato pode ser coloquialmente expressa como "is-a"). Requer uma sólida compreensão do OOP para perceber que isso é realmente um erro e que a herança e a implementação da interface são fundamentalmente diferentes.
Konrad Rudolph
@ Konrad - concordo absolutamente. Tento encorajar as pessoas a começar com a composição , seguir para interfaces e considerar a herança por último. (Como regra geral, é claro). Mas talvez isso do meu VB falar fundo ... ;-)
Mike Woodhouse
1
Essa é, em grande parte, uma questão de design de linguagem. A razão pela qual você deve "preferir composição sobre herança (implementação)" em linguagens como Java ou C #, é porque a herança de implementação é péssima nessas linguagens. Algumas pessoas criticam a Construção de software orientada a objetos de Bertrand Meyer por uso excessivo de herança, mas quando você realmente olha para Eiffel (a linguagem usada no livro), percebe que ele foi projetado para herança de implementação e, portanto, não há problema em usar herança sobre composição. Em que caso, pelo menos.
Jörg W Mittag
14

Personalizando o software pronto para uso.

Embora reconheça que isso pode ser útil, pergunto-me quanto dinheiro é gasto na realização de pequenas coisas para obter ganhos questionáveis. É aqui que uma empresa pode gastar centenas de milhares, senão milhões de dólares, em licenças para alguns softwares que são personalizados porque são tão configuráveis, editáveis ​​e flexíveis que realmente não fazem muito por padrão. No final, é um aplicativo personalizado por causa de todo o novo código adicionado ao que foi comprado inicialmente.

JB King
fonte
Não é mais provável que isso ocorra com um aplicativo personalizado?
Jeffo
13

Usando o complier como um depurador.

Ignorando avisos complementares ou desativando-os completamente.

Variáveis ​​globais.

Pemdas
fonte
18
O que há de errado em "usar o compilador como depurador"? Ter um compilador capaz de apontar erros no seu código antes que eles se tornem um problema no tempo de execução é uma tremenda vantagem.
Mason Wheeler
3
Confio no compilador que captura meus erros de sintaxe e erros de correspondência de tipo incorretos. Para erros comportamentais, confio nos casos de teste.
gablin
5
O problema é quando você começa a depender do compilador para garantir a correção do programa. Isso compilou? Não, deixe-me remoer esta pequena seção e ver se isso foi corrigido. Compilou? Não, deixe-me adicionar um * aqui e ali e ver se compila. ... ect. Obviamente, é útil para corrigir erros de digitação
pemdas
2
Você diz isso como se o codificador estivesse bisbilhotando cegamente no escuro tentando fazer alguma coisa - qualquer coisa - para obter o código de alguma forma compilado. Não é assim que funciona o IME; o compilador fornece uma mensagem de erro útil e indica o local do erro e, geralmente, se algo não está compilando, é o novo código que você escreveu para você, então você tem uma boa idéia do que está errado e como corrigi-lo depois de apontado. Fora. (Embora se você está jogando * aleatório s ao redor, você pode estar trabalhando em C ++, onde os erros do compilador são conhecidos por serem extremamente inútil, então o que eu disse pode não se aplicar.)
Mason Wheeler
3
Confiar no compilador funciona muito bem, dado um sistema de tipos suficientemente forte e uma base de código bem digitada. Freqüentemente, o sistema de tipos pode modelar restrições importantes para as quais você precisaria escrever testes (por exemplo, em sistemas com tipos fracos). Então, usado criteriosamente, o compilador (e particularmente seu verificador de tipos) é um ótimo recurso para teste e depuração, e não há nada errado em confiar nele. Em particular, é errado dizer que um compilador pode mostrar apenas erros de sintaxe.
Konrad Rudolph
11

Todos os padrões de design.

Eles são como sal ou açúcar. Alguns deles na sua comida tornam ótima, muitos deles fazem sua comida ser uma merda.

Não me interpretem mal. Padrões de design são técnicas maravilhosas. Eu os usei bastante. Mas, às vezes, encontro programadores (alguns deles meus ex-chefes), que tiveram esses "você precisa usar um padrão de design", mesmo que não corresponda ao problema !!!

Um exemplo é o "Padrão do visitante", que é mais direcionado para "Coleções lineares / sequenciais". Eu tive que trabalhar com uma estrutura de dados em árvore, uma vez. Para "visitar" cada item, codifico um método sem padrão de design, e um ex-chefe insiste em usar ou adaptar o "Padrão de Visitante". Então, eu navego na net, para uma segunda opinião. Bem, outros programadores tiveram a mesma situação e a mesma solução. E chame-o de "Padrão de Árvore / Visitante Hierárquico"., Como um NOVO Padrão de Design

Espero que seja adicionado como um novo padrão aos existentes, em uma nova versão do livro "Design Patterns".

umlcat
fonte
3
Eu nunca uso padrões de design, embora eles às vezes surjam naturalmente no meu código.
configurator
Como vai o ditado? Você começa a usar padrões sem saber que os está usando, depois aprende sobre eles e os usa em todos os lugares, então eles se tornam uma segunda natureza, então você começa a usá-los sem saber que os está usando?
Wayne Molina
2
@ configurador Quando li sobre os padrões de design; Eu também descobrir que mim e para outros desenvolvedores que já usam alguns deles ;-)
umlcat
9

Usando exceções como controle de fluxo. Tipo de semelhante a esta resposta , mas diferente.

A deglutição de exceções é incorreta porque introduz erros misteriosos e difíceis de encontrar no código. O uso de exceções como controle de fluxo, por outro lado, é ruim porque torna o código muito mais ineficiente do que poderia ser e é conceitualmente desleixado.

O tratamento de exceções deve ser usado apenas para lidar com cenários realmente excepcionais (duh) e imprevistos, não com coisas como um usuário digitando um caractere alfabético em que um número é esperado. Esse tipo de abuso de exceção é extremamente comum entre programadores ruins no mundo Java.

Bobby Tables
fonte
Exceções para criar código ineficiente dependem do seu idioma - criando um quadro de pilha, etc. No Squeak, sua pilha é totalmente reificada, portanto não há diferença entre usar exceções ou não. (Em outras palavras, as exceções fazem parte da biblioteca, não do idioma.) No entanto, é confuso trabalhar com o fluxo de controle controlado por exceção: lshift.net/blog/2011/01/04/try-again-with-exceptions shows um loop usando exceções que eu encontrei recentemente.
precisa saber é o seguinte
Em relação ao último parágrafo, novamente, isso depende do seu idioma. Exceções ("condições") no Common Lisp são um superconjunto estrito das idéias de exceção da maioria dos idiomas. Veja exemplos aqui: gigamonkeys.com/book/… Como em tudo, você pode ir longe demais!
precisa saber é o seguinte
A legibilidade e a manutenção superam o desempenho. Os casos em que usarei exceções para obter sucesso (o que suponho que você queira dizer com "controle de fluxo") são muito raros, mas podem fornecer um código mais limpo, por exemplo, em uma pesquisa recursiva complexa. Em termos gerais, eu concordo. Por exemplo, eu tenho contêineres com métodos de iterador que retornam false por sair do intervalo (comum no final de uma iteração), mas lançam uma exceção se o iterador for "nulo" (um provável sinal de algum tipo de inconsistência interna)
Steve314
7

Eu irei com inflexibilidade através da ocultação excessiva de dados.

Todos sabemos que a abstração e a ocultação da implementação são boas, mas nem sempre mais é melhor. Exagerado, você pode obter um resultado inflexível que não pode lidar com alterações nos requisitos. Para lidar com a mudança, você não apenas precisa modificar a classe que precisa lidar com essa mudança, mas também precisa criar um caminho para que as informações que elas nunca precisavam antes sejam acessíveis, apesar das camadas ocultas de dados.

O problema é que, como em todos os problemas para encontrar o equilíbrio certo para cada contexto, é preciso experiência.

Steve314
fonte
6

Estado mutável e loops. Você quase nunca precisa deles e quase sempre obtém um código melhor sem eles.

Por exemplo, isso é obtido diretamente de um thread StackOverflow:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

Ambos estão fazendo a mesma coisa. Mas não tenho ideia do que eles estão fazendo. Felizmente, a pergunta realmente explica o que eles estão fazendo, então pude reescrevê-los da seguinte maneira:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

Não há loops nem estado mutável. Bem, ok, não explícito loops e sem contadores de loop.

O código tornou-se muito mais curto, muito mais simples, muito mais como uma descrição do que o código deveria fazer (especialmente no caso do Ruby, ele diz diretamente "agrupar as coisas por tipo") e muito menos propenso a erros. Não há perigo de executar o final da matriz, erros de barreira ou erros de um por um com os índices de loop e condições de finalização, porque não índices de loop e condições de finalização.

Jörg W Mittag
fonte
Eu acredito que na segunda linha do seu ECMAScript "fixo" deve ler-se (acc[thing.type] || (acc[thing.type] = [])), ao contrário de `= [coisa] , unless you want to add coisa` da lista duas vezes ... Ou estou faltando alguma coisa?
Austin Hyde
@ Austin Hyde: Você está certo.
Jörg W Mittag
1
Esse exemplo ecmascript é incompreensível para muitos programadores. Ele conta com muitos truques sintáticos. O loop tem a vantagem de ser óbvio para desenvolvedores juniores.
Joeri Sebrechts
6

Zombando. Introduz muitos requisitos artificiais para dissociação excessiva no seu código, leva a códigos de ravioli superengenharia e força o design no estilo OO pela garganta quando um design mais processual ou funcional pode ser uma solução mais simples para o seu problema.

dsimcha
fonte
Concordado em teoria; simulações são úteis, mas você não tem que tê-los.
Wayne Molina
A invasão da zombaria depende do idioma que você usa. Em C #, pode ser muito invasivo e adiciona jangadas de interfaces desnecessárias.
Frank Hileman
3

Programadores Delphi em todo o mundo descobriram nos últimos dois anos o quão ruim é usar matrizes de caracteres para armazenar bytes devido à conversão Unicode em adolescentes

E, "em breve", aprenderemos o quão ruim é armazenar números inteiros em listas quando queremos fazer a alteração para 64 bits.

Peter Turner
fonte
2
Eu acho que uma grande fração dos problemas Unicode nunca teria surgido se a Borland tivesse declarado um tipo DataString que era basicamente o mesmo que AnsiString, mas especificamente para uso com blobs, e depois garantisse que as pessoas soubessem disso.
Mason Wheeler
2

Propriedades. Sei que isso é controverso, mas sinto que as propriedades são amplamente usadas no .net.

Qual é a diferença entre essas duas linhas?

public string Property { get; set; }

public string Field;

Para o desenvolvedor, a diferença é: absolutamente nada. O formulário compilado é um pouco diferente; portanto, se você estiver escrevendo uma biblioteca, e essa biblioteca for atualizada em programas e não puder recompilar os programas (por exemplo, se estiver escrevendo uma interface para plugins que deve funcionar em versões do seu software), então você não deve usar campos públicos porque não pode substituí-los por propriedades. Em qualquer outro caso, não há absolutamente nenhuma diferença entre usar um campo ou uma propriedade automática sem modificadores.

configurador
fonte
1
Acordado; se você souber 100%, nunca precisará fazer nada para obter / definir uma "propriedade", então não há razão alguma para ter uma propriedade. No entanto, se houver uma chance de você precisar fazer algo (registrando que um valor foi alterado, por exemplo), use uma propriedade. Pessoalmente, não vejo uma diferença grande o suficiente para não usar a propriedade, apenas no caso de você fazer necessidade de modificá-lo mais tarde (eu sei, eu sei YAGNI, mas sinto-me desviar, neste caso, não custa nada)
Wayne Molina
2
@Wayne: Como está mudando ;para{ get { ... } set { ... } } mais trabalho do que mudar { get; set; }para { get { ... } set { ... } }?
configurator
Agora que penso nisso, esse é um ponto justo.
Wayne Molina