ti-enxame.com

Qual elemento de sintaxe você mais odeia em uma linguagem de programação usada com freqüência?

Não importa o quanto você goste de uma linguagem de programação, sempre há alguns detalhes que não são tão agradáveis ​​quanto poderiam ser.

Nesta pergunta, gostaria de me concentrar especificamente em elementos de sintaxe. Em uma linguagem de programação que você usa com freqüência (talvez sua linguagem de programação favorita, ou talvez a que você é forçado a usar no trabalho), que elemento de sintaxe que você acha mais ilegível, incerto, inconveniente ou desagradável?

26
Timwi

Inserção de ponto e vírgula em JavaScript.

Eu realmente não fui mordido por isso com frequência, mas é uma idéia tão fenomenalmente ruim que faz minha cabeça girar.


Aqui estão as regras (da seção 7.9 da ECMA-262)

  1. Quando o programa contém um token que não é permitido pela gramática formal, um ponto-e-vírgula é inserido se (a) houver uma quebra de linha nesse ponto ou (b) o token inesperado for uma chave de fechamento.
  2. Quando o final de um arquivo é atingido, se o programa não puder ser analisado de outra forma, um ponto-e-vírgula é inserido.
  3. Quando uma "produção restrita" é encontrada e contém um terminador de linha em um local onde a gramática contém a anotação "[sem LineTerminator aqui]" ", um ponto-e-vírgula é inserido.

Exemplo:

return 1; // returns 1

return
1; // returns undefined
39
Tim Goodman

Sintaxe do Java-bean devido à falta de propriedades de C #

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

Problemas que tenho com isso

  • Demasiado código - Tenha um campo documentado, um método getter que esteja documentado e um método setter que esteja documentado. Este exemplo extremamente básico possui 20 linhas de código para uma propriedade single
  • Listas de métodos de Clutters - "Deixe-me encontrar esse método, passe: getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH... ah, aí está, hashCode.
  • Várias áreas de documentação levam a documentação ruim, desatualizada ou ausente - Irritante ao tentar entender o que o código faz
  • Tão irritante que um terceiro tenha que criar um plug-in para fazer isso facilmente - Spoon , Shark , entre outros.
39
TheLQ

Sensibilidade de espaço em branco.

Python me irrita a esse respeito. Quero dizer, eu recuo corretamente de qualquer maneira, mas me incomoda que eu deva tenha para. Tornar a apresentação parte da sintaxe me irrita.

32
Fishtoaster

A instrução switch (em C, C++, C #, Java etc.)

Aqui está um exemplo de por que considero altamente inconveniente:

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

Isso não é compilado porque a variável i é redeclarada no mesmo escopo. Parece um pequeno detalhe, mas me morde com muita frequência. Posso adicionar colchetes para atenuá-lo, mas teria sido bom se os colchetes fossem parte obrigatória da sintaxe e não houvesse um nível extra redundante de recuo. Eu também odeio ter que escrever o extra break. Isso seria muito melhor:

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

Isso faz com que pareça mais com uma cadeia if/else, o que é uma coisa boa porque é semanticamente semelhante também. Pelo menos em C #, ainda assim não seria a mesma coisa, porque em uma instrução switch a ordem dos rótulos dos casos não importa, mas em uma if/else faz.

32
Timwi

Declarações de matriz em VB.NET

Sempre esqueço que, ao inicializar matrizes fixas no VB.NET, você especifica o limite superior da matriz e não o número de elementos, como em C/C++, PHP ou Java. Além do VB6 (não vamos lá ...), não consigo pensar em outra linguagem que faça dessa maneira:

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20
27
user95

VB6 - Declaração e atribuição de variáveis ​​separadas

A maioria dos idiomas permite declarar uma variável e atribuí-la em uma linha de código; O VB6, por outro lado, força você a usar dois.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

Você pode usar dois pontos para colocar dois comandos em uma linha, mas rapidamente fica confuso no código real.

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection
24
derekerdmann

Comentando em CSS

// não comenta linhas de código como em muitas outras línguas, como PHP e Javascript. Embora /* this is commented out */ funciona, eu prefiro usar //.

É um incômodo, porque na metade do tempo eu esqueço que estou editando CSS e, em seguida, tenho que voltar e corrigir o erro.

24
Talvi Watia

PHP - ordenação consistente de argumentos

O PHP possui várias funções úteis para executar praticamente todas as operações que você pode imaginar em um array ou string. Muitas dessas operações requerem o uso de um $needle e um $haystack, mas funções diferentes as levam em ordens diferentes. Qual função requer quais argumentos é um daqueles fatos que meu cérebro se recusa a absorver, não importa quantas vezes eu os encontre!

Tome as funções matriz_in e strstr :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

Curiosamente, PHP parece ser internamente consistente com essas ordenações, em que todas as funções de string parecem usar $haystack, $needle enquanto as funções de matriz são inversas, mas isso pode demorar um pouco para se acostumar com alguém novo no PHP. Há uma boa postagem no ExpressionEngine falando sobre essa peculiaridade específica em mais detalhes, bem como uma discussão na PHP , que apresenta uma resposta muito curta da equipe PHP!

[email protected]
Use um decente IDE então.
20
ConroyP

Python

self parâmetro nas definições de método da instância

19
Goran Peroš

Sintaxe da declaração do ponteiro de função em C e C++:

(int)(*f)(int, int);

Isso declara um ponteiro de função chamado f cujo ponta pode pegar dois ints e retornar um int.

Eu preferiria uma sintaxe como esta:

f: (int, int) => int

Digamos que você queira declarar um ponteiro de função g cujo apontador pode levar dois ints e uma função de int e int a int, e retorne um int.

Com a notação C ou C++, você a declararia como:

(int)(*g)(int, int, int(int, int));

Com a notação proposta acima, pode-se declarar a mesma coisa que:

g: (int, int, (int, int) => int) => int

O último é IMO muito mais intuitivo.


Além disso: A linguagem de programação chamada OOC corrige esta sintaxe (e vários outros problemas sintáticos em C e C++). Confira a página inicial aqui .

16
missingfaktor

Verbosidade em Java.

ou seja:

public static final int 
14
OscarRyz

\ we\wouldnt\fixar\nossa\sintaxe do namespace do analisador no PHP

A sintaxe não é apenas feia, mas também gera confusão quando os desenvolvedores mais novos precisam pensar em namespaces em strings. (O PHP interpola barras invertidas em cadeias de caracteres entre aspas duplas como sequências de escape. Tentando representar um espaço para nome como \you\should\never\do\that em uma sequência de aspas duplas em vez de uma sequência de aspas simples levará a novas linhas, guias e desastre.)

12
mario

O VBScript não possui operadores lógicos

Diferente de quase toda linguagem sensata, o VBScript usa operadores bit a bit em vez de operadores lógicos. O que isso significa na prática? Bem, como Eric Lippert aponta :

If Blah = True Then Print "True!" Else Print "False!"

e

If Blah Then Print "True!" Else Print "False!"

nÃO são iguais no VBScript!

Pior ainda, isso significa que não há avaliação de curto-circuito no VBScript, de modo que a seguinte instrução irá travar seu programa se Blah é Nothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

Isso mesmo, o VBScript avaliará as duas partes da comparação AND, mesmo que a primeira seja falsa! Apenas deixe isso afundar ...

9
Dan Diplo

Eu desprezo o fato de que o aparelho pode ser opcional após uma declaração if/while/for.

Especialmente quando vejo código como,

if (...)
    for(...)
        ... One line of stuff ...

Por favor, apenas coloque os aparelhos e termine com isso.

9
Jim A

EDIT: Após a discussão nos comentários, decidi atualizar esta resposta para me explicar melhor.

Eu realmente odeio a aparência dos ponteiros de função em C. Normalmente, qualquer declaração de variável se parece com uma Tupla de: type varname; As declarações do ponteiro de função, por outro lado, parecem uma declaração da função com * antes do nome da função. Eu posso aceitar isso como uma descrição de um tipo de ponteiro, mas em C isso declara o tipo e o nome de uma variável desse tipo. Isso me parece inconsistente porque as declarações de tipo são diferentes das declarações de variáveis. struct myStruct{int X; int Y;} define apenas um tipo, ele não define uma variável chamada myStruct. Da mesma forma, não vejo razão para as declarações de tipo e de variável serem agrupadas em uma instrução atômica nos ponteiros de função, nem aprecio o desvio da type varname; estrutura.

Alguém apontou que é consistente com alguma regra espiral, e esse pode ser o caso, mas a marca de uma boa sintaxe é que ela é auto-explicativa e sua lógica interna é óbvia. A regra da espiral não é óbvia de forma alguma.

7
EpsilonVector

Argumentos de entrada/saída. Sou a favor de argumentos (que bom que sou), argumentos fora também são bons, mas um argumento que deve transmitir esses dois estados me irrita.

O que eu alvo aqui são funções que recebem entrada de um parâmetro e substituem essa entrada com alguma saída. Não há problema em passar um objeto por referência para atualizá-lo. Mas, principalmente para tipos primitivos, pegar um objeto, usá-lo e depois alterá-lo completamente, não é certo para mim. Você não deve alterar o significado do argumento por meio de uma entrada.

6
zneak

Ponto e vírgula no VBScript - ou a falta dela

Passo o dia inteiro trabalhando em idiomas que esperam ponto e vírgula no final de cada linha. Adicione um ao final da linha no VBScript e seu código não será mais executado.

6
Nathan Taylor

Declarações de matriz em C e C++.

Normalmente, uma declaração de variável tem o formato type variable_name. Você pode ler essas declarações facilmente da maneira da esquerda para a direita. Mas int foo[size] parece inicialmente declarar foo como int, e então você lê mais e vê os foo do tipo "array of integers". int[size] foo lê muito melhor.

E eu também odeio quando os programadores declaram ponteiros como este por um motivo semelhante: int *foo. Por alguma razão que eu ainda não descobri, é dessa maneira que típica é escrita.

6
Jacob

Parametrização redundante em Java:

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

Que outra parametrização de tipo o compilador pensefoo poderia ter?

5
Hoa Long Tam

Como as pessoas já se queixaram de = vs. ==, deixe-me apontar uma alternativa muito pior. PL/eu tinha ambos := e =, but quando algo era "obviamente" uma tarefa, você deixaria escapar o uso de = para fazer isso. Usando := permite forçar algo a ser uma atribuição em uma situação em que o compilador o interpretaria como uma comparação.

Infelizmente, o compilador nem sempre decidiu as coisas da maneira que você poderia esperar. Considere apenas um exemplo óbvio:

A = B = 0;

Agora, para a maioria das pessoas familiarizadas com a maioria das linguagens "comuns", o significado disso é bastante óbvio - atribua 0 a A e B. PL/I é apenas um pouco ... diferente. Por razões conhecidas apenas pelos designers (insanos) da linguagem, o primeiro = é interpretado como uma atribuição, mas o segundo = é interpretado como uma comparação. Portanto, isso compara B a 0 e atribui o resultado dessa comparação a A (seguindo a convenção no estilo C que "false" resulta em 0 e "true" em 1).

Portanto, se B era 0, então A se torna 1. Caso contrário, A se torna 0. Em outras palavras, em vez de atribuir o mesmo valor a A e B, isso realmente garante que A não possa tenha o mesmo valor como B.

Bottom line: mesmo que o estilo C/C++/PHP inicialmente parece como uma dor, a alternativa é muito pior1.

1Bem, tecnicamente, há outra alternativa: estilo Pascal, onde = sempre significa comparação e atribuição sempre requer :=. Depois de usar isso por um tempo, é bastante óbvio (pelo menos para mim) que a tarefa é bastante mais comum do que a comparação. Se você precisar de "coisas" extras para desambiguar os dois, você definitivamente deve manter as tarefas limpas e simples e requer o "grunge" extra nas comparações, não vice-versa.

5
Jerry Coffin

O for ... in constrói em JavaScript e o foreach constrói em PHP ao fazer um loop sobre matrizes. Os dois tornam mais fácil escreva bugs do que o código correto.

3
Joeri Sebrechts

Perl

  1. Desejo que o Perl me deixe escrever if($x < 10) do_something();. No momento, você deve escrever isso como do_something() if($x < 10); ou como if($x < 10) { do_something(); }.
3
Gaurav

reinterpret_cast<unsigned long> em c ++. Essa operação é útil para lidar com APIs estrangeiras e garantir precisão numérica. Por que seria tão difícil digitar e tão feio de se olhar?

3
AShelly

Ponteiros de matrizes ou matrizes de ponteiros em C/C++. Eu ainda estou confuso sobre isso.

2
Casebash

O fato de que Python depende de formatação de texto.

2
Ashalynd

Verbosidade em Java classes anônimas. Esperamos que seja corrigido em breve.

1
alex

structPointer->member em C/C++. Pode ser bom para ler o código de outra pessoa, mas não gosto. Dois caracteres em vez de um ... que desperdício de espaço!

0
Federico klez Culloca

Eu sei que esta é uma pergunta mais antiga, mas como é que ninguém mencionou.

NUGGETS DE CÓDIGO

<% %> <- Regular

<%= %> <- estilo Buffalo

<%:%> <- extra crocante

0
MVCylon

REGEX/preg_match() em PHP

Primeiramente, sua sintaxe é completamente diferente da que PHP usa. Enquanto a função preg_match() emula regex de maneira bastante excelente, eu tenho que mudar completamente meu modo de pensar para trabalhar com ele).

Em segundo lugar, é simplesmente obscurificação metade do tempo. Eu normalmente tenho que literalmente tirar uma almofada de rascunho e descobrir que a WTF está fazendo metade do tempo.

Além disso, eu programa em PHP, não em Perl. Se eu gostasse do Perl, programaria em Perl. (não, senhor, eu não gosto disso.)

Para piorar a situação, com o novo formato delimitador PCRE, você pode praticamente usar qualquer caractere, o que inclui ter que escapar do mesmo caractere aninhado, tornando o padrão ainda mais obscuro.

Claro, é ótimo se você quer ser enigmático ... ou até eficiente ... mas, caramba, a quantidade de tempo gasto para executar tarefas simples normalmente.

0
Talvi Watia

código multi-linhas Scala entre parênteses

Por exemplo:

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

O que você realmente obtém é fantástico. Ele gera o construtor e os getters e setters para você. Mas com certeza é feio e quebra todos os meus modelos mentais de como recuar código e basicamente me deixa como se estivesse em uma espécie de sanduíche bizarro com Java de um lado e LISP do outro (Oh, espere ... esse é o ponto de Scala.)

0
Tom Morris