Quelles sont les cinq choses que vous détestez dans votre langue préférée? [fermé]

il y a eu un groupe de Perl-hate sur Stack Overflow dernièrement, donc j'ai pensé que je pourrais apporter mon " cinq choses que vous détestez à propos de votre langue préférée " question à Stack Overflow. Prends ta langue préférée et dis-moi cinq choses que tu détestes. Ce sont peut-être des choses qui vous ennuient, des défauts de conception admis, des problèmes de performance reconnus, ou toute autre catégorie. Tu dois la détester, et ça doit être ta langue préférée.

Ne le compare pas à une autre langue, et ne parle pas de langues que tu détestes déjà. Ne parlons pas des choses que vous aimez dans votre langue préférée. Je veux juste entendre les choses que tu détestes mais que tu tolères pour que tu puisses utiliser toutes les autres choses, et je veux l'entendre à propos du langage que tu voulais que les autres utilisent.

je pose cette question chaque fois que quelqu'un essaie de me pousser sa langue préférée, et parfois comme une question d'entrevue. Si quelqu'un n'en trouve pas cinq les choses à détester à propos de son outil préféré, il ne le sait pas assez bien pour le défendre ou tirer dans les gros dollars en l'utilisant. Il ne l'a pas utilisé dans assez de situations différentes pour l'explorer complètement. Il le prône comme une culture ou une religion, ce qui veut dire que si Je ne choisis pas sa technologie préférée, j'ai tort.

peu m'importe la langue que vous utilisez. Vous ne voulez pas utiliser une langue particulière? Alors ne le fais pas. Vous faites preuve de diligence raisonnable pour faire un choix éclairé et encore ne l'utilise pas? Fin. Parfois, la bonne réponse est "vous avez une équipe de programmation forte avec de bonnes pratiques et beaucoup d'expérience dans le Bar. Changer en Foo serait stupide."


C'est une bonne question pour les revues de code. Les personnes qui connaissent vraiment une base de données auront toutes sortes de suggestions pour elle, et ceux qui ne la connaissent pas si bien ont des plaintes non spécifiques. Je demande des choses comme "Si vous pouviez recommencer sur ce projet, ce serait - vous différemment?"Dans ce monde imaginaire, les utilisateurs et les programmeurs peuvent se plaindre de tout ce qu'ils n'aiment pas. "Je veux une meilleure interface"," je veux séparer le modèle de la vue"," j'utiliserais ce module au lieu de cet autre"," je renommerais cet ensemble de méthodes", ou tout ce qu'ils n'aiment pas vraiment de la situation actuelle. C'est comme ça que je gère ce qu'un développeur en particulier sait sur la base de code. C'est aussi un indice sur la part de l'ego du programmeur attaché à ce qu'il me dit.

la haine n'est pas la seule dimension pour comprendre ce que les gens savent, mais je l'ai trouvé assez bon. Les choses qu'ils détestent me donnent aussi un indice de la façon dont ils pensent au sujet.

404
demandé sur brian d foy 2008-11-12 01:14:43
la source

30 ответов

cinq choses que je déteste à propos de Java:

  • pas de fonctions de première classe.
  • pas d'inférence de type.
  • manque de sane par défaut dans les graphiques eg.
  • NullPointerException ne contenant pas plus d'informations sur ce qui est null.
  • La prolifération des inutilement "configurable" cadres/service des interfaces du fournisseur/usine de classes/d'injection de dépendance des systèmes. Configurabilité n'est presque jamais utilisé, sec est violé de façon flagrante, et code quadruples dans la taille et les moitiés dans la lisibilité.

je sais, je devrais aller voir Scala.

182
répondu Zarkonnen 2008-11-24 19:04:07
la source

Wow, je suis surpris que SQL n'ait pas encore été inventé ici. Suppose que cela signifie que personne ne l'aime :)

  • syntaxe incohérente entre les implémentations
  • Subtil code différences peuvent avoir une énorme performance ramifications apparemment pour des raisons obscures
  • faible soutien à la manipulation de texte
  • coût D'entrée facile, mais courbe d'apprentissage raide vers la maîtrise de la langue
  • standardisation minimale au sein de la communauté pour les meilleures pratiques, Cela inclut le style syntaxique.

...Et quelques raisons supplémentaires de détester, sans frais supplémentaires

  • la clause WHERE goes last, ce qui rend facile d'exécuter prématurément une mise à jour ou supprimer, détruisant la table entière. Au lieu de cela, L'où devrait aller quelque part à l'avant.
  • il est difficile de mettre en œuvre relationnel division.
  • je peux définir une valeur à NULL, mais je ne peux pas la tester pour l'égalité avec NULL. Je peux vérifier que C'est nul, mais ça complique le code -- inutilement, à mon avis.
  • Pourquoi faut-il respecifier complètement la formule D'une colonne groupée, plutôt que de mettre un alias sur la colonne et ensuite Grouper par l'alias (ou index de colonne comme avec SORT)?
216
répondu 3 revs, 3 users 57%Jeremiah Peschka 2010-05-26 02:10:44
la source

JavaScript :

  1. toutes les choses les plus fraîches sont insanely complexes, mais alors, toute la fraîcheur est également enveloppé dans une telle petite quantité de code que vous vous sentez stupide pour lutter pour le suivre

  2. ' + ' est un choix absurde d'opérateur pour concaténation dans une langue faiblement typée. Étaient-ils essayant d'effrayer les noobs?

  3. C'est une compatibilité inter-navigateur champ de mines (tant pis si c'est encore allumé ou non)

  4. il est généralement non fiable - associé à des saletés telles que le blocage du bouton arrière, pop-ups qui ne meurent jamais, etc.

  5. il est presque impossible de déboguer car il n'y a que quelques messages d'erreur différents et quelques types différents (Nombre, chaîne, objet, etc.)

si ce n'était pas pour jQuery, je le détesterais probablement encore autant qu'avant:)

160
répondu jTresidder 2015-04-26 21:44:10
la source

PHP:

1) me force à faire des variables inutiles:

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

2) une implémentation de lambdas si boiteuse qu'elle est à peu près équivalente à l'utilisation de eval() et si affreusement erronée que je ne l'ai jamais utilisée (voir http://www.php.net/create_function ).

3) un système try/catch qui ne peut capter qu'environ 80% des erreurs qui pourraient se produire.

4) Support Regex tout aussi boiteux comme le soutien lambda parce qu'il doit être écrit à l'intérieur des cordes régulières, ce qui rend l'un des outils de programmation les plus difficiles à apprendre environ trois fois plus difficile. Et PHP est supposé être un langage" facile"?!?!?

5) aucun moyen de tirer en toute sécurité des choses hors de $_POST sans l'écrire deux fois ou la construction de votre propre fonction, ou en utilisant l'opérateur'@':

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

6) réponse Bonus:'@'. Si vous ne pouvez pas être ennuyé à écrire votre code correctement, il suffit d'ajouter'@', et dommage pour ceux qui doivent déboguer votre code plus tard.

149
répondu 3 revs, 3 users 94%too much php 2012-10-10 23:04:35
la source

C++

  • beaucoup trop facile de corrompre la mémoire au hasard et de créer presque impossible de trouver des bogues (bien que, Valgrind va un long chemin vers la réparation de ce).
  • messages D'erreur de modèle.
  • lorsque vous utilisez des modèles, il est facile de finir par devoir tout inclure dans un fichier, puis obtenir stupide temps de compilation.
  • la bibliothèque standard est une blague à l'ère moderne (toujours pas de fils ou de réseau par défaut?)
  • Beaucoup de méchants petits morceaux de C piquer à travers (en particulier, toutes les conversions entre court/int/unsigned/etc..)
135
répondu 3 revs, 3 users 57%Chris Jefferson 2010-08-07 14:15:28
la source

C# / .NET:

  • les Classes doivent être scellées par défaut
  • il ne devrait pas y avoir de déclaration lock - au lieu de cela, vous devriez avoir des objets de verrouillage spécifiques, et il devrait y avoir des méthodes telles que Acquire qui renvoient des jetons de verrouillage jetables. Corollaire: il ne devrait pas y avoir de moniteur pour chaque objet.
  • GetHashCode() et Equals() ne devrait pas être dans System.Object - tout n'est pas adapté pour de hachage. Au lieu de cela, avoir un IdentityComparer qui fait la même chose, et garder le IComparer<T> , IComparable<T> , IEqualityComparer<T> et IEquatable<T> interfaces pour des comparaisons personnalisées.
  • le soutien des Pauvres pour l'immutabilité
  • mauvaise façon de découvrir les méthodes d'extension - ce devrait être une décision beaucoup plus consciente que juste le fait que j'utilise un espace-nom.

ceux qui étaient sur le dessus de ma tête - demandez-moi demain et Je vais venir avec un autre 5 :)

129
répondu Jon Skeet 2008-11-12 01:21:00
la source

C

  • la manipulation de la chaîne.

avoir à traiter manuellement avec les tampons de chaîne est une douleur sujette aux erreurs. Puisque tant de calcul est en train de bouger et de modifier les chaînes de caractères (les ordinateurs ne sont pas utilisés autant pour les gros numéros que les gens pensaient qu'ils le seraient à l'époque), c'est vraiment agréable d'être capable d'utiliser des langues gérées ou des objets C++string pour traiter ces derniers. Quand j'ai à faire à droite C, c'est comme nager dans des sables mouvants.

113
répondu Michael Burr 2008-11-12 01:27:42
la source

Que Diriez-vous de cinq choses que je déteste à propos de "choses que je déteste à propos de certaines langues" listes? : D

5-peindre un rouge orange n'en fait pas une pomme.

quand un langage est conçu, les concepteurs ont généralement à l'esprit ce qu'il est utile pour. L'utiliser pour quelque chose de complètement différent peut travailler, mais se plaindre quand il n'est pas est tout simplement stupide. Prends Python. Je suis sûr que quelqu'un a ou quelqu'un un jour, créez un utilitaire pour créer des exe à partir du code Python. Pourquoi diable voudriez-vous vouloir pour faire cela? Il serait soigné-ne vous méprenez pas-mais il n'est pas utilisé. Alors cessez de vous plaindre!

un projet bien conçu contiendrait probablement du code provenant de plusieurs langues. Cela ne veut pas dire que vous ne pouvez pas terminer un projet avec une seule langue. Certains projets peuvent être bien dans les capacités de n'importe quelle langue que vous utilisez.

4 - êtes-vous debout sur des pieds de bois?

la plateforme peut être une grande influence de ce que le langage peut faire. Avec les éboueurs de nos jours, ou bien même pascals tentative précoce de "collecte des ordures", peut aider à la mémoire fondu (peut-être malloc plus de ram??). Les ordinateurs sont plus rapides et donc, bien sûr, nous attendons plus de nos langues. Et franchement, on devrait probablement. Cependant, il y a un prix énorme à payer pour la commodité du compilateur de créer tables ou cordes de hachage ou une variété d'autres concepts. Ces choses ne peuvent pas être héritées à la plate-forme dont ils sont utilisés. Pour dire qu'ils sont faciles à inclure à une langue juste me dit que vous pouvez ne pas avoir une jambe à tenir sur.

3-qui est fautif?

Bugs. Vous savez. J'aime bugs. Pourquoi ai-je l'amour de bugs. Parce que ça veut dire que je peux garder mon boulot. Sans bestioles, il y aurait beaucoup de pizzerias fermées. Cependant, les utilisateurs détestent bugs. Mais voici une petite giclée d'eau froide. Chaque bug est la faute du programmeur. Pas la langue. Un langage avec une syntaxe aussi stricte qui réduirait de manière significative le nombre de bogues pouvant être générés serait un langage complètement inutile. Ses capacités pourraient probablement être comptées sur une main. Vous voulez de la flexibilité ou du pouvoir? Vous avez des bugs. Pourquoi? Parce que tu n'es pas parfait, et tu fais des erreurs. Prenez un exemple vraiment identifiable en C:

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

Nous savons tous ce que cela va faire. Cependant, ce que certains d'entre nous ne réalisent peut-être pas.. cette fonctionnalité peut être très bénéfique. En fonction de ce que vous faites. Les dépassements de tampon sont le coût de cette fonctionnalité. Le code ci-dessus. Si j'ai effectivement publié que pour le public. C'est de nouveau.. dites-le avec moi.. "Ma faute". Pas C pour m'avoir permis de le faire.

2-ne devrions-nous pas le mettre dans la corbeille?

il est très facile de pointer du doigt une caractéristique d'un langage que nous ne comprenons pas parce que nous ne l'utilisons pas souvent et ne l'appelons pas stupide. Se plaindre qu'il est là, etc. Goto m'amuse toujours. Les gens se plaignent toujours que goto soit dans une langue. Je parie que votre dernier programme incluait un type de goto. Si vous avez déjà utilisé une pause ou continuer, vous avez utilisé un goto. C'est ce qu'il est. Certes, c'est un goto" sûr", mais c'est ce que c'est. Les Goto ont leur utilité. Si les gotos" implicites " comme continuer ou break sont utilisés ou gotos explicites (en utilisant le mot-clé réel "goto" pour quelque langue que ce soit). Non pas que les développeurs de langue sont sans faille, mais typiquement... si la fonctionnalité existe depuis l'aube des temps (pour la langue). Il est probable que cet aspect est une qualité déterminante de cette langue. Sens.. il est utilisé et ne traîne probablement pas à cause de la rétrocompatibilité. Il est utilisé aujourd'hui. D'autant plus que 5 minutes auparavant. Et utilisé correctement. Bien.. sans doute quelqu'un l'utilise mal que de bien, mais ça concerne le N ° 3 de ma liste.

1. - Tout est un objet.

Ok.. celui-ci est en fait un sous-ensemble du #2. Mais c'est de loin la plainte la plus agaçante que je vois dans les listes de haine. Tout n'est pas un objet. Il y a un grand nombre de concepts qui n'appartiennent pas ou qui doivent être des objets. Mettre les choses où ils n'appartiennent pas est juste laid et peut diminuer l'efficacité d'un programme. Assurer. Peut-être pas beaucoup en fonction de la langue. Cela concerne également le point 5. Ce moyen... oui. Le mondial sont ok. Les fonctions appliquées aux méthodes statiques sont correctes. Combiner la programmation OO avec des fonctions globales est acceptable. Maintenant.. cela ne veut pas dire que nous devrions tous sortir et "libérer" notre code de ses modèles d'objets non plus. Lors de la conception d'une section de code ou d'un projet entier, ce qui se passe dans les coulisses devrait être pris en compte lors de sa mise en place. Pas seulement là où ce concept vit et beaucoup d'autres facteurs. Pourquoi wrap global fonctions à l'intérieur des classes ou nommer des concepts d'espace si cela ne sert à rien? Prenez les variables statiques des membres. Qui amuse beaucoup de moi parce que.. bien..En fonction du langage et de la mise en œuvre, bien sûr, mais en général, vous venez de déclarer un global. Oui, il y a des raisons d'envelopper ces concepts non-OO dans des emballages OO. L'une étant évidemment le code d'auto-documentation. Qui peut faire sens. Si.. comme je l'ai dit. Ne sors pas et" libère " ton code. Mais toute bonne langue moderne aura un concept global en dehors de ça OO modélisation. Oui, je veux préciser qu'un langage de programmation OO sans concept global présente très probablement un défaut de conception sérieux. Encore une fois cependant.. cela dépend de l'intention et de la conception du langage, donc je n'essaie pas de choisir un langage spécifique et il y en a beaucoup trop à analyser ici. Quoi qu'il en soit, pensez à l'endroit où le code devrait vivre et être le plus efficace. Ajouter un tas d'éclat à quelque chose qui n'ajoute pas la fonctionnalité ou le soutien juste porte des vers le bas du clavier plus vite. Il n'est pas n'importe qui tout de bon. Bien.. sauf si tu aimes les points de brownie de la personne qui t'a probablement mal appris que tout est un objet.

en bref, la programmation n'est pas qu'un simple tapotement sur le clavier. Il y a beaucoup de considérations de conception à tout projet. Je sais que c'est cliché, mais, vous avez à regarder sous tous les angles. Même avec les langages de type-sûr de nos jours. Vous ne vous contentez pas chuck code et espérer qu'il fonctionne bien. Assurer.. cela fonctionne peut-être, mais ce n'est peut-être pas la bonne façon de procéder. Dans l'ensemble, choisissez le langage et le format qui conviennent le mieux au travail et à l'environnement. Mais non langue enlève la pensée derrière elle. Si vous ne pensez pas.. vous avez juste à taper.

94
répondu 5 revs, 4 users 64%unknown 2010-08-23 07:39:30
la source

cinq choses que je déteste au sujet de Java (qui, actuellement, est ma langue préférée) dans aucun ordre particulier.

  1. même si je suis un fan de Java Generics, il y a beaucoup d'étrangetés qui découlent de la façon dont il a été conçu. Ainsi, il y a une myriade de limitations ennuyeuses avec les génériques (dont certaines sont le résultat de l'effacement de type).
  2. Le chemin de l'Objet.clone () et le travail des interfaces Clonables est totalement cassé.
  3. au lieu de prendre la voie haute et de faire tout un objet (A. la. SmallTalk), Sun wimped out a créé deux catégories distinctes de types de données: les objets et les primitives. En conséquence, il ya maintenant deux représentations pour les types de données fondamentales et curiosités comme la boxe/Unbox et ne pas être en mesure de mettre des primitifs dans une Collection.
  4. Swing est trop complexe. Ne vous méprenez pas: il y a beaucoup de trucs cool un peut faire avec Swing mais il est un excellent exemple de sur-Ingénierie.
  5. cette plainte finale est également la faute de Sun et de ceux qui ont écrit des bibliothèques XML pour Java. Les bibliothèques XML Java sont beaucoup trop compliquées. Afin de lire simplement dans un fichier XML, je dois souvent me soucier de l'analyseur que j'utilise: DOM ou SAX? Les IPA de chacun sont tout aussi déroutants. Support natif dans la langue pour facilement parsing/writing XML serait très agréable.
  6. de java.util.Date suce. Non seulement elle est inutilement compliquée, mais toutes les méthodes utiles ont été dépréciées (et remplacées par d'autres qui augmentent la complexité).
88
répondu 4 revs, 3 users 76%Ryan Delucchi 2010-08-07 13:41:56
la source

Ruby a beaucoup de défauts liés à sa vitesse, mais je ne les déteste pas. Il y a aussi des défauts à ce que l'évangélisation communautaire soit exagérée, mais cela ne me dérange pas vraiment. Voici ce que je déteste:

  • les fermetures (blocs) ont 4 syntaxes de création différentes, et aucune d'elles n'est optimale. La syntaxe élégante est incomplète et ambiguë avec des hachures, et la syntaxe complète est laide.
  • la communauté tend à être contre la vraie documentation, en favorisant "lire le code". Je trouve cela puéril et paresseux.
  • les abus de programmation, en particulier dans les bibliothèques, font des bogues un cauchemar à traquer.
  • sur une note connexe, la métaprogrammation envahissante rend un IDE complet difficile, voire impossible à faire.
  • la façon dont le bloc passe aux fonctions est stupide. Il n'y a aucune raison pour que les blocs soient passés en dehors de la liste des paramètres, ou avoir une syntaxe spéciale impaire pour accéder (rendement). Je suis d'avis que les blocs auraient dû recevoir une syntaxe moins ambiguë (ou les hachages auraient pu utiliser des délimiteurs différents; peut-être <> plutôt que {}), et le passage en tant que paramètres aux méthodes aurait dû être exactement comme tous les autres paramètres.

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

    ces bizarreries, comme le bloc doit être le dernier paramètre passé et passer plus d'un bloc est différent avec une syntaxe plus longue, m'ennuie vraiment.

73
répondu 3 revs, 3 users 77%Myrddin Emrys 2010-05-23 15:48:03
la source

Perl

  • Utilisation Mixte de sigils

    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;
    
    • Pour l'exemple none de ces sont les mêmes:

      $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'
      

    Dans Perl6 il est écrit :

    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;
    
  • Manque de vrai OO

    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'}
    }
    

    Dans Perl6 il est écrit :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • éléments regex mal conçus

    /(?=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
    

    Dans Perl6 il est écrit :

    / <?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
    
  • absence d'expédition multiple

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

    Dans Perl6 il est écrit :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • surcharge de L'opérateur pauvre

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

    Dans Perl6 il est écrit :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    
72
répondu 11 revs, 3 users 97%Brad Gilbert 2010-08-26 20:14:08
la source

je vais le faire PHP comme j'aime à la fois et Python sera fait de façon trop.

  • Aucun espace de noms; tout est dans un sorte de très grand espace de noms qui est l'enfer dans les grands environnements

  • manque de normes lorsqu'il s'agit de fonctions: les fonctions de tableau prennent un aiguille comme premier argument, botte de foin comme deuxième (voir array_search ). Les fonctions de chaîne souvent les une botte de foin en premier, une aiguille en second (voir strpos ). Autres fonctions de la utiliser différents systèmes de nommage: bin2hex , strtolower , cal_to_jd

    certaines fonctions ont un retour bizarre valeurs, hors de ce qui est normal: ce vous force à avoir une troisième variable déclaré de nulle part alors que PHP pourrait interpréter efficacement un vide tableau as false avec son type jongler. Il y a près pas d'autres fonctions faire de même.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • la langue (jusqu'à PHP6) fait son mieux respecter un quasi-attardé la compatibilité descendante, la rendant effectuer des mauvaises pratiques et des fonctions autour lorsqu'il n'est pas nécessaire (voir mysql_escape_string vs. mysql_real_escape_string ).

  • création de modèles de langue pour un plein backend. Cela signifie que quelqu'un de sortie peut rien quand ils le veulent, et ça devient abusé. Vous vous retrouvez avec moteurs de gabarits pour un modèle langue...

  • ça craint à l'importation de fichiers. Vous 4 façons différentes de le faire (inclure, inclure, exiger, requer_once) , ils sont tous lents, très lent. En fait, l'ensemble de la langue est lente. Au moins, assez plus lent que python (même avec un cadre) et RoR de ce que I rassembler.

j'aime toujours PHP, cependant. C'est la tronçonneuse du développement web: vous voulez un site petit à moyen fait très vite et être sûr que n'importe qui peut l'héberger (bien que les configurations peuvent différer)? PHP est juste là, et c'est tellement omniprésent qu'il ne faut que 5 minutes pour installer une lampe pleine ou une pile WAMP. Je retourne travailler avec Python...

58
répondu 4 revs, 3 users 94%I GIVE TERRIBLE ADVICE 2010-08-07 14:25:58
la source

Voici certaines choses que je n'aime pas en Java (qui n'est pas ma langue préférée):

  • Génériques type d'effacement (c'est à dire pas réifiée génériques)
  • incapacité de capturer plusieurs exceptions (de types différents) dans un même bloc de capture
  • Manque de destructeurs (finalize() est un très mauvais substitut)
  • pas de support pour les fermetures ou le traitement des fonctions en tant que données (classes internes anonymes sont un très verbose suppléant)
  • exceptions vérifiées en général, ou plus spécifiquement, en faisant des exceptions non récupérables vérifiées (p.ex. SQLException)
  • Pas de la langue de support au niveau littéral collections
  • pas d'inférence de type lorsque les constructeurs de classes génériques sont appelés, c'est-à-dire que le(S) paramètre (s) de type doit (doivent) être répété (s) des deux côtés du " = "
50
répondu 4 revsDon 2010-09-01 18:35:36
la source

C++

  1. La Syntaxe Du Modèle
  2. Diamant problèmes de Succession
  3. La pléthore/manque de bibliothèques langues modernes ont (bien que boost vient de fermer).
  4. Iostrèmes
  5. la syntaxe utilisée autour de iostream

Python

  1. les espaces sont significatif (parfois)
  2. mots clés soulignés
  3. soutien de fil limité (au moins actuellement)
  4. "self" au lieu de" this "
  5. les espaces sont significatifs (parfois)
40
répondu grieve 2008-11-12 01:26:42
la source

Objectif-C

1) Pas de namespaces, juste des conventions de nommage manuelles - cela ne me dérange pas en termes de séparation de classe, mais ça me manque de pouvoir importer toutes les définitions de classe dans un namespace en une seule ligne (comme import com.moi.somelibrary.*).

2) les bibliothèques ont encore des trous dans des domaines importants comme le support RegEx.

3) la syntaxe de propriété est un peu maladroite, nécessitant trois lignes (en deux fichiers distincts) pour déclarer une propriété.

4) j'aime le modèle retain/release, mais il est plus facile qu'il ne devrait l'être de libérer une référence et de l'utiliser accidentellement plus tard.

5) Bien qu'il ne s'agisse pas vraiment d'une fonctionnalité de langage, Xcode est si intimement lié à L'utilisation D'objectif-C que je ne peux m'empêcher de penser à cet aspect... fondamentalement, l'autocomplétion, est très douteux. C'est plus comme un système qui vous récompense pour trouver quelque chose que vous voulez existe, et puis il présente comme un choix après. Mais je suppose que je n'ai jamais aimé les moteurs à semi-conducteurs.

37
répondu 3 revs, 3 users 79%Kendall Helmstetter Gelner 2010-05-29 03:02:13
la source

C++

  • des ficelles.

    Ils ne sont pas interopérables avec les chaînes de plate-forme, donc vous finissez par utiliser std::vector la moitié du temps. La Politique de copie (copie en écriture ou copie profonde) n'est pas définie, de sorte que les garanties de performance ne peuvent pas être données pour une syntaxe simple. Parfois, ils s'appuient sur des algorithmes STL qui ne sont pas très intuitifs à utiliser. Trop de bibliothèques roulent leurs propres qui sont malheureusement beaucoup plus confortable à utiliser. Sauf si tu dois les combiner.

  • Variété de représentations de chaîne

    Maintenant, c'est un petit problème de plate - forme-mais j'espère toujours que ça aurait été mieux quand une classe de corde standard moins obstinée aurait été disponible plus tôt. Les représentations de chaîne suivantes que j'utilise fréquemment:

    • Générique LPCTSTR,
    • LPC(W)STR allocated by CoTaskMemAlloc,
    • BSTR, _bstr _t
    • (w)chaîne de caractères,
    • CString,
    • std:: vector
    • un rouleau de-mon-propre classe ( soupir ) qui ajoute de la plage de vérification et les opérations de base de a (w)char * tampon de longueur connue
  • modèle de construction.

    J'en ai assez de tout le temps passé à me mêler de qui-inclut-quoi, des déclarations avancées, à optimiser des en-têtes précompilés et inclut de garder au moins des temps de construction incrémentiels supportables, etc. C'était génial dans les années 80, mais maintenant? Il y a tellement d'obstacles à l'emballage d'un morceau de code pour qu'il puisse être réutilisé que même le chien des mamans s'ennuie à m'écouter.

  • Difficile à analyser

    Cela rend les outils externes particulièrement difficiles à écrire, et obtenir le droit. Et aujourd'hui, nous, les gars de C++, on manque surtout de la chaîne d'outils. J'aime ma réflexion et les délégués mais je peux vivre sans eux. Sans grand remaniement, Je ne peux pas.

  • le filetage est trop dur

    Le langage ne le reconnaît même pas (maintenant), et les libertés du compilateur - bien que grandes - sont trop douloureuses.

  • initialisation statique et à la demande Techniquement, je triche ici: il s'agit d'une autre pièce de puzzle dans le "code de récapitulation pour la réutilisation": c'est un cauchemar d'obtenir quelque chose initialisé seulement quand il est nécessaire. La meilleure solution à tous les autres problèmes redist est de tout jeter dans les en-têtes, ce problème dit "neeener - vous ne pouvez pas".


D'accord, beaucoup de cela est au-delà de la rigueur du langage, L'ensemble de la chaîne d'outils doit être jugé et évoluer.

36
répondu 3 revs, 3 users 93%peterchen 2010-05-25 22:27:48
la source

JavaScript :

  • le prototype Object peut être modifié. Chaque objet de votre programme obtient de nouvelles propriétés, et quelque chose se casse probablement.

  • tous les objets sont des cartes hash, mais il est difficile de les utiliser en toute sécurité comme tels. En particulier, si un de vos clés se trouve être __proto__ , vous êtes en difficulté.

  • pas de fermeture d'objet au moment de référence de la fonction. En fait, pas de fermeture d'objet du tout -- au lieu de cela, this est défini chaque fois qu'une fonction est appelée avec la notation d'objet ou l'opérateur new . Il en résulte beaucoup de confusion, en particulier lors de la création de callbacks d'événements, parce que this n'est pas défini à ce que le programmeur attend.

    • corollaire: appeler une fonction sans notation d'objet ou L'opérateur new a pour résultat que this est réglé sur l'objet global, ce qui entraîne beaucoup de bris.
  • Outre opérateur surchargé également effectuer la concaténation de chaîne, malgré les deux opérations étant fondamentalement différents. Résulte en douleur quand une valeur que vous attendez d'être un nombre est en fait une chaîne.

  • == et != les opérateurs de type coercition. Les comparaisons entre les différents types impliquent une liste de règles dont aucun mortel ne peut se souvenir pleinement. Cette situation est atténuée par l'existence des exploitants === et !== .

  • les deux null et undefined existent, avec des significations subtilement différentes, mais redondantes. Pourquoi?

  • Bizarre syntaxe pour la création de prototypes de chaînes.

  • parseInt(s) attend un nombre de style C, donc traite les valeurs avec des zéros de tête comme octal, etc. Vous pouvez au moins parseInt(s, 10) mais le comportement par défaut est déroutant.

  • Pas de bloc de portée.

  • peut déclarer la même variable plus d'une fois.

  • peut utiliser une variable sans la déclarer, auquel cas elle est globale et se brise probablement votre programme.

  • with { } .

  • Really difficile à documenter avec des outils JavaDoc comme.

35
répondu 2 revsDaniel Cassidy 2008-12-07 05:23:07
la source

Python:

  • absence de Dactylographie statique
  • par Défaut de l'argument de la manipulation (en particulier le fait que vous pouvez changement l'argument par défaut pour l'avenir des appelants!)
  • trop de soulignements requis (les constructeurs doivent être appelés __init__ )
  • manque de membres privés et de fonctions (convention dit juste que la plupart des choses qui commencent avec underscore sont privés, sauf pour tous les trucs comme __getattr__ qui n'est pas)
  • drôle de syntaxe pour print ing à un fichier (mais ils le réparent en Python 3)
34
répondu Greg Hewgill 2017-05-23 14:33:14
la source

c#

  • je souhaite que je pourrais switch() sur n'importe quel type, et que case pourrait être n'importe quelle expression.

  • impossible d'utiliser l'objet de l'initialiseur de syntaxe avec 'readonly' champs / private set autoprops. Généralement, je veux de l'aide de langue pour faire des types immuables.

  • utilisation de {} pour et classe et méthode et propriété/indexeur blocs et multi-blocs d'instruction et les initialiseurs de tableau . Ce qui rend difficile de savoir où vous êtes quand ils sont éloignés ou non.

  • je déteste écrire (from x in y ... select).Z() . Je ne veux pas avoir à revenir à la syntaxe d'appel de méthode parce que la syntaxe de requête est manque quelque chose.

  • je veux une do clause sur la syntaxe de requête, qui est comme foreach . Mais ce n'est pas vraiment une requête.

je suis vraiment atteindre ici. Je pense que C# est fantastique, et il est difficile de trouver beaucoup de choses cassées.

32
répondu 2 revsJay Bazuzi 2010-06-03 22:18:23
la source

PHP

  1. aucune fonctionnalité de débogage si vous ne contrôlez pas le serveur, et même alors ils sont un peu nuls
  2. la quantité extrême de mauvais code PHP flottant autour donne à tous les programmeurs PHP une mauvaise réputation
  3. nom de fonction incohérent
  4. incapacité d'avoir une variable statique dactylographiée si j'en veux une (je suis un grand fan de Dactylographie dynamique 90% du temps)
  5. REGISTER_GLOBALS is the devil
26
répondu MattBelanger 2008-11-13 17:37:57
la source

C (OK, ce n'est pas mon préféré, mais ça n'avait pas encore été fait.)

  • Prise de la bibliothèque de syntaxe.
  • aucune surcharge de fonction.
  • C-Style strings.
  • dépassement de tampon.
  • syntaxe cryptique. Je ne sais pas combien de fois j'ai regardé des trucs comme atoi, giflé mon front, et crié "bien sûr!"

EDIT: je pourrais probablement venir avec plus si j'ai eu recours à plus de code de bibliothèque (comme je l'ai fait avec les sockets, mais ceux-ci sont particulièrement mauvais), mais je me suis déjà senti comme si je trichais pour m'en prendre à C. tellement de langues existent seulement pour prendre les bonnes parties de C et remplacer le mauvais que c'est un peu comme battre un cheval mort.

25
répondu 4 revsBill the Lizard 2010-03-22 20:31:46
la source

Common Lisp:

  1. les mots-clés sont souvent trop verbeux.
  2. le support de la Bibliothèque est pitoyable.
  3. ne fonctionne pas bien dans les os qui veulent gérer la mémoire plus strictement.
  4. ne dispose pas de bonnes installations pour interagir avec L'OS.
  5. l'installation de "boucle" n'est pas bien définie, et ne ressemble certainement pas à Lispy.
24
répondu David Thornley 2008-11-12 01:50:52
la source

BrainF*ck

  • votre point fort est que vous êtes Turing complete ?! Je peux faire de plus dans les expressions régulières de Perl!

  • manque d'objets. Allez, les gens! C'est comme, bonjour ...

  • Aucune mise en réseau des bibliothèques. Je veux juste gratter une page web.

  • pas de fonctions de première classe. Félicitations - vous pouvez compatir avec vos amis Java.

  • une bande infinie pour le stockage et rien d'autre. C'est tellement prétentieux que nous pourrions aussi bien écrire Lisp.

24
répondu 3 revs, 2 users 92%a paid nerd 2011-03-04 12:03:23
la source

JavaScript

  1. nombres en tant que chaînes-mathématiques peuvent être frustrant quand les nombres sont intpreted comme des chaînes de caractères. 5 + 2 = 52? Grrr...
  2. autorisations - tous les meilleurs trucs, nécessite l'autorisation de l'utilisateur!
  3. Mises à jour de l'écran
  4. - le navigateur doit être stable pour mettre à jour l'écran. Il ne semble pas être un moyen de forcer l'écran de mise à jour au moyen d'un script.
  5. lent - bien que Google Chrome est agréable...
  6. les différences de navigateur rendent l'utilisation du langage a [censuré].
23
répondu 2 revs, 2 users 91%BoltBait 2010-05-23 15:00:24
la source

PHP:

  • on ne peut jamais être sûr que certaines extensions presque communes sont disponibles sur tous les serveurs web.
  • tente d'être tout à l'avenir (goto, fermetures, ... )
  • de nombreux risques pour la sécurité des utilisateurs inexpérimentés
  • plus de surcharge de l'opérateur serait bien
  • tous les pauvres programmeurs qui n'ont pas appris à le faire fonctionner correctement, et donnez-lui une mauvaise réputation

néanmoins PHP est le (scripting) langue. ;- )

20
répondu 2 revs, 2 users 93%okoman 2008-12-05 20:53:34
la source

VB6

  1. Windows only.
  2. N'est plus supporté.
  3. Les matrices
  4. peuvent commencer à n'importe quel nombre, plutôt que d'être normalisées à 0.
  5. les applications compilées dépendent de nombreuses dll pour fonctionner correctement.
  6. beaucoup de commandes compliquées comme une commande de navigateur ou des morceaux de code compliqués ont tendance à casser l'IDE quand vous exécutez code uncompiled, mais fonctionnent très bien quand compilé.
18
répondu Asrrin29 2008-11-12 06:54:41
la source

Ruby est ma langue préférée, voici ce que je n'aime pas:

  • fils Verts + blocage de bibliothèques C = le géant de l'échec
  • SI DOULOUREUSEMENT LENT
  • Le standard de la bibliothèque elle-même est incompatible avec son utilisation de bang! les méthodes de
  • Module + prolonger est en désordre.
  • "Classes Ouvertes" ne peut pas être étendue - je veux ajouter une Chaîne de caractères#dostuff, mais je ne veux pas que la fuite dans toutes les bibliothèques de tiers
  • pas de solution d'emballage de déploiement binaire.
18
répondu 2 revs, 2 users 88%Orion Edwards 2010-11-27 05:24:15
la source

de Delphes:

  • IDE est un peu instable.
  • code insight est parfois confus.
  • débogage est parfois buggy.
  • la mise à jour de plusieurs fichiers de projet peut être fastidieuse.
  • si vous démarrez lorsqu'un ou plusieurs paquets ne sont pas disponibles, le message d'erreur apparaît plusieurs fois.
17
répondu Toon Krijthe 2008-11-12 01:44:07
la source

JavaScript

  • chaque script est exécuté dans un seul 'namespace'global...quelque chose que vous devez surveiller lorsque vous travaillez avec des scripts de différentes sources

  • si une variable est utilisée mais n'a pas été définie avant la main, elle est considérée comme une variable globale

  • les fournisseurs de Navigateur qui composent normes s'il vous plaît, prise de codage pour nous, les développeurs à l'aide de cette belle langue plus difficile que ce qu'elle devrait être

  • casse - considérant qu'il n'est pas décent de l'IDE pour le développement de js avec compilation cochant

  • Solutions de rechange (telles que l'utilisation de la méthode hasOwnProperty ) pour effectuer certaines opérations, par ailleurs simples.

16
répondu Andreas Grech 2008-12-07 18:19:00
la source

Haskell:

  1. fuites dans l'espace de lazy evaluation.
  2. hiérarchie numérique non construite en ce qui concerne les abstractions mathématiques.
  3. Strict monadic IO peut rendre plus difficile de déboguer.
  4. les grandes implémentations gèrent les entrées/sorties d'une manière qui ne semble pas tout à fait compatible avec la norme. (En particulier, la sortie des caractères ne produit que les 8 bits les plus bas -- et puis le code est construit qui utilise cette hypothèse de faire binaire I / O. Ick.)
  5. Associativité ($) opérateur pourrait être modifiée afin de rendre certaines expressions plus joli.

la plupart de ceux-ci ne s'élèvent pas au niveau de la haine, et il ya des gens qui essaient de fixer ou de construire des solutions de rechange solides pour chacun de ceux-ci.

Edit: il y a eu une certaine confusion au sujet du point 5. En particulier, certaines personnes semblent penser que je parlais de l'ordre des arguments, ce que je ne fais pas. Plutôt que d'expliquer ce que je voulais dire, je vais montrer aux gens le lien suivant, http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , qui l'exprime bien.

15
répondu 3 revs, 2 users 90%wnoise 2011-03-01 23:56:43
la source