it-swarm-fr.com

Quel élément de syntaxe détestes-tu le plus dans un langage de programmation que vous utilisez fréquemment?

Peu importe combien vous aimez un langage de programmation, il y a toujours quelques détails qui ne sont pas aussi beauts que possible.

Dans cette question, je voudrais spécifiquement se concentrer sur éléments de syntaxe. Dans un langage de programmation que vous utilisez fréquemment (peut-être votre langage de programmation préféré, ou peut-être que vous êtes obligé d'utiliser au travail), qui Syntaxe Element Vous trouvez-vous le plus illisible, peu clair, gênant ou désagréable?

26
Timwi

Insertion du point-virgule en JavaScript.

Je n'ai souvent pas été mordu par elle souvent, mais c'est une idée aussi phénoménale une mauvaise idée que ma tête tourne.


Voici les règles (de la section 7.9 de l'ECMA-262)

  1. Lorsque le programme contient un jeton qui n'est pas autorisé par la grammaire formelle, un point-virgule est inséré si (a) il y a une pause de ligne à ce point, ou (b) le jeton inattendu était une attelle de fermeture.
  2. Lorsque la fin d'un fichier est atteinte, si le programme ne peut pas être analysé autrement, un point-virgule est inséré.
  3. Lorsqu'une "production restreinte" est rencontrée et contient un terminateur de ligne dans un endroit où la grammaire contient l'annotation "[aucun lineterminateur ici]", un point-virgule est inséré.

Exemple:

return 1; // returns 1

return
1; // returns undefined
39
Tim Goodman

Syntaxe Java-Bean dû au manque de propriétés 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 !!!

Problèmes que j'ai avec cela

  • Trop de code - avoir un champ documenté, une méthode getter documentée et une méthode de setter documentée. Cet exemple extrêmement basique a 20 lignes de code pour A Single Propriété
  • Listes de méthodes de clutters - "Laissez-moi trouver cette méthode, main sur: getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH... ah là-bas là est, hashCode.
  • La zone multiple de la documentation conduit à une documentation pauvre, obsolète ou manquante - ennuyeux lorsque vous essayez de comprendre quel code fait
  • si ennuyant une tierce partie a dû proposer un plugin pour le faire facilement - cuillère , requin , entre autres.
39
TheLQ

Sensibilité aux espaces blanche.

Python m'agace à cet égard. Je veux dire, je tiens correctement de toute façon, mais cela me bugs que je devrais avoir à. Faire de la présentation une partie de la syntaxe Irks moi.

32
Fishtoaster

La déclaration switch (en C, C++, C #, Java, etc.)

Voici un exemple de pourquoi je trouve cela très gênant:

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

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

Cela ne compile pas car la variable i est redéclamé dans la même portée. Cela semble être un détail mineur, mais cela mord vraiment souvent. Je peux ajouter des supports bouclés à l'atténuer, mais cela aurait été bien que les supports bouclés avaient été obligatoires de la syntaxe, et il n'y avait pas de niveau d'indentation supplémentaire redondant. Je déteste aussi vraiment avoir à écrire l'extra break. Ce serait beaucoup plus agréable:

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

Cela fait ressembler davantage à un if/else chaîne, qui est une bonne chose parce qu'elle est aussi similaire aussi. Au moins en C #, ce ne serait toujours pas la même chose cependant, car dans une déclaration switch L'ordre des étiquettes de cas n'a pas d'importance, mais dans un if/else Cela fait.

32
Timwi

Déclarations de tableau dans VB.NET

Je réussis toujours à oublier que lors de l'initialisation des tableaux fixes dans VB.NET, vous spécifiez la limite supérieure de la matrice et non Le nombre d'éléments tels que C/C++, PHP ou Java. En plus de VB6 (nous n'irons pas là-bas ...), je ne peux pas penser à une autre langue qui le fait de cette façon:

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

Commentant à CSS

// ne signalent pas de lignes de code comme dans de nombreuses autres langues, comme PHP et JavaScript. Bien que /* this is commented out */ fonctionne, je préfère utiliser //.

C'est une nuisance, car la moitié du temps que j'oublie, je modifie CSS, puis je dois revenir en arrière et réparer l'erreur.

24
Talvi Watia

PHP - Commande cohérente des arguments

PHP a un certain nombre de fonctions pratiques pour faire à peu près toutes les opérations que vous pouvez penser sur une matrice ou une chaîne. Beaucoup de ces opérations nécessitent d'utiliser à la fois un $needle Et un $haystack, Mais des fonctions différentes les prennent dans des commandes différentes. Quelle fonction exige quels arguments est l'un de ces faits que mon cerveau refuse d'absorber, peu importe la fréquence à laquelle je les rencontre!

Prenez les fonctions In_array et strtstr :

// 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])

Assez drôle, PHP semble être conforme à l'intérieur de ces commandes en ce que toutes les fonctions de chaîne semblent utiliser $haystack, $needle Tandis que les fonctions de tableau sont l'autre, mais cela peut prendre un peu d'utilisation pour quelqu'un de nouveau à php. Il y a un poteau de bons sur expressengine en parlant de cette quirk en particulier, ainsi que d'une discussion sur la PHP Liste des bugs , qui comporte une réponse très courte de l'équipe PHP!

[email protected]
[.____] Utilisez une IDE alors.
20
ConroyP

Python

self Paramètre Par exemple Définitions de la méthode

19
Goran Peroš

Java

Période. Arrêt complet. Fin de l'histoire.

Où commencer? Oh, je sais où commencer: Java est incroyablement compliqué et moche et stupide etintrinsèquement casségénériques. Besoin de dire plus? :( Ok Fine, puis:Tapez Erasure.

Ensuite, il y a une gestion des ressources non déterministes. Kewl Feetcher!

Quelle est la prochaine étape? Oh oui: Regex stupides de Java sont mon boeuf le plus irritant et qui bouillonnent. Je ne peux pas compter combien de fois j'ai été hosté en n'abandissant pas assez de glashes. C'est encore pire que de ne pas avoir accès à des propriétés Unicode à partir de ce millénaire - ce qui est complet taureau.Dix années de fricking hors de la date !!!complètement inutile. La corbeille.

Ensuite, il y a le bogue que les raccourcis de la classe de caractères ne fonctionnent pas sur les non-ASCII. Quelle douleur royale! Et ne considère même pas d'utiliser \p{javaWhiteSpace}; Cela ne fait pas la bonne chose avec plusieurs points de code de type blanche d'unicode très commun.

Saviez-vous qu'il y a une propriété \p{javaJavaIdentifierStart}? WhatwhataThat a-t-il pensé? Je suis ravi qu'ils ont eu des peepers intelligents Wurkin sur Distrong.

Avez-vous déjà essayé d'utiliser le drapeau Canon_eq? Savez-vous quevraimentfait, et ce qu'ilne fonctionne pasfaire? Que diriez-vous de "cas d'unicode"? Un tas de caisses normales ne travaille tout simplement pas du tout.

Ensuite, ils rendent difficilement à écrire des expressions de maintenance. Java Je n'ai toujours pas compris comment écrire des chaînes multilignes, de sorte que vous finissez par écrire des choses insensées comme ceci:

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

Quelles sont toutes ces nouvelles lignes? Oh, juste Java stupidité. Ils ont utilisé Perl Commentaires, pas Java Commentaires (idiots!) Qui va jusqu'à la fin de Ligne. Donc, si vous ne mettez pas ces \n, vous coupez le reste de votre modèle. Duh et double duh!

N'utilisez pas Regexes en Java: vous allez finir par vouloir écraser des choses, tout est si douloureux et brisé. Je ne peux pas croire que les gens montaient cela. Certains ne le font pas .

Ensuite, nous pouvons commencer à parler de non-sens idiot de Java avec des codages. Premièrement, il y a le fait que la plate-forme par défaut codant est toujours un codage boiteux 8 bits, même si les Charchars de Java sont unicode. Ensuite, il y a comment ils ne constituent pas une exception sur une erreur de codage. Vous êtes garanti d'obtenir la merde. Ou comment de cela:

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

Quelle est la différence? Saviez-vous que un seul de ceux qui constitueront une exception si vous avez une erreur de codage? Le reste bloquez-les.

Ensuite, il y a l'idiocy de Java caractères ne suffisant pas pour tenir un personnage! Qu'est-ce qu'ils pensent-ils? C'est pourquoi je les appelle des charchars. Vous devez écrire du code comme celui-ci si vous vous attendez à ce que cela fonctionne. droit:

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

Et Qui JAMAIS JAMAIS JAMAIS pour faire cela? À côté de personne.

Combien de caractères y a-t-il dans "\uD83D\uDCA9"? Un ou deux? Dépend de la façon dont vous les comptez. Le moteur de regex de bien sûr traite des caractères logiques, donc un motif ^.$ réussira et un motif ^..$ échouera. Cette folie est démontrée ici:

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "????" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "????" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "????????" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "????????" }  =~ /^..$/ => matched.

Cet idiocy est tout parce que vous ne pouvez pas écrire le \u1F4A9 parfaitement raisonnable, ni bien sûr, vous n'obtenez-vous aucun avertissement que vous ne pouvez pas faire cela. Cela fait juste la mauvaise chose.

Stooopid.

Pendant que nous y sommes, toute la notation \uXXXX est congénitale du cerveau mort. Le Java Préprocesseur (Oui, vous avez entendu ME) y entre avant Java==. des choses parfaitement raisonnables comme "\u0022", car par le temps Java voit cela, son préprocesseur l'a transformé en """, donc vous perdez. OH Attendez,pas=/Si c'est Dans une regex! Vous pouvez donc utiliser "\\u0022" juste bien.

Riiiiiiiiiighight!

Saviez-vous qu'il n'y a aucun moyen de Java pour faire un appel isatty(0) appelez? Vous n'êtes même pas autorisé à penser de telles pensées. Ce ne serait pas bon pour vous.

Et puis il y a toute l'abomination de la classe de classe.

Ou le fait qu'il n'y a aucun moyen de spécifier le codage de votre Java fichier sourcedans le même fichier source=/donc vous ne le perdez pas? Demande de savoir:qu'est-ce que diable pensaient-ils‽‽‽

Arrète la folie! Je ne peux pas croire que les gens présentant cette poubelle. C'est une blague complète. Je préférerais être un greeter Walmart que de souffrir des élingues et des flèches de scandaleux Java Insanity. Tout est cassé, et ils ne peuvent pas seulement ne pas le réparer, ils ne peuvent pas seulement le réparer, ilsne vont pascorrige-le.

Ceci par le même peuple foxy-gepey qui s'est prisé d'une langue qui l'a rendue illégale d'avoir une fonction printf(). Gee,tandissûr a fonctionné vraiment bien, n'est-ce pas cependant !?

Sheer Numbskulls. La gifle de chienne est trop gentille pour eux. Si je voulais programmer à Assembleur, je le ferais. Ce n'est pas une langue récupérable. L'empereur n'a pas de vêtements.

Nous le détestions. Nous déteste çapour toujours. Laissez-le mourir DieDie!

18
tchrist

Syntaxe de déclaration du pointeur de fonction en C et C++:

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

Cela déclare un pointeur de fonction nommé f dont le pointe peut prendre deux ints et renvoyer un int.

Je préférerais de loin une syntaxe comme celle-ci:

f: (int, int) => int

Disons que vous voulez déclarer un pointeur de fonction g dont le pointe peut prendre deux ints et une fonction de int et int à int, et renvoyer un int.

Avec la notation C ou C++, vous le déclareriez comme suit:

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

Avec la notation proposée ci-dessus, la même chose peut être déclarée:

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

Ce dernier est beaucoup plus intuitif imo.


Mis à part: la langue de programmation appelée OOC corrige cette syntaxe (et diverses autres problèmes syntaxiques en C et C++). Consultez sa page d'accueil ici .

16
missingfaktor

Verbosité en Java.

c'est à dire:

public static final int 
14
OscarRyz

\ WE\WE\WILLTNT\FIX\Notre syntaxe de noms\parser dans php

La syntaxe n'est pas seulement laide, elle mène à la confusion lorsque de nouveaux développeurs doivent penser aux espaces de noms dans les chaînes. (PHP interpolate les backslashes dans des chaînes à double cotation sous forme de séquences d'échappement. Essayer de représenter un espace de noms comme \you\should\never\do\that Dans une chaîne à double cote au lieu d'une chaîne unique citée conduira à de nouvelles lignes, onglets et catastrophe.)

12
mario

VBScript n'a pas d'opérateurs logiques

Contrairement à presque tous les langages sensibles, VBScript utilise des opérateurs bitwises au lieu d'opérateurs logiques. Qu'est-ce que cela signifie dans la pratique? Eh bien, comme Eric Lippert souligne :

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

et

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

ne sont pas les mêmes dans VBScript!

Pire encore, cependant, cela signifie qu'il n'y a pas d'évaluation de court-circuit dans VBScript afin que la déclaration suivante crash Votre programme si Blah est Nothing

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

C'est vrai, VBScript évaluera à la fois parties de la région et de comparaison, même si le premier est faux! Il suffit de laisser ça couler dans ...

9
Dan Diplo

Je méprise le fait que les accolades bouclées peuvent être facultatives après une déclaration IF/TIM/pour la déclaration.

Surtout quand je vois du code comme,

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

S'il vous plaît, mettez simplement les accolades et faites avec elle.

9
Jim A

Edit: Après la discussion dans les commentaires, j'ai décidé de mettre à jour cette réponse pour mieux m'expliquer.

Je déteste vraiment la façon dont les pointeurs de la fonction se ressemblent à C. Habituellement, toute déclaration variable ressemble à un tuple de: type varname; Les déclarations du pointeur de fonction d'autre part ressemblent à une déclaration de la fonction avec * avant le nom de la fonction. Je peux l'accepter comme une description d'un type de pointeur, mais en C, cela déclare à la fois le type et le nom d'une variable de ce type. Cela me semble incompatible parce que les déclarations de type sont autrement distinctes des déclarations variables. struct myStruct{int X; int Y;} définit uniquement un type, il ne définit pas une variable nommée myStruct. De même, je ne vois aucune raison pour les déclarations de type et les déclarations variables à regrouper en un Atomic instruction dans les pointeurs de la fonction, ni j'apprécie la déviation de la type varname; structure.

Quelqu'un a souligné que cela est cohérent avec une règle spirale, et cela peut être le cas, mais la marque d'une bonne syntaxe est qu'elle est explicite et sa logique interne est évidente. La règle spirale n'est pas évidente par aucun moyen.

7
EpsilonVector

Arguments d'entrée/sortie. Je suis tout pour dans des arguments (bonne chose que je suis), les arguments sont bien aussi, mais un argument qui doit transmettre ces deux états me fait chier.

Ce que je cible ici, ce sont des fonctions qui apportent une entrée à partir d'un paramètre, puis écrasez cette entrée avec certaines sorties. Il est normal de passer un objet en référence à la mise à jour. Mais, principalement pour les types primitifs, prenant un objet, l'utiliser, puis le changer complètement, n'est pas juste par moi. Vous ne devriez pas changer le Sens de l'argument à travers une inuite.

6
zneak

Points-virgules dans VBScript - ou le manque de celui-ci

Je passe toute la journée à travailler dans des langues qui attendent des points-virgules à la fin de chaque ligne. Ajoutez-en une à la fin de la ligne dans VBScript et votre code ne fonctionne plus.

6
Nathan Taylor

Déclarations de tableau en C et C++.

Typiquement, une déclaration variable est du format type variable_name. Vous pouvez facilement lire ces déclarations de gauche à droite. Mais int foo[size] regarde d'abord comme s'il déclare foo comme INT, puis vous lisez plus loin et voyez que FOO de type "gamme de nombres entiers". int[size] foo lit beaucoup mieux.

Et je déteste aussi que les programmeurs déclarent des pointeurs comme celui-ci pour une raison similaire: int *foo. Pour une raison quelconque, je n'ai pas compris, c'est le typique Way, c'est écrit.

6
Jacob

Le pour ... in Construction dans JavaScript et le foreach CONSTRUCTION IN PHP lorsque vous bouleversez des tableaux. Les deux facilitent la tâche de Écrivez des bugs que CORRECT CODE.

3
Joeri Sebrechts

Perl

  1. Je souhaite Perl laissez-moi écrire if($x < 10) do_something();. Pour le moment, vous devez écrire cela comme étant do_something() if($x < 10); ou comme if($x < 10) { do_something(); }.
3
Gaurav

reinterpret_cast<unsigned long> en C++. Cette opération est utile pour traiter des API étrangères et assurer une précision numérique, pourquoi devrait-elle être une telle douleur à taper et si laide à regarder?

3
AShelly

Pointeurs de tableaux ou de tableaux de pointeurs en C/C++. Je suis toujours confondu à ce sujet.

2
Casebash

Verbosité In Java classes anonymes. J'espère être corrigé bientôt.

1
alex

structPointer->member en C/C++. Peut être bon pour lire le code de quelqu'un d'autre, mais je n'aime pas ça. Deux personnages au lieu d'un ... Quel gaspillage d'espace!

0

Je sais que c'est une question plus âgée, mais comment ne vient personne mentionné.

Nugets de code

<% %> <- régulier

<%= %> <- style buffalo

<%:%> <- extra croustillant

0
MVCylon

Regex/preg_match() en PHP

Premièrement, sa syntaxe complètement différente de PHP utilise. Tandis que la fonction preg_match() La fonction émule assez d'excellence, je dois changer complètement mon mode de pensée pour y travailler.

Deuxièmement, c'est juste obscurification simple la moitié du temps. Je dois habituellement assez littéralement enlever un coussinet à gratter et comprendre WTF de faire la moitié du temps.

En outre, je programme en PHP, pas Perl. Si j'aimais Perl, je vais programmer à Perl. (Non, monsieur je n'aime pas ça.)

Pour aggraver les choses, avec le nouveau format de délimiteur PCRE, vous pouvez pratiquement utiliser n'importe quel caractère, ce qui inclut avoir à échapper à ce même caractère imbriqué, ce qui rend le modèle encore plus obscur.

Bien sûr, c'est génial si vous voulez être cryptique .. ou même efficace ... mais Holy Hell, la quantité de temps qu'il décheve normalement effectuer des tâches simples.

0
Talvi Watia

code multiligne scala entre crochets

Par exemple:

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

Ce que vous en obtenez réellement est formidable. Il génère le constructeur et les getters et les setters pour vous. Mais c'est sûr que c'est laid et enfreint tous mes modèles mental de la façon de passer du code et me laisse fondamentalement me sentir comme si je suis dans une sorte de sandwich bizarre avec Java sur un côté et lisp de l'autre . (Oh, attendez ... c'est plutôt le point de Scala.)

0
Tom Morris