Quais são as cinco coisas que você odeia no seu idioma favorito? [fechadas]


403

Ultimamente, tem havido um grupo de ódio por Perl no Stack Overflow, então pensei em trazer minha pergunta " Cinco coisas que você odeia no seu idioma favorito " para o Stack Overflow. Pegue o seu idioma favorito e me diga cinco coisas que você odeia. Isso pode ser algo que apenas o incomoda, admitiu falhas de design, problemas de desempenho reconhecidos ou qualquer outra categoria. Você só tem que odiar, e tem que ser o seu idioma favorito.

Não compare com outro idioma e não fale sobre idiomas que você já odeia. Não fale sobre o que você gosta no seu idioma favorito. Eu só quero ouvir as coisas que você odeia, mas tolera, para poder usar todas as outras coisas, e quero ouvir sobre o idioma que você gostaria que outras pessoas usassem.

Eu pergunto isso sempre que alguém tenta colocar seu idioma favorito em mim, e às vezes como uma pergunta de entrevista. Se alguém não consegue encontrar cinco coisas para odiar sobre sua ferramenta favorita, ele não a conhece bem o suficiente para advogá-la ou receber grandes quantias em dinheiro usando-a. Ele não o usou em situações diferentes o suficiente para explorá-lo completamente. Ele está defendendo isso como uma cultura ou religião, o que significa que, se eu não escolher sua tecnologia favorita, estou errado.

Eu não me importo muito com qual idioma você usa. Não quer usar um idioma específico? Então não. Você passa pela devida diligência para fazer uma escolha informada e ainda não a usa? Bem. Às vezes, a resposta certa é "Você tem uma equipe de programação forte, com boas práticas e muita experiência em Bar. Mudar para Foo seria estúpido".


Essa é uma boa pergunta para revisões de código também. As pessoas que realmente conhecem uma base de código terão todo o tipo de sugestões e as que não a conhecem tão bem têm queixas inespecíficas. Eu pergunto coisas como "Se você pudesse começar de novo neste projeto, o que faria de diferente?" Nesta área de fantasia, usuários e programadores reclamam de tudo e de tudo que não gostam. "Quero uma interface melhor", "Quero separar o modelo da visualização", "Eu usaria este módulo em vez deste outro", "Renomearia esse conjunto de métodos" ou o que eles realmente não não gosto da situação atual. É assim que eu entendo o quanto um desenvolvedor em particular sabe sobre a base de código. Também é uma pista sobre quanto do programador '

O ódio não é a única dimensão de descobrir o quanto as pessoas sabem, mas eu achei uma boa. As coisas que eles odeiam também me dão uma pista de como eles estão pensando sobre o assunto.


11
Esta é uma ótima reviravolta na antiga questão "seu idioma favorito". Boa justificativa.
Tom Leys

14
Acho interessante que, apesar de a SO ter um grande público .NET, no momento em que escrevo este artigo, existem 24 respostas, das quais apenas uma (minha) é sobre .NET ou uma linguagem .NET. Eu não tenho idéia o que isso diz sobre SO ou .NET, mas é interessante ...
Jon Skeet

22
Nos primeiros 15 anos de programação com C / C ++, eu odiava (em ordem alfabética): 1. Ponteiros 2. Ponteiros 3. Ponteiros 4. Ponteiros 5. Ponteiros
ileon 10/10 /

4
Pergunto-me quantos comentários as pessoas feitas sobre odiando sua língua de escolha, porque eles não entendem como programa em sua língua de escolha ....
Kris.Mitchell

3
Esta é uma pergunta fantástica. Se você está se perguntando como é esse idioma, ler 3 respostas diferentes sobre o assunto nesta página seria facilmente a melhor informação útil pelo tempo gasto que você pode encontrar. Também é uma ótima maneira de avaliar os níveis de experiência (e humildade) de um programador, se você já conhece o idioma.
Jrandom_hacker

Respostas:


182

Cinco coisas que eu odeio em Java:

  • Não há funções de primeira classe.
  • Nenhuma inferência de tipo.
  • Falta de padrões saudáveis ​​em gráficos, por exemplo.
  • NullPointerException não contém mais informações sobre o que é nulo.
  • A proliferação de estruturas inúteis "configuráveis" / interfaces de provedor de serviços / classes de fábrica / sistemas de injeção de dependência. A configurabilidade quase nunca é usada, o DRY é violado de forma flagrante e o código quadruplica em tamanho e metade em legibilidade.

Eu sei, eu deveria dar uma olhada no Scala.


7
@ ambos: O NPE é mostrado na primeira linha do transe da pilha. Ele contém a classe (na maioria das vezes) classe, nome do arquivo java e número da linha como: "em your.faulty.code.Instance (Intance.java:1234)" Em seguida, basta abrir esse arquivo, vá para a linha e lá está ou seja, uma variável que não tem nada atribuído a ela.
OscarRyz 25/06/2009

35
@ Oscar Reyes - Er, nós sabemos disso. Mas pode haver várias variáveis ​​nessa linha, e a mensagem de exceção não me diz qual é nula.
Zarkonnen 24/10/09

10
Scala também tem verrugas. No entanto, é incrivelmente melhor que o Java.
wheaties 19/12/2009

10
+1 para a proliferação de frameworks, etc. #
Erich Kitzmueller 16/02/10

6
@Valentin, imagine a diversão da NullPointerException em um arquivo de log gigantesco de uma corrida noturna e você precisa descobrir o que aconteceu ... Depurar não é uma opção.
Thorbjørn Ravn Andersen

216

Uau, estou surpreso que o SQL ainda não tenha chegado aqui. Acho que isso significa que ninguém ama :)

  • Sintaxe inconsistente nas implementações
  • Diferenças sutis de código podem ter implicações enormes no desempenho por razões aparentemente obscuras
  • Suporte deficiente para manipulação de texto
  • Custo de entrada fácil, mas curva de aprendizado acentuada para dominar o idioma
  • Padronização mínima em toda a comunidade para práticas recomendadas, isso inclui estilo de sintaxe.

... E algumas razões bônus para odiá-lo, sem nenhum custo extra

  • a cláusula WHERE vai por último, facilitando a execução precoce de um UPDATE ou DELETE, destruindo toda a tabela. Em vez disso, o WHERE deve ir para algum lugar na frente.
  • É difícil implementar a divisão relacional.
  • Posso definir um valor como NULL, mas não posso testá-lo quanto à igualdade com NULL. Posso verificar IS NULL, mas isso apenas complica o código - desnecessariamente, na minha opinião.
  • Por que precisamos re-especificar completamente a fórmula de uma coluna GROUPed, em vez de definir um alias na coluna e, em seguida, GROUP BY o alias (ou índice da coluna como no SORT)?

7
Talvez ninguém possa aprender a amá-lo até que pare de pensar nisso como uma língua. :)
Alan Moore

4
+1 para tudo. E as pessoas ainda perguntam por que eu vou colocar-se com as dores de cabeça de ORM ...
James Schek

2
@ Alan M ... não é isso que o L significa? :)
Kev

29
Não consigo entender por que a sintaxe do INSERT é tão diferente de UPDATE. E MERGE é incompreensível.
LaJmOn

3
A necessidade de IS NULL deve ser clara, se você considerar que NULL é um terceiro resultado possível, logo após TRUE e FALSE. Como seu significado é "desconhecido", você não pode dizer se algo que é desconhecido corresponde a outra coisa que também é desconhecida. Outro exemplo: se NULL for igual a NULL, isso significaria que todo o conceito de criação de JOINs seria impossível, pois qualquer valor NULL poderia corresponder a outro valor NULL. Se você entender isso (o que também é chamado de lógica ternária), poderá entender o motivo da introdução do operador "IS" para testar contra NULL.
26810 Alex

159

JavaScript :

  1. Todas as coisas mais legais são incrivelmente complexas, mas toda a legalidade também é envolvida em uma quantidade tão pequena de código que você se sente estúpido por ter dificuldades em segui-lo

  2. '+' é uma escolha absurda de operador para concatenação em uma linguagem de tipo fraco. Eles estavam tentando assustar os noobs?

  3. É um campo minado de compatibilidade entre navegadores (não importa se está ativado ou não)

  4. Geralmente não é confiável - associado a escárnio, como bloquear o botão Voltar, pop-ups que nunca morrem etc.

  5. É quase impossível depurar, porque existem apenas algumas mensagens de erro diferentes e alguns tipos diferentes (Número, String, Objeto etc.)

Se não fosse pelo jQuery, provavelmente ainda o odeio tanto quanto costumava :)


15
Eu concordo com o mausch. O ECMAscript por si só é uma linguagem bonita e poderosa. São os navegadores traquinas (: tosse: IE) que atrapalham seu nome.
TJ G

32
@Mausch: onde o javascript mora na grande maioria dos casos? Você está dizendo o equivalente a "carros não contribuem para o aquecimento global, é dirigir carros que faz isso" - é verdade, é claro, mas está errado - o que mais você faz com um carro?
jTresidder

20
@ Chris: Sim, "+" é um bom operador de concatenação em uma linguagem fortemente tipada (como Python). Em uma linguagem de tipo fraco (como Javascript ou C), é terrível; decide (silenciosamente!) que 'soma:' + 2 + 3 não é 'soma: 5', mas 'soma: 23'. Alguém com mais experiência em Javascript pode dar melhores exemplos.
#

5
Sim, C é fracamente digitado, comparado com, digamos, Python (por exemplo, você pode atribuir números inteiros a chars, converter qualquer coisa em qualquer coisa via ponteiros void *, etc.) É digitado estaticamente em vez de digitado dinamicamente e também requer digitação explícita em vez de inferência de tipo, mas essas não estão relacionadas à digitação forte v / s fraca. [Exemplos aleatórios: Python tem tipagem forte dinâmica implícita, Haskell tem tipagem forte estática (opcionalmente explícita), Java tem tipagem forte explícita (principalmente estática), C tem tipagem estática explícita (relativamente fraca).] "Tipicamente fortemente" e "tipicamente fraco "na verdade não são bem definidos.
ShreevatsaR

5
@ShreevatsaR O exemplo clássico é: '3'+'2'='32', '3'-'2'=1.
Thomas Ahle 25/05

148

PHP:

1) Obriga-me a fazer variáveis ​​desnecessárias:

$parts = explode('|', $string);
$first = $parts[0];

2) Uma implementação de lambdas tão ridícula que é aproximadamente equivalente a usar eval()e tão terrivelmente errada que eu nunca a usei (consulte http://www.php.net/create_function ).

3) Um sistema try / catch que pode capturar apenas cerca de 80% dos erros que podem ocorrer.

4) O suporte ao Regex é tão coxo quanto o suporte ao lambda, porque ele precisa ser escrito em cadeias regulares, tornando uma das ferramentas de programação mais difíceis de aprender cerca de três vezes mais difícil. E o PHP deveria ser uma linguagem "fácil"?!?!?

5) Não há como extrair com segurança coisas de $ _POST sem escrever duas vezes ou criar sua própria função ou usar o operador '@':

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6) Resposta de bônus: '@'. Se você não pode se incomodar em escrever seu código corretamente, basta adicionar '@', o que é ruim para quem precisar depurar seu código posteriormente.


44
what about list ($ first) = explode ('|', $ string); ?
mlarsen 12/11/08

44
Idealmente, eu gostaria de usar alguma função (explode ('|', $ string) [0]);
php demais php

8
Que escopo variável estranho? Ter tudo local e forçar você a declarar quando deseja usar um global é uma boa idéia, evita que os noobs criem funções que usam apenas globais, em vez de usar argumentos e valores de retorno como deveriam.
scragar 10/09/09

24
você esqueceu funções com a ordem parâmetro mudando aleatoriamente
dusoft

39
Você esqueceu o verboNome, verbo-nome, substantivo_verbo, substantivoverbo, verbo-substantivo, substantivoVerbo, etc> _>
Warty

135

C ++

  • É muito fácil corromper aleatoriamente a memória e criar bugs quase impossíveis de encontrar (embora Valgrind se esforce muito para corrigir isso).
  • Mensagens de erro do modelo.
  • Ao usar modelos, é fácil acabar tendo que incluir tudo em um arquivo e obter tempos de compilação estúpidos.
  • A biblioteca padrão é uma piada na era moderna (ainda não há threads ou rede por padrão?)
  • Muitos bits desagradáveis ​​de C cutucando (em particular, todas as conversões entre short / int / unsigned / etc.)

13
Concordo com o STL, mas vou dizer o que é não é muito bom.
Bernard

22
unicode. respeito a simplicidade da ASCII, mas, pelo amor de Deus, estamos no século XXI agora.
wilhelmtell

29
A correção @Kieveli const é, na verdade, uma das coisas que mais sinto falta ao programar em outros idiomas. particularmente os de tipo dinâmico. o raii é um grande recurso que muitas vezes sinto falta também.
11139 wilhelmtell

6
A maioria dos problemas de C ++ vem do padrão ISO e fica bloqueada por 10 anos.
Graham.reeds

7
+1 "Mensagens de erro do modelo".
João Portela

129

C # / .NET:

  • As aulas devem ser seladas por padrão
  • Não deve haver nenhuma lockinstrução - em vez disso, você deve ter objetos de bloqueio específicos e métodos como os Acquireque retornam tokens de bloqueio descartáveis. Corolário: não deve haver um monitor para cada objeto.
  • GetHashCode()e Equals()não deve estar dentro System.Object- nem tudo é adequado para hash. Em vez disso, tem um IdentityComparerque faz a mesma coisa, e manter os IComparer<T>, IComparable<T>, IEqualityComparer<T>e IEquatable<T>as interfaces para comparações personalizados.
  • Fraco apoio à imutabilidade
  • Maneira ruim de descobrir métodos de extensão - deve ser uma decisão muito mais consciente do que apenas o fato de eu estar usando um espaço para nome.

Aqueles estavam fora do topo da minha cabeça - pergunte-me amanhã e eu vou apresentar outros 5 :)


22
Selado por padrão: a herança deve ser projetada em uma classe (que leva tempo e limita as opções futuras) ou proibida. hashCode / equals: suga também em Java. Um dia vou escrever um longo post sobre isso. Leia Java eficaz para obter detalhes sobre por que é igual a difícil nas cadeias de herança.
Jon Skeet

88
Selar por padrão significa que você pensou em todos os possíveis motivos que alguém deseja herdar de sua classe e que você não acha que algum deles faça sentido. Desculpe, mas nenhum de nós é tão inteligente.
Ed S.

69
Nesse caso, não sou inteligente o suficiente para você derivar do meu código: porque não posso prever quais mudanças futuras eu poderia fazer e que poderiam quebrar seu código. Esse é um problema muito significativo, IMO. A vedação do código é mais restritiva, mas gera mais liberdade e robustez de implementação.
Jon Skeet

11
Não acredito que ninguém tenha mencionado a sintaxe "ir para o caso", odeio esse!
Aistina 9/12/08

20
É bom que Jon Skeet não tenha criado C #, ou minha lista seria "1. classes são seladas por padrão; 2. bloqueio é muito complicado; 3. a maioria dos objetos não é lavável"!
Gabe

113

C

  • manipulação de cordas.

Ter que lidar manualmente com os buffers de cadeia de caracteres é um problema propenso a erros. Como muita computação está realmente movendo e modificando seqüências de caracteres (os computadores não são usados ​​tanto para grandes trituradores de números quanto as pessoas pensavam que estariam há muito tempo), é muito bom poder usar linguagens gerenciadas ou a string do C ++ objetos para lidar com isso. Quando eu tenho que fazer isso em linha reta C, parece nadar na areia movediça.


50
Acordado. A manipulação de cadeia é o item 1 a 5 de coisas que eu odeio em C.
BoltBait

11
Basta usar a biblioteca de cordas seguras do DJB ou algo assim. A manipulação de XML é difícil na maioria dos idiomas, e muitos programas fazem manipulação de XML, mas você não vê muitas postagens dizendo "O Perl está totalmente quebrado porque não suporta nós DOM como um tipo de dados primitivo". Eles usam uma biblioteca.
Steve Jessop

5
A manipulação de string C é péssima, mas no que diz respeito a problemas de linguagem, não é o pior.
19337 Chris Lutz

3
strcat para concatenar, mas aguarde ... o destino tem espaço suficiente ... ok, é necessário inserir a instrução if para verificar ... mas aguarde, e se minha string estiver na pilha? Ok, deve manter uma variável em torno de manter o controle de tamanho ... E isso pode ir sobre e sobre e sobre ...
blwy10

4
Precisamos de um thread para cinco coisas que nós não odeio em C ...
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

94

Que tal cinco coisas que eu odeio nas listas "Coisas que eu odeio em algum idioma"? : D

5- Pintar um vermelho laranja não o torna uma maçã.

Quando uma linguagem é projetada, os designers geralmente têm em mente o que é útil. Usá-lo para algo completamente diferente pode funcionar, mas reclamar quando não é apenas burro. Veja o Python. Tenho certeza de que alguém tem ou alguém algum dia criará um utilitário para criar exe's a partir do código Python. Por que diabos você gostaria de fazer isso? Seria legal - não me interpretem mal - mas não adianta. Então pare de reclamar!

Um projeto bem projetado provavelmente conteria código de vários idiomas. Isso não quer dizer que você não pode concluir um projeto com apenas um idioma. Alguns projetos podem estar dentro das habilidades de qualquer idioma que você esteja usando.

4- Você está de pé com pernas de madeira?

A plataforma pode ser uma grande influência do que o idioma pode fazer. Hoje em dia, os coletores de lixo, ou até mesmo as tentativas iniciais de "coleta de lixo", podem ajudar na perda de memória (talvez mais memória RAM?). Os computadores são mais rápidos e, é claro, esperamos mais das nossas línguas. E, francamente, provavelmente deveríamos. No entanto, existe um preço enorme a pagar pela conveniência do compilador de criar tabelas de hash ou seqüências de caracteres ou uma variedade de outros conceitos. Essas coisas podem não ser herdadas da plataforma em que são usadas. Dizer que eles são fáceis de incluir em um idioma apenas me diz que você pode não ter uma perna para se apoiar.

3- Quem é realmente a culpa?

Insetos. Você sabe. Eu amo insetos. Por que eu amo insetos? Porque isso significa que eu consigo manter meu emprego. Sem bugs, haveria muitas pizzarias fechadas. No entanto, os usuários odeiam erros. Mas aqui está um pouco de água fria. Todo bug é culpa dos programadores. Não é o idioma. Uma linguagem com uma sintaxe tão rígida que reduziria significativamente quantos erros eram possíveis de gerar seria uma linguagem completamente inútil. Suas habilidades provavelmente poderiam ser contadas por um lado. Você quer flexibilidade ou poder? Você tem bugs. Por quê? Porque você não é perfeito e comete erros. Veja um exemplo realmente identificável em C:

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

Todos sabemos o que isso vai fazer. No entanto, o que talvez alguns de nós não percebemos é que essa funcionalidade pode ser muito benéfica. Dependendo do que você está fazendo. A saturação de buffer é o custo dessa funcionalidade. Esse código acima. Se eu realmente divulgasse isso ao público. É isso mesmo .. diga comigo .. "Minha culpa". Não C por me permitir fazê-lo.

2- Não devemos colocar isso na lixeira?

É muito fácil apontar para um recurso em um idioma que não entendemos porque não o usamos frequentemente e o chamamos de estúpido. Reclame que está lá etc. Goto sempre me diverte. As pessoas sempre se queixam de estar em um idioma. No entanto, aposto que seu último programa incluiu um tipo de goto. Se você já usou uma pausa ou uma continuação, usou um goto. É isso que é. É verdade que é um jogo "seguro", mas é o que é. Goto tem seus usos. Se gotos "implícitos", como continuar ou interromper, são usados ​​ou gotos explícitos (usando a palavra-chave real "goto" para qualquer idioma). Não que os desenvolvedores de idiomas sejam impecáveis, mas normalmente ... se a funcionalidade existe desde o início dos tempos (para esse idioma). Provavelmente esse aspecto é uma qualidade definidora dessa linguagem. Significado .. é ' está sendo usado e provavelmente não está disponível por causa da compatibilidade com versões anteriores. Está sendo usado hoje. Como em 5 minutos atrás. E usado corretamente. Bem ... indiscutivelmente alguém está usando isso de forma inadequada também, mas isso está relacionado ao # 3 da minha lista.

1. - Tudo é um objeto.

Ok .. este é realmente um subconjunto de # 2. Mas essa é de longe a queixa mais irritante que vejo nas listas de ódio. Nem tudo é um objeto. Existem muitos conceitos que não pertencem ou precisam ser objetos. Colocar coisas onde elas não pertencem é apenas feio e pode diminuir a eficiência de um programa. Certo. Talvez não muito, dependendo do idioma. Isso também se refere ao # 5. Isso significa ... sim. Global estão ok. As funções, ao contrário dos métodos estáticos, estão ok. Combinar programação OO com funções globais está ok. Agora ... isso não significa que todos nós devemos sair e "liberar" nosso código de seus modelos de objetos também. Ao projetar uma seção de código ou um projeto inteiro, o que acontece nos bastidores deveser considerado ao montá-lo. Não apenas onde esse conceito vive e muitos outros fatores. Por que agrupar funções globais dentro de classes ou conceitos de namespace, se não serve para nada? Tome variáveis ​​de membro estáticas. Isso me diverte muito porque ... bem ... Dependendo do idioma e da implementação, é claro, mas de um modo geral, você acabou de declarar global. Sim, existem alguns motivos para agrupar esses conceitos que não são de OO nos wrappers de OO. Um, claro, é o código de auto-documentação. Isso pode fazer sentido. Então .. como eu digo. Não saia e "liberte" seu código. Mas qualquer boa linguagem moderna terá um conceito global fora da modelagem OO. Sim, quero dizer especificamente que uma linguagem de programação OO sem um conceito global provavelmente tem uma falha séria no design. Mais uma vez .. depende da intenção e do design do idioma, então não estou tentando escolher um idioma específico e há muitos para analisar aqui. Seja qual for, considere onde o código deve residir e ser o mais eficaz. Adicionar um monte de reflexos a algo que não adiciona funcionalidade ou suporte apenas desgasta o teclado mais rapidamente. Não faz bem a ninguém. Bem ... a menos que você goste de brownie da pessoa que provavelmente lhe ensinou incorretamente que tudo é um objeto.

Em resumo, a programação não está apenas tocando no teclado sem pensar. Há muitas considerações de design em qualquer projeto. Eu sei que é clichê, mas você tem que olhar de todos os ângulos. Mesmo nos dias de hoje, idiomas com segurança de digitação. Você não apenas explica o código e espera que funcione bem. Claro ... isso pode funcionar, mas pode não ser o caminho certo a seguir. No geral, escolha o idioma e o formato mais adequado para o trabalho específico E o ambiente. Mas nenhuma linguagem tira o pensamento por trás dela. Se você não está pensando ... você está apenas digitando.


19
Os idiomas não são perfeitos, e se você fizer uma lista de coisas que você odeia, poderá receber alguns comentários e idéias interessantes. Primeiro, ele permite que outras pessoas ofereçam soluções que você não sabia que existiam (veja as postagens, você verá que algumas coisas foram aprendidas). Segundo, constitui feedback do usuário para os desenvolvedores de idiomas (você não se interessaria se seus usuários apresentassem uma lista das 5 coisas que eles mais odeiam no seu software?) E terceiro, é meio interessante pensar nas falhas de suas ferramentas.
Sylverdrag

4
Se você visualizá-lo nesse nível, não apenas quebrar e continuar são gotos, mas os loops são gotos (pula o início do loop se a condição for atendida), se for goto (se a condição não for atendida pular sobre o bloco, a função chama são goto (pule para o início da função e depois pule para trás), ...
helium

17
Criar arquivos executáveis ​​a partir do código fonte "não tem uso"? O que?
detly

4
O Perl pode criar um executável a partir de um arquivo Perl desde o final dos anos 80. Uma coisa para distribuir é útil. Não é necessário: a) instalar o Perl; b) instalar os componentes do programa; c) talvez escrever um script para definir caminhos e executar tudo ... Sim, realmente inútil.
Xcramps

11
Mas, se você não conseguir criar arquivos .exe a partir da fonte, os usuários do Windows não poderão executá-lo. ;)
Evan Plaice

88

Cinco coisas que eu odeio no Java (que atualmente é a minha linguagem favorita) em nenhuma ordem específica.

  1. Por mais que eu seja fã do Java Generics, existem muitas curiosidades que surgem da maneira como ele foi projetado. Como tal, existem inúmeras limitações irritantes com genéricos (alguns dos quais são resultado de apagamento de tipo).
  2. A maneira como Object.clone () e as interfaces Cloneable funcionam é totalmente interrompida.
  3. Em vez de pegar a estrada e transformar tudo em um objeto (a. SmallTalk), a Sun criou duas categorias distintas de tipos de dados: objetos e primitivas. Como resultado, agora existem duas representações para tipos de dados fundamentais e curiosidades estranhas, como boxe / unboxing e não poder colocar primitivas em uma coleção.
  4. O balanço é muito complexo. Não me entenda mal: há muitas coisas legais que se pode fazer com o Swing, mas é um ótimo exemplo de excesso de engenharia.
  5. Essa reclamação final é igualmente culpa da Sun e daqueles que criaram bibliotecas XML para Java. As bibliotecas Java XML são muito complicadas. Para simplesmente ler um arquivo XML, muitas vezes tenho que me preocupar com o analisador que estou usando: DOM ou SAX? As APIs para cada uma são igualmente confusas. O suporte nativo na linguagem para analisar / gravar facilmente XML seria muito bom.
  6. java.util.Date é uma merda. Não é apenas desnecessariamente complicado, mas todos os métodos úteis foram preteridos (e substituídos por outros que aumentam a complexidade).

32
Você esqueceu o java.util.Date!
TM.

3
Além disso: A interface "Cloneable" não possui um método "clone ()". Isso faz da interface do Cloneable um oxímoro. E como clone () retorna um Objeto, digite safety está fora da janela (não aparece nenhuma tentativa de corrigir isso, mesmo após a introdução de Genéricos no J2SE 5.0).
Ryan Delucchi

2
Enquanto estivermos clonando em clonagem, também pode incluir a chamada "interface" serializável. Sempre que usá-lo, eu sempre quero me esfaquear.
Wd

12
Difícil de fazer coisas simples, como abrir um arquivo e ler a partir dele.
Eric Johnson

3
@Ryan clone () não precisa necessariamente retornar "Object". Com o J2SE 5.0, o Java introduziu tipos de retorno covariantes, o que significa que você pode retornar qualquer subtipo de uma classe base. Portanto, o público MyType clone () É possível!
Helpermethod

73

Ruby tem muitas falhas relacionadas à sua velocidade, mas eu não as odeio. Também tem falhas no evangelismo da comunidade, mas isso realmente não me incomoda. Estes são o que eu odeio:

  • Os fechamentos (blocos) têm 4 sintaxes de criação diferentes e nenhuma delas é ideal. A sintaxe elegante é incompleta e ambígua com hashes, e a sintaxe completa é feia.
  • A comunidade tende a ser contra a documentação real, favorecendo 'ler o código'. Eu acho isso infantil e preguiçoso.
  • O abuso de metaprogramação, principalmente nas bibliotecas, torna os bugs um pesadelo para rastrear.
  • Em uma nota relacionada, a metaprogramação abrangente torna um IDE abrangente difícil, se não impossível, de ser feito.
  • A maneira como o bloco passa para as funções é tolo. Não há razão para que os blocos sejam passados ​​para fora da lista de parâmetros ou tenham uma sintaxe especial ímpar para acessar (rendimento). Sou da opinião de que os blocos deveriam ter recebido uma sintaxe menos ambígua (ou hashes poderiam ter usado delimitadores diferentes; talvez <> em vez de {}), e a passagem como parâmetros para métodos deveria ter sido exatamente como todos os outros parâmetros.

    object.method(1, {|a| a.bar}, "blah")
    

    Essas esquisitices, como o bloco, devem ser o último parâmetro passado e passar mais de um bloco é diferente com sintaxe mais longa, realmente me incomoda.


2
suporte sub-ideal a m17n e unicode, embora esteja melhorando. 1,9 restos complicado ...
Keltia

37
Pensei que metaprogramming abuso é chamado de "ruby idiomática" :)
Slartibartfast

2
akway: As outras duas sintaxes são lambda e Proc.new .
Myrddin Emrys

2
Re documentação, uma vez ouvi uma palestra de alguém que trabalha na editora Pragmatic Programmers, que disse que quando a empresa foi fundada, eles queriam um livro Ruby porque o único disponível era em japonês. Para que eles pudessem ter esse livro traduzido e publicado por sua empresa. Mas o que eles fizeram foi ler o código-fonte :-) O livro Ruby foi aparentemente um dos livros que lançaram Pragmatic Programmers.
Arthur Reutenauer 9/10/09

13
Acho interessante que três deles estejam relacionados às pessoas e não à própria linguagem. Ruby continua sendo o idioma que eu menos odeio.
Toby Hede

72

Perl

  • Uso misto de sigilos

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • Por exemplo, nenhum deles é o mesmo:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    Em Perl6que está escrito :

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • Falta de OO verdadeiro

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    Em Perl6que está escrito :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • Recursos de regex mal projetados

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    Em Perl6que está escrito :

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • Falta de expedição múltipla

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    Em Perl6que está escrito :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • Má sobrecarga do operador

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    Em Perl6que está escrito :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
Não vejo falta de OO verdadeiro como tão ruim quanto você faz. Às vezes, é um salvador, especialmente quando o módulo CPAN que você está usando não pensou em expor o que você precisa. Ea falta de múltipla expedição poderia ser pior: perl poderia ter sido fortemente tipado ;-)
Tanktalus

3
Eu gosto que Perl não seja fortemente digitado, mas seria útil adicionar algumas informações de tipo.
Brad Gilbert

13
Parece que você escolheu para criticar um idioma que não é o seu favorito (perl6 você deveria ter criticado)
Frew Schmidt

5
Qual o sentido de comparar com o perl 6? Você está sugerindo que o perl 6 corrige seus problemas ou os continua?
Robert P

2
Duvido que eu preciso de dizer mais do que: ozonehouse.com/mark/periodic
Arafangion

57

Eu faço PHP como eu gosto às vezes e Python será feito demais.

  • Sem espaço para nome; tudo está em uma espécie de espaço para nome muito grande, o que é um inferno em ambientes maiores

  • Falta de padrões quando se trata de funções: funções de matriz usam uma agulha como primeiro argumento, palheiro como segundo (consulte array_search ). As funções de corda geralmente levam o palheiro primeiro, a agulha depois (consulte as notas ). Outras funções usam apenas esquemas de nomeação diferentes: bin2hex , strtolower , cal_to_jd

    Algumas funções têm valores de retorno estranhos, fora do normal: isso força você a ter uma terceira variável declarada do nada, enquanto o PHP pode interpretar com eficiência uma matriz vazia como falsa com seu tipo de malabarismo. Não há outras funções fazendo o mesmo.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • A linguagem (até PHP6) faz o possível para respeitar uma compatibilidade com versões anteriores com retardamento quase retardado, fazendo com que ela pratique más práticas e funções quando não for necessária (consulte mysql_escape_string vs. mysql_real_escape_string ).

  • O idioma evoluiu de um modelo de modelo para um de back-end completo. Isso significa que qualquer pessoa pode produzir qualquer coisa quando quiser, e isso é abusado. Você acaba com mecanismos de modelo para uma linguagem de modelos ...

  • É péssimo na importação de arquivos. Você tem 4 maneiras diferentes de fazê-lo (incluir, incluir_once, exigir, exigir_once), todos eles são lentos, muito lentos. De fato, toda a linguagem é lenta. Pelo menos, muito mais lento que python (mesmo com uma estrutura) e RoR do que eu entendo.

Eu ainda gosto de PHP, no entanto. É a serra elétrica do desenvolvimento da Web: você deseja que um site pequeno a médio seja feito rapidamente e certifique-se de que alguém possa hospedá-lo (embora as configurações possam diferir)? O PHP está aí, e é tão onipresente que leva apenas 5 minutos para instalar uma pilha completa de LAMP ou WAMP. Bem, vou voltar a trabalhar com Python agora ...


4
Suponho que o ponto 1 seja implementado em 5.3 :) Enquanto a ordenação de parâmetros está ficando cada vez melhor, a nomeação ainda é ruim. Eu concordo com a compatibilidade com versões anteriores.
Ross

4
Conseguiu amar # 4. Essa é uma das coisas que mais me incomodou o tempo todo também.
Franz

11
Eu acho que o argumento da velocidade é bastante subjetivo. A velocidade depende muito mais da eficiência do código do que da própria linguagem. O código PHP ruim é provavelmente mais lento que o código python de alta qualidade, mas o PHP bom também pode ter um desempenho melhor que o Python ruim.
Selfawaresoup

17
No_really_now_mysql_escape_the_string_im_serious ()
Salaryman

2
namespaces schmamespaces. PHP é no mundo inteiro web assim que tudo deve ser global
Evan Solha

50

Aqui estão algumas coisas que eu não gosto no Java (que não é minha linguagem favorita):

  • Eliminação do tipo de genéricos (ou seja, sem genéricos reificados)
  • Incapacidade de capturar várias exceções (de tipos diferentes) em um único bloco de captura
  • Falta de destruidores (finalize () é um substituto muito ruim)
  • Não há suporte para fechamentos ou tratamento de funções como dados (classes internas anônimas são um substituto muito detalhado)
  • Exceções verificadas em geral ou mais especificamente, verificando exceções irrecuperáveis ​​(por exemplo, SQLException)
  • Não há suporte no nível do idioma para coleções literais
  • Nenhuma inferência de tipo quando construtores de classes genéricas são chamados, ou seja, o (s) parâmetro (s) do tipo deve ser repetido nos dois lados do '='

11
@Svish - Eu acho que o ponto é que você só usaria essa construção quando não se importa com o tipo de exceção que está lidando. Em outras palavras, quando você deseja lidar com todos eles de forma idêntica
Donal

3
Eu não consideraria a falta de destruidores uma falha quando a linguagem tem um GC, e um GC que ficou cada vez melhor a cada versão. Os destruidores foram perdidos no java 1.1.8, mas não no java 6 porque o gc é muito aprimorado.
Mike Reedell

7
O C # corrige tudo isso, exceto a captura de várias exceções. Os genéricos são reificados, os destruidores são substituídos por / IDisposable, os fechamentos são implementados por métodos anon e lambdas, as exceções são desmarcadas, existem literais de coleção e há 'var' para evitar a especificação do tipo construído duas vezes.
Daniel Earwicker #

11
Java definitivamente tem encerramentos. Uma classe interna anônima fecha sobre variáveis ​​finais locais em seu escopo. Concordo que classes internas anônimas não são um substituto adequado para funções anônimas, mas são encerramentos.
23611 Adam Jaskiewicz

2
Outras classes internas NÃO são encerramentos: tente criar um retorno de chamada do visitante com algo como "sum + = current.amount ()", onde "sum" é uma variável não final do escopo. Perto, mas sem charuto.
Roboprog 12/06/09

40

C ++

  1. Sintaxe do modelo
  2. Problemas de herança de diamantes
  3. A infinidade / falta de bibliotecas padrão que as línguas modernas possuem (embora o impulso chegue perto).
  4. IOStreams
  5. A sintaxe usada nos IOStreams

Pitão

  1. Os espaços são significativos (às vezes)
  2. palavras-chave sublinhadas
  3. Suporte de segmento limitado (pelo menos atualmente)
  4. "eu" em vez de "isso"
  5. Os espaços são significativos (às vezes)

80
Você pode se referir a "eu" como "isso" é o que realmente deseja (embora possa ser difícil para outras pessoas seguirem). "Self" não é uma palavra-chave e você pode nomear a variável como desejar.
Mipadi 11/11/08

36
lá vai você, eu realmente lista o significado de espaços em branco (especialmente recuo) em Python como uma de suas maiores vantagens ...;)
Oliver Giesen

22
"espaços são significativos" é uma das melhores características do python !! O ps tenta executar isso em um intérprete "de futuras chaves de importação"
hasen

4
Não concordo com praticamente toda a sua lista python, exceto o suporte a threads. Espaço em branco não é significativo, recuo é significativo; há uma grande diferença.
Christian Oudard 31/08/2009

3
Uau. É como se ninguém tivesse inventado um editor de texto que realce / mostre espaços em branco / guias como caracteres especiais (o que você está codificando no bloco de notas?). Além disso, se você expandir as guias para os espaços, por favor, morra no fogo.
Fake Name

37

Objetivo-C

1) Sem espaços para nome, apenas convenções de nomes manuais - não me importo com isso em termos de separação de classes, mas sinto falta de poder importar todas as definições de classe em um espaço para nome em uma única linha (como import com.me.somelibrary. *)

2) As bibliotecas ainda têm alguns buracos em áreas importantes como o suporte ao RegEx.

3) A sintaxe da propriedade é um pouco desajeitada, exigindo três linhas (em dois arquivos separados) para declarar uma propriedade.

4) Gosto do modelo de retenção / liberação, mas é mais fácil do que deveria ser lançar uma referência e depois usá-la acidentalmente mais tarde.

5) Embora não seja realmente um recurso de linguagem, o Xcode está tão entrelaçado com o uso do Objective-C que não consigo deixar de pensar sobre esse aspecto ... basicamente o preenchimento automático é muito duvidoso. É mais como um sistema que recompensa você por encontrar algo que você deseja que exista e depois o apresenta como uma opção posteriormente. Mas acho que nunca gostei de mecanismos de preenchimento automático.


2
Concorde com os espaços para nome, prefixar classes com códigos de letras é estúpido. E eu adicionaria o suporte ausente para variáveis ​​de classe real, não gosto de fingir com estática de arquivo.
zoul

2
Propriedades de Objective-C. Sério, eles são chocantes, não consigo entender o hype, especialmente vendo o quão bem o C # os faz.
Justicle

6
Na verdade, eu realmente gostei desse aspecto do Lisp e ObjC - você só precisa de um editor com boa correspondência de chaves, como Emacs ou XCode. Normalmente, escrevo chaves em pares antes de digitar qualquer coisa nelas, para não ter problemas com a correspondência ... e o XCode também pode destacar a região delimitada por uma chave apenas clicando duas vezes em qualquer uma delas.
Kendall Helmstetter Gelner

11
@ Chris S: Você está dizendo YES/NOque os booleanos são uma coisa ruim? E o mais importante, você está dizendo que Parâmetros Nomeados são uma coisa ruim? Eu posso entender bools, mas os parâmetros nomeados são possivelmente um dos melhores recursos do ObjC (em termos de legibilidade).
Jbrennan

3
Talvez eu seja masoquista, mas gosto de nomes de classes com prefixo. Isso torna as pesquisas no Google e na documentação bem claras, nunca há nenhuma confusão sobre que tipo de string você está usando se a classe for chamada NSString.
kubi

36

C ++

  • Cordas.
    Como eles não são interoperáveis ​​com as strings da plataforma, você acaba usando std :: vector metade do tempo. A política de cópia (cópia em gravação ou cópia profunda) não está definida, portanto, garantias de desempenho não podem ser dadas para sintaxe direta. Às vezes, eles contam com algoritmos STL que não são muito intuitivos de usar. Muitas bibliotecas lançam suas próprias, que infelizmente são muito mais confortáveis ​​de usar. A menos que você precise combiná-los.

  • Variedade de representações de strings
    Agora, esse é um problema de plataforma - mas ainda espero que tenha sido melhor quando uma classe de strings padrão menos obstinada estivesse disponível anteriormente. As seguintes representações de seqüência de caracteres que eu uso com freqüência:

    • LPCTSTR genérico,
    • STR LPC (W) alocado por CoTaskMemAlloc,
    • BSTR, _bstr _t
    • w) corda
    • CString,
    • std :: vector
    • uma classe roll-my-own ( suspiro ) que adiciona verificação de intervalo e operações básicas a um buffer (w) char * de comprimento conhecido
  • Modelo de construção.
    Estou doente de morte por todo o tempo gasto com declarações de quem inclui o quê, encaminhamento, otimização de cabeçalhos pré-compilados e inclui manter pelo menos tempos de compilação suportáveis, etc. Foi ótimo nos anos 80, mas agora? Existem tantos obstáculos para empacotar um pedaço de código, para que possa ser reutilizado que até o cachorro da mãe fica entediado ao me ouvir.

  • Difícil de analisar
    Isso torna as ferramentas externas especialmente difíceis de escrever e acertar. E hoje, nós, C ++, faltam principalmente na cadeia de ferramentas. Eu amo minha reflexão em C # e delegados, mas posso viver sem eles. Sem grande refatoração, não posso.

  • A segmentação é muito difícil A
    linguagem nem a reconhece (a essa altura), e as liberdades do compilador - embora grandes - são muito dolorosas.

  • Inicialização estática e sob demanda Tecnicamente, eu trapaceio aqui: essa é outra peça do quebra-cabeça no "código de finalização para reutilização": é um pesadelo obter algo inicializado apenas quando necessário. A melhor solução para todos os outros problemas redist é colocar tudo em cabeçalhos, esse problema diz "neeener - você não pode".


É verdade que muito disso está além do escopo estrito da linguagem, mas na IMO toda a cadeia de ferramentas precisa ser julgada e precisa evoluir.


Procurar documentação no STL é como procurar manuais sobre como construir uma placa gráfica do zero.
Aviraldg

Francamente, a maioria desses pontos parece que você nunca se incomodou em aprender C ++ corretamente ... isso fica bastante óbvio na terceira posição, pois os guardas de inclusão são algo que todo programador de C ++ deve saber. Também não sei como entender o ponto 1, você está confuso std::string? talvez a leitura de uma boa documentação e / ou tutorial sobre std::vector(e por que você não deveria usar std::stringem lugares onde nunca foi projetada) possa esclarecer isso para você.

@nebukadnezzar: Encontrei Meyers iluminando o STL, mas isso não resolve os problemas fundamentais. Francamente, parece que você nunca teve que manter um projeto grande, nunca teve que caçar uma dependência circular em uma hierarquia de dezenas. Sei que incluem guardas, mas por que precisamos nos preocupar com eles? Entre. eles não corrigem todos os problemas. Quão "padrão" é um std::stringse eu não posso usá-lo na metade do tempo? (C ++ 0x pelo menos corrige isso, mas ainda estou preso a dezenas de bibliotecas que usam diferentes representações de string).
Peterchen

but why do we have to bother with them (inclusion guards)- porque o C ++ não possui módulos. How "standard" is a std::string if I can't use it half of the time?Acho que depende da maneira como você usa std::string. A classe string permite acessar os dados da string como const char*via std::string::c_str, o que já é std::stringperfeitamente compatível com todas as classes / funções que também recebem const char*argumentos.

porque o C ++ não possui módulos - exatamente a minha reclamação: o modelo de compilação é antigo (eu aceitaria qualquer outra solução além dos módulos). ----- perfeitamente compatível - mas perfeitamente incompatível com muitos outros cenários (eu diria que a correção do C ++ 0x diz que eu tenho um ponto aqui.) Eu ficaria feliz se std :: string tivesse sido difundido o suficiente para foram adotadas como a classe de cordas há 10 anos, mas não era - a outra queixa.
peterchen

35

JavaScript :

  • O Objectprotótipo pode ser modificado. Cada objeto em seu programa obtém novas propriedades e provavelmente algo quebra.

  • Todos os objetos são mapas de hash, mas é difícil usá-los com segurança. Em particular, se uma de suas chaves estiver __proto__, você está com problemas.

  • Nenhum fechamento de objeto no tempo de referência da função. De fato, nenhum fechamento de objeto - em vez disso, thisé definido sempre que uma função é chamada com a notação de objeto ou o newoperador. Isso resulta em muita confusão, principalmente ao criar retornos de chamada de eventos, porque thisnão está definido para o que o programador espera.

    • Corolário: chamar uma função sem notação de objeto ou o newoperador resulta em thisser igual ao objeto global, resultando em muita quebra.
  • Operador de adição sobrecarregado para também executar concatenação de cadeias, apesar das duas operações serem fundamentalmente diferentes. Isso causa dor quando um valor que você espera ser um número é de fato uma string.

  • ==e os !=operadores executam coerção de tipo. Comparações entre diferentes tipos envolvem uma lista de regras que nenhum mortal pode se lembrar por completo. Isso é atenuado pela existência de ===e !==operadores.

  • Ambos nulle undefinedexistem, com significados sutilmente diferentes, porém redundantes. Por quê?

  • Sintaxe estranha para configurar cadeias de protótipos.

  • parseInt(s)espera um número no estilo C, portanto trata valores com zeros à esquerda como octais, etc. Você pode pelo menos, parseInt(s, 10)mas o comportamento padrão é confuso.

  • Nenhum escopo de bloco.

  • Pode declarar a mesma variável mais de uma vez.

  • Pode usar uma variável sem declará-la; nesse caso, é global e provavelmente interrompe seu programa.

  • with { }.

  • Realmente difícil de documentar com JavaDoc como ferramentas.


3
Para nulle undefined: às vezes você realmente deseja saber se a variável recebeu um valor ou não. Como nulo é um valor, indefinido é a única maneira de dizer. É verdade que a única vez que achei isso útil foi na criação de funções getter / setter.
214 Zach

11
"se uma de suas chaves for proto " - bem, é uma palavra reservada com significado especial. é como reclamar que você não pode usar forcomo um nome de variável.
nickf

5
@ Nickf: A chave para um hash é uma string. As strings podem ter qualquer valor, incluindo palavras reservadas. Em particular, o valor "for"é válido como uma chave de hash. __proto__não é uma palavra reservada. Valores especiais de sequência que não funcionam conforme o esperado quando usados ​​como chaves de hash violam expectativas razoáveis ​​sobre como as matrizes associativas funcionam em qualquer idioma. Eles também violam as especificações do EcmaScript.
Daniel Cassidy

2
Thomas: Newline nem sempre termina uma declaração. Portanto, os codificadores sensíveis encerram todas as instruções com ponto e vírgula para tornar o código mais claro.
Daniel Cassidy

2
newline may or may not end a statement depending on contexté um na minha lista dos 5 melhores
reinierpost

34

Pitão:

  • Falta de digitação estática
  • Manipulação de argumento padrão (especificamente o fato de que você pode alterar o argumento padrão para futuros chamadores!)
  • Muitos sublinhados necessários (os construtores devem ser chamados __init__)
  • Falta de membros e funções privadas apropriadas (a convenção apenas diz que a maioria das coisas que começam com sublinhado são privadas, exceto todas as coisas assim __getattr__)
  • Sintaxe engraçada para printinserir um arquivo (mas eles estão corrigindo isso no Python 3)

10
O que eu gostaria é uma opção para usar tipos estáticos.
Greg Hewgill 12/11/2008

4
BTW: init não é realmente o construtor, o objeto já foi criado quando você entra lá (adivinhe o que é eu ...). O construtor é totalmente novo, onde você obtém acesso à classe a ser instanciada.
286 André André

90
Se você prefere a digitação estática, por que o Python é o seu idioma favorito?
7118 finnw

9
finnw: A digitação estática é ótima para alguns tipos de programas e não é realmente necessária para outros tipos. Normalmente, não me importo com a falta de digitação estática, mas quando você precisar, é muito bom ter pelo menos a opção.
Greg Hewgill

8
Eu diria que a falta de tipagem estática é uma característica, não faltando funcionalidade ...
arnorhs

32

C #

  • Eu gostaria de poder switch()de qualquer tipo, e isso casepoderia ser qualquer expressão.

  • Não é possível usar a sintaxe do inicializador de objetos com campos 'somente leitura' / private setautopropulsões. Geralmente, quero ajuda de idioma para criar tipos imutáveis.

  • Uso de {}para namespace e classe e método e blocos de propriedade / indexador e blocos de várias instruções e inicializadores de matriz . Torna difícil descobrir onde você está quando eles estão distantes ou incompatíveis.

  • Eu odeio escrever (from x in y ... select).Z(). Não quero ter que voltar à sintaxe de chamada de método porque a sintaxe da consulta está faltando alguma coisa.

  • Eu quero uma docláusula na sintaxe da consulta, que é como foreach. Mas não é realmente uma consulta então.

Estou realmente chegando aqui. Eu acho que o C # é fantástico e é difícil encontrar muito que está quebrado.


14
+1 para alternar em qualquer tipo #
12/07/09

+1 para questões de switch, e {} questões, que eu realmente não tinha pensado sobre até agora
Maslow

Eu odeio {}. Eles se parecem muito com (). A incompatibilidade nunca foi um grande problema para mim, porque eu sempre as coloco no mesmo nível, a menos que sejam basicamente de uma só linha.
Loren Pechtel

2
+1 para a consulta linq. Especialmente quando você deseja apenas um objeto retornado. Em vez de (de x em y, selecione) .first (), por que não um (de x em y, selecione top 1) ou algo que se encaixe mais na sintaxe sql real.
AdmSteck

se desejar, você pode ativar () qualquer tipo e, nesse caso, qualquer expressão, verifique a correspondência de padrões F #. c-sharpcorner.com/UploadFile/mgold/…
gradbot

26

PHP

  1. Não há recursos de depuração se você não controla o servidor, e mesmo assim eles meio que sugam
  2. A quantidade extrema de códigos PHP ruins que circulam por todos os lados dá a todos os programadores de PHP um nome ruim
  3. Nomenclatura inconsistente da função
  4. Incapacidade de ter uma variável de tipo estático, se eu quiser uma (eu sou um grande fã de digitação dinâmica 90% do tempo)
  5. REGISTER_GLOBALS é o diabo

25
REGISTER_GLOBALS uma vez comeu meu cachorro :(
Pim Jager

2
1: Eu recomendo o xdebug e um cliente da GUI como o MacGDBp. Isso realmente alivia um pouco da dor ... Concordo com os outros pontos.
Jonas Due Vesterheden

5
# 2: Oh Deus, não me deixe começar nisso. Eu sempre tenho que me defender como desenvolvedor PHP contra pessoas que só viram a bagunça que muitas pessoas criam com PHP.
Selfwaresoup

11
+1 em # 2 Passei muito tempo me defendendo como desenvolvedor de PHP.
UnkwnTech 25/05

+1 para # 2 - também resulta em salário ruim :(
Shiki

25

C (OK, não é o meu favorito, mas ainda não foi feito.)

  • Sintaxe da biblioteca de soquetes.
  • Sem sobrecarga de função.
  • Cordas no estilo C.
  • Excesso de buffer.
  • Sintaxe enigmática. Não sei quantas vezes procurei coisas como atoi, dei um tapa na testa e gritei "Claro!"

Edição: Eu provavelmente poderia ter mais, se eu recorresse a mais código de biblioteca (como fiz com soquetes, mas esses são particularmente ruins), mas eu já sentia que estava trapaceando por escolher C. Muitos idiomas existem apenas para usar as partes boas de C e substituir as ruins que é como bater em um cavalo morto.


22
Qual sintaxe do soquete? C não tem conceito de soquetes.
Ferruccio

3
Oh, vamos lá! Você pode pensar em cinco. A aritmética do ponteiro não é uma merda? :)
brian d foy

8
+1 Eu ri das "cordas do estilo C." E @brain_d_foy: a aritmética de ponteiros só é ruim se você não entender.
19740 Chris Lutz

11
@ Chris Luts: Mesmo quando eu estava aprendendo C simples (antes de conhecer C ++ ou qualquer outra linguagem OO), eu sabia que havia algo errado nas matrizes de caracteres. :)
Bill the Lizard

2
ponteiro aritmética é uma serra elétrica - muito eficiente, mas corre o risco de tomar toda a sua perna
Thorbjørn Ravn Andersen

24

Lisp comum:

  1. Palavras-chave geralmente são muito prolixo.
  2. O suporte da biblioteca é lamentável.
  3. Não funciona bem em sistemas operacionais que desejam lidar com a memória com mais rigor.
  4. Não possui boas instalações para interagir com o sistema operacional.
  5. O recurso "loop" não está bem definido e com certeza não parece Lispy.

2
'loop' pode não ser lispy, mas o que é mal definido sobre isso?
Daniel Cassidy

2
Eu não li o padrão, eu estou indo principalmente no "On Lisp" de Paul Graham. Ele diz que o padrão é principalmente exemplos e não define os casos de canto.
David Thornley

3
você não quer dizer palavras-chave-são muito prolixo?
GClaramunt 25/05

Concordo que não é "lispy", mas o CLtLv2 passa muito tempo nele. Eu apenas acho que foi projetado para fazer demais. sunsite.univie.ac.at/textbooks/cltl/clm/…
Hans Van Slooten

Além de "loop", "format" também não é muito parecido com o Lisplike. Eu odeio "formato" e "loop", embora o Lisp seja meu idioma favorito.
Paul Reiners 25/05

24

BrainF * ck

  • Seu destaque é que você é Turing completo ?! Eu posso fazer mais em expressões regulares do Perl!

  • Falta de objetos. Vamos lá pessoal! É como, olá ...

  • Nenhuma biblioteca de rede. Tudo o que eu quero é raspar uma página da web, GOSH.

  • Não há funções de primeira classe. Parabéns - você começa a se solidarizar com seus amigos de Java.

  • Uma fita infinita para armazenamento e nada mais. Isso é tão pretensioso que podemos escrever Lisp.


6
Não há espaço para nome ou suporte ao módulo dinâmico. Como podemos escrever sistemas de controle de plantas químicas sem esses princípios?
Donal Fellows

Nenhum açúcar sintático, como> 10 (mova 10 vezes), 0 (insira zero), +5 (adicione 5).
Squall

23

Javascript

  1. números como strings - a matemática pode ser frustrante quando os números são interpretados como strings. 5 + 2 = 52? Grrr ...
  2. permissões - todas as melhores coisas requerem permissão do usuário!
  3. atualizações da tela - O navegador deve estar no estado estacionário para atualizar a tela. Não parece haver uma maneira de forçar a atualização da tela no meio de um script.
  4. Lento - embora o Google Chrome seja legal ...
  5. As diferenças no navegador tornam o uso do idioma um [censurado].

4
Os números como strings são facilmente corrigidos. Se você já tiver uma string, precisará analisá-la (x, 10). A falha gigante é quando você deixa de fora os 10 e interpreta '017' como OCTAL
Orion Edwards

3
false == 0 == [] == "" mas nulo e NaN não são. NaN! = NaN. null == null.
246 Jimmy Jimmy

7
typeof "uma string" == "string". typeof new String ("outra string") == "objeto. new String ('a'). construtor ==" a ".constructor. typeof new Array () == 'object'
Jimmy

11
para (x) devolve em objeto funções
Jimmy

14
-1, esta lista é principalmente sobre problemas do navegador, não o idioma em si.
Mauricio Scheffer

20

PHP:

  • Nunca se pode ter certeza de que certas extensões quase comuns estão disponíveis em todos os servidores da web.
  • tenta ser tudo no futuro (ir, fechamentos, ...)
  • muitos riscos de segurança para usuários inexperientes
  • mais sobrecarga do operador seria bom
  • todos os programadores pobres que não aprendem a fazê-lo funcionar corretamente e lhe dão um nome ruim

No entanto, o PHP é a linguagem (de script). ;-)


OK, só mais uma coisa a seguir!
Brian D Foy

4
Concordo totalmente com o ponto 5 - também estaria em uma lista Javascript.
9119 Steve Claridge

Eu discordo de "todos os programadores pobres que não aprendem como fazê-lo funcionar corretamente e dão a ele um nome ruim". Eu o substituiria por "grandes opções de configuração de linguagem de execução".
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Apenas Windows.
  2. Não mais suportado.
  3. As matrizes podem começar com qualquer número, em vez de serem normalizadas para 0.
  4. aplicativos compilados dependem de muitas DLLs para serem executadas corretamente.
  5. Muitos controles complicados, como o controle de um navegador ou partes complicadas de código, tendem a interromper o IDE quando você executa o código não compilado, mas funciona bem quando compilado.

13
VB é o idioma favorito de alguém? O_o. Por que "sintaxe que é completamente diferente e incompatível com outros idiomas" e "dá maus hábitos com relação a outros idiomas" aqui?
Jonta 24/11

3
Na verdade, acho # 3 um recurso muito poderoso, não um bug - eu adoraria que o VB.NET tivesse isso. AWK tem, em certo sentido, mas depois, em AWK matrizes são realmente hashes disfarçado :(
Joe Pineda

3
Em 1 e 4, e .NET C # não requer UM QUADRO COMPLETO e Sistema Operacional ??? (ei, ouvi dizer que você é fanático por mono ... ainda é uma "estrutura completa" para você, e duvido que um dist debian o consiga). Em relação a 5, nenhum programador correto de VB6 (de volta ao dia) manteve a opção padrão "Compile On Demand" ativada ...
jpinto3912 29/09/09

2
Ainda tem que suportar o vb6 ocasionalmente. Pet pieves: não é possível inicializar uma variável na declaração, não há construtores parametrizados, uma classe por arquivo, etc ... Se eles resolverem esses problemas, o idioma poderá continuar por mais 10 anos com facilidade.
AngryHacker 04/08/09

14
E sobre a "On Error Resume Next" ... isso é como dizer "este código é F ** KED, mas vamos continuar correndo de qualquer jeito =).
StingyJack

18

Ruby é meu idioma favorito, eis o que eu não gosto:

  • Threads verdes + bloqueio de bibliotecas C = falha gigante
  • TÃO DORAMENTE LENTO
  • A própria biblioteca padrão é inconsistente com o uso do bang! métodos
  • O módulo include + extend está bagunçado.
  • "Classes abertas" não podem ter escopo definido. Quero adicionar uma string # dostuff, mas não quero que isso vaze para todas as bibliotecas de terceiros
  • Nenhuma solução de empacotamento de implantação binária.

3
Você já experimentou o Ruby 1.9.1? Oferece uma vasta aceleração em comparação com o Ruby 1.8.6
Christian Stade-Schuldt

Tente jrubyc. JVM JIT FTW!
KitsuneYMG

+1 por incluir problemas razoáveis, em oposição aos 'ódios' da resposta Ruby com a melhor classificação.
Phrogz

17

Delphi:

  • O IDE é um pouco instável.
  • O insight do código às vezes é confuso.
  • Às vezes, a depuração é incorreta.
  • Atualizar vários arquivos de projeto pode ser complicado.
  • Se você iniciar um ou mais pacotes indisponíveis, a mensagem de erro será exibida várias vezes.

5
Tudo isso parece ser uma reclamação sobre o Delphi, o IDE, e não o Delphi, a linguagem (AKA Object Pascal)
Dónal

11
Presumivelmente, isso é porque Object Pascal é perfeito ;-)
Mark Bessey

3
Estou um pouco atrasado para a festa, mas aqui vai de qualquer maneira: - ter que escrever assinaturas de método duas vezes (interface + implementação) - O nome da unidade é NECESSÁRIO para ser idêntico ao nome do arquivo. WTF?!?
Martijn

11
Acho que o começo ... acaba sendo superior - eles são muito mais claros que {}. Você gasta muito mais tempo lendo o código do que escrevendo. Porém, para uma queixa - você não pode usar subintervalos definidos de tipos enumerados em um caso, mesmo que seja perfeitamente legal se você declarar o intervalo ali no caso. Além disso, nenhuma referência direta entre as unidades.
Loren Pechtel

11
@AlexanderN: Não, nunca foi tão vivo, popular ou ótimo.
Andreas Rejbrand

16

Javascript

  • Todo script é executado em um único 'namespace' global ... algo que você precisa observar ao trabalhar com scripts de diferentes fontes

  • Se uma variável é usada, mas ainda não foi definida de antemão, ela é considerada uma variável global

  • Os fornecedores de navegadores criam os padrões como desejarem, tornando a codificação para nós desenvolvedores que usamos uma linguagem tão bonita mais difícil do que deveria

  • Case-Sensitivity - considerando que não existe um IDE decente para o desenvolvimento de js com verificação em tempo de compilação

  • Soluções alternativas (como o uso do hasOwnPropertymétodo) para executar algumas operações simples.


AFAIK, todas as extensões para a linguagem JS (e não o DOM) dos fornecedores de navegadores foram empurradas pelo menos para adoção padrão - mesmo que o processo de padrões não tenha conseguido isso. hasOwnProperty / soluções alternativas: espada de dois gumes. Para forçar a "simplicidade", perdemos muito poder e flexibilidade. Essa queixa sempre me irrita. Escreva seus loops corretamente (e verifique também os membros do seu objeto)!
Eyelidlessness

15

Haskell:

  1. Vazamentos de espaço na avaliação preguiçosa.
  2. Hierarquia numérica não construída em relação a abstrações matemáticas.
  3. O IO monádico estrito pode dificultar a depuração.
  4. As grandes implementações lidam com E / S de maneiras que não parecem totalmente compatíveis com o padrão. (Em particular, a saída de caracteres gera apenas 8 bits baixos - e, em seguida, é criado o código que usa essa suposição para executar E / S binária. Ick.)
  5. A associatividade do ($)operador pode ser alterada para tornar algumas expressões mais bonitas.

A maioria delas não chega ao nível de ódio, e há pessoas tentando consertar ou construir soluções sólidas para cada uma delas.

Edit: Houve alguma confusão sobre o ponto 5. Em particular, algumas pessoas parecem pensar que eu quis dizer a ordem dos argumentos, o que não quero. Em vez de explicar o que eu quis dizer, vou apontar as pessoas para o seguinte link, http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , que o expressa bem.


3
Por que você deseja alterar a associatividade de ($)? 'fghx' colchetes como '((fg) h) x' e 'f $ g $ h $ x' colchetes como 'f (g (hx))' ...
Erik Hesselink

11
Eu tenho <3 Haskell. A biblioteca padrão precisa incluir montanhas de abstrações matemáticas, incluindo espaços vetoriais et al. O prelúdio também precisa de um operador que faça o encadeamento exatamente como ($), mas da esquerda para a direita {source |> func1 |> filter func2 |> map (func3 10)}.
Yfeldblum

10
Você perdeu a péssima: a tendência dos programadores Haskell de usar nomes de variáveis ​​de uma letra.
Benjamin Confino 04/04

11
Um operador associativo à esquerda ($) é apenas um aplicativo de funções, que em Haskell é representado pelo caractere de espaço. @Justice: Experimente a função flip. (|>) = flip ($)
Apocalisp

11
Alguém pode explicar o ponto 5? Eu pensei que associatividade correta era o ponto principal de ($).
Tim Matthews
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.