Il y a eu un groupe de Perl-haine sur Stack Overflow récemment, alors j'ai pensé apporter ma question " Cinq choses que vous détestez au sujet de votre langue préférée " à Stack Overflow. Prenez votre langue préférée et dites-moi cinq choses que vous détestez à ce sujet. Ce sont peut-être des choses qui vous ennuient, qui admettent des défauts de conception, des problèmes de performances reconnus ou toute autre catégorie. Il suffit de le détester et ce doit être votre langue préférée.
Ne le comparez pas à une autre langue et ne parlez pas de langues que vous détestez déjà. Ne parlez pas des choses que vous aimez dans votre langue préférée. Je veux juste entendre les choses que vous détestez mais tolérez afin que vous puissiez utiliser toutes les autres choses, et je veux entendre la langue que vous souhaitez que les autres utilisent.
Je pose cette question chaque fois que quelqu'un essaie de pousser sa langue préférée sur moi, et parfois comme une question d'entrevue. Si quelqu'un ne peut pas trouver cinq choses à détester à propos de son outil préféré, il ne le sait pas assez bien pour le défendre ou retirer les gros dollars en l'utilisant. Il ne l'a pas utilisé dans suffisamment de situations différentes pour l'explorer pleinement. Il le préconise en tant que culture ou religion, ce qui signifie que si je ne choisis pas sa technologie préférée, je me trompe.
Peu m'importe la langue que vous utilisez. Vous ne voulez pas utiliser une langue particulière? Alors ne le fais pas. Vous passez par une diligence raisonnable pour faire un choix éclairé et ne l'utilisez toujours pas? Bien. Parfois, la bonne réponse est "Vous avez une équipe de programmation solide avec de bonnes pratiques et beaucoup d'expérience dans Bar. Changer pour Foo serait stupide."
C'est aussi une bonne question pour les revues de code. Les gens qui connaissent vraiment une base de code auront toutes sortes de suggestions à ce sujet, et ceux qui ne la connaissent pas si bien ont des plaintes non spécifiques. Je demande des choses comme "Si vous pouviez recommencer ce projet, que feriez-vous différemment?" Dans ce pays fantastique, les utilisateurs et les programmeurs peuvent se plaindre de tout et 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 à la place de cet autre", "Je renommerais cet ensemble de méthodes", ou tout ce qu'ils font vraiment 'aime pas la situation actuelle. C'est ainsi que je sais combien un développeur particulier connaît la base de code. C'est aussi un indice sur la part du programmeur »
La haine n'est pas la seule dimension pour déterminer ce que les gens savent, mais je l'ai trouvé assez bon. Les choses qu'ils détestent me donnent également une idée de la façon dont ils pensent au sujet.
la source
Réponses:
Cinq choses que je déteste à propos de Java:
Je sais, je devrais vérifier Scala.
la source
Wow, je suis surpris que SQL ne soit pas encore arrivé ici. Je suppose que cela signifie que personne ne l'aime :)
... Et quelques raisons bonus de le détester, sans frais supplémentaires
la source
JavaScript :
Toutes les choses les plus cool sont incroyablement complexes, mais ensuite, toute la fraîcheur est également enveloppée dans une si petite quantité de code que vous vous sentez stupide d'avoir du mal à le suivre
'+' est un choix absurde d'opérateur pour la concaténation dans un langage faiblement typé. Ont - ils essayé d'effrayer les noobs?
C'est un champ de mines de compatibilité multi-navigateur (peu importe s'il est même activé ou non)
Ce n'est généralement pas fiable - associé à des escroqueries telles que le blocage du bouton de retour, des pop-ups qui ne meurent jamais, etc.
Il est presque impossible de déboguer car il n'y a que quelques messages d'erreur différents et quelques types différents (Number, String, Object, etc.)
Si ce n'était pas pour jQuery, je le détesterais probablement autant que je le faisais :)
la source
char
s, convertir n'importe quoi en n'importe quoi via des pointeurs void *, etc.) Il est typé statiquement au lieu de dynamiquement , et nécessite également une frappe explicite au lieu de l'inférence de type, mais celles-ci ne sont pas liées à un typage faible v / s fort. [Exemples aléatoires: Python a un typage fort dynamique implicite, Haskell a un typage fort statique (éventuellement explicite), Java a un typage fort explicite (principalement statique), C a un typage statique explicite (relativement faible).] "Fortement typé" et "faiblement typé "ne sont en fait pas bien définis.'3'+'2'='32'
,'3'-'2'=1
.PHP:
1) Me force à faire des variables inutiles:
2) Une implémentation de lambdas si boiteuse qu'elle est à peu près équivalente à l'utilisation
eval()
et si horriblement 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 détecter qu'environ 80% des erreurs qui pourraient se produire.
4) Le support Regex est tout aussi boiteux que le support lambda car il doit être écrit dans des chaînes régulières, ce qui rend l'un des outils de programmation les plus difficiles à apprendre environ trois fois plus difficile. Et PHP est censé être un langage "facile"?!?!?
5) Pas moyen d'extraire des éléments de $ _POST en toute sécurité sans l'écrire deux fois ou créer votre propre fonction, ou en utilisant l'opérateur '@':
6) Réponse bonus: '@'. Si cela ne vous dérange pas d'écrire votre code correctement, ajoutez simplement '@', et tant pis pour quiconque doit déboguer votre code plus tard.
la source
C ++
la source
C # / .NET:
lock
instruction - à la place, vous devriez avoir des objets de verrouillage spécifiques, et il devrait y avoir des méthodes telles que cellesAcquire
qui renvoient des jetons de verrouillage jetables. Corollaire: il ne devrait pas y avoir de moniteur pour chaque objet.GetHashCode()
etEquals()
ne devrait pas être dedansSystem.Object
- tout ne convient pas au hachage. Au lieu de cela, avoir unIdentityComparer
qui fait la même chose, et garder laIComparer<T>
,IComparable<T>
,IEqualityComparer<T>
etIEquatable<T>
les interfaces pour les comparaisons personnalisées.C'étaient du haut de ma tête - demandez-moi demain et je trouverai un 5 différent :)
la source
C
Devoir gérer manuellement les tampons de chaîne est une douleur sujette aux erreurs. Étant donné que l'informatique bouge et modifie vraiment les chaînes (les ordinateurs ne sont pas autant utilisés pour les gros calculs que les gens pensaient qu'ils seraient à l'époque), il est vraiment agréable de pouvoir utiliser des langages gérés ou la chaîne C ++ des objets pour y faire face. Quand je dois le faire en C droit, j'ai l'impression de nager dans des sables mouvants.
la source
Que diriez-vous de cinq choses que je déteste à propos des listes "Choses que je déteste à propos d'une langue"? :RÉ
5- Peindre un rouge orangé n'en fait pas une pomme.
Lorsqu'une langue est conçue, les concepteurs ont généralement à l'esprit à quoi elle sert. L'utiliser pour quelque chose de complètement différent peut fonctionner, mais se plaindre quand ce n'est pas le cas est simplement stupide. Prenez Python. Je suis sûr que quelqu'un a ou quelqu'un fera un jour un utilitaire pour créer des exes à partir du code Python. Pourquoi la terre de Dieu vous voulez faire cela? Ce serait bien — ne vous méprenez pas — mais cela ne sert à rien. Alors arrêtez de vous en 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 à la portée de la langue que vous utilisez.
4- Êtes-vous debout sur des pieds en bois?
La plateforme peut avoir une grande influence sur ce que la langue peut faire. Avec les collecteurs d'ordures de nos jours, ou bien même les premières tentatives pascales de "collecte des ordures", peuvent aider à l'effacement de la mémoire (peut-être plus de RAM malloc ??). Les ordinateurs sont plus rapides et donc bien sûr, nous attendons plus de nos langues. Et franchement, nous devrions probablement le faire. Cependant, il y a un prix énorme à payer pour la commodité du compilateur pour créer des tables de hachage ou des chaînes ou une variété d'autres concepts. Ces éléments peuvent ne pas être hérités de la plate-forme dont ils sont utilisés. Dire qu'ils sont faciles à inclure dans une langue me dit simplement que vous n'avez peut-être pas de jambe sur laquelle vous tenir.
3- Qui est vraiment la faute?
Bugs. Tu sais. J'adore les insectes. Pourquoi j'aime les bugs. Parce que cela signifie que je dois garder mon travail. Sans insectes, il y aurait de nombreuses pizzerias fermées. Cependant, les utilisateurs détestent les bogues. Mais voici un peu d'eau froide. Chaque bug est la faute du programmeur. Pas la langue. Un langage avec une syntaxe aussi stricte qui réduirait considérablement le nombre de bogues pouvant être générés serait un langage complètement inutile. Ses capacités pourraient probablement être comptées d'une part. Vous voulez de la flexibilité ou du pouvoir? Vous avez des bugs. Pourquoi? Parce que tu n'es pas parfait et que tu fais des erreurs. Prenons un exemple vraiment identifiable en C:
Nous savons tous ce que cela va faire. Cependant, ce que certains d'entre nous ne réalisent peut-être pas, c'est que cette fonctionnalité peut être très bénéfique. Selon ce que vous faites. Les dépassements de tampon sont le coût de cette fonctionnalité. Ce code ci-dessus. Si je l'ai effectivement rendu public. C'est encore .. dites-le avec moi .. "Ma faute". Pas C pour m'avoir permis de le faire.
2- Ne devrions-nous pas mettre cela dans la corbeille?
Il est très facile de pointer une fonctionnalité dans un langage que nous ne comprenons pas, car nous ne l'utilisons pas souvent et nous l'appelons stupide. Se plaindre qu'il est là, etc. Goto me divertit toujours. Les gens se plaignent toujours du fait que goto est dans une langue. Pourtant, je parie que votre dernier programme comprenait un type de goto. Si vous avez déjà utilisé une pause ou une continuation, vous avez utilisé un goto. Voilà ce que c'est. Certes, c'est un goto "sûr", mais c'est ce que c'est. Les Goto ont leur utilité. Que des gotos "implicites" comme continuer ou rompre soient utilisés ou des gotos explicites (en utilisant le mot clé réel "goto" pour n'importe quelle langue). Non pas que les développeurs de langage soient sans défaut, mais généralement ... si la fonctionnalité existe depuis la nuit des temps (pour cette langue). Cet aspect est probablement une qualité déterminante de cette langue. Signification .. c'est ' s utilisé et n'est probablement pas traîner en raison de la compatibilité descendante. Il est utilisé aujourd'hui. Comme il y a 5 minutes. Et utilisé correctement. Eh bien .. sans doute quelqu'un l'utilise également de manière incorrecte, mais cela se rapporte au numéro 3 sur ma liste.
1. - Tout est un objet.
Ok .. celui-ci est vraiment un sous-ensemble de # 2. Mais c'est de loin la plainte la plus ennuyeuse que je vois dans les listes de haine. Tout n'est pas un objet. Il existe un grand nombre de concepts qui n'appartiennent pas ou doivent être des objets. Mettre des choses là où elles n'appartiennent pas est tout simplement moche et peut diminuer l'efficacité d'un programme. Sûr. Peut-être pas beaucoup selon la langue. Cela concerne également le n ° 5. Cela signifie ... oui. Global sont ok. Les fonctions associées aux méthodes statiques sont correctes. La combinaison de la programmation OO avec des fonctions globales est correcte. Maintenant .. cela ne signifie pas que nous devrions tous sortir et "libérer" notre code de ses modèles d'objets. Lors de la conception d'une section de code ou d'un projet entier, ce qui se passe dans les coulisses doitêtre pris en compte lors de la mise en place. Non seulement où ce concept réside et de nombreux autres facteurs. Pourquoi envelopper des fonctions globales dans des classes ou des concepts d'espace de nom si cela ne sert à rien? Prenez des variables membres statiques. Cela m'amuse énormément parce que ... eh bien ... En fonction du langage et de la mise en œuvre bien sûr, mais d'une manière générale, vous venez de déclarer un global. Oui, il existe des raisons d'encapsuler ces concepts non OO dans des wrappers OO. L'un étant bien sûr le code auto-documenté. Cela peut avoir du sens. Alors .. comme je dis. Ne sortez pas et "libérez" votre code. Mais tout bon langage moderne aura un concept global en dehors de sa modélisation OO. Oui, je veux spécifiquement souligner qu'un langage de programmation OO sans concept global a très probablement un grave défaut de conception. Encore une fois cependant .. dépend de l'intention et de la conception de la langue, donc je n'essaie pas de choisir une langue spécifique et il y en a beaucoup trop à analyser ici. Quoi qu'il en soit, considérez où le code doit vivre et être le plus efficace. L'ajout d'un tas de reflets à quelque chose qui n'ajoute pas de fonctionnalité ou de support épuise simplement le clavier plus rapidement. Cela ne fait de bien à personne. Eh bien ... à moins que vous n'aimiez les points brownie de la personne qui vous a probablement incorrectement appris que tout est un objet.
En bref, la programmation ne consiste pas simplement à taper sur le clavier sans réfléchir. Il y a beaucoup de considérations de conception dans tout projet. Je sais que c'est un cliché, mais il faut le regarder sous tous les angles. Même avec les langages sûrs de nos jours. Vous ne vous contentez pas de jeter du code et vous attendez à ce qu'il fonctionne bien. Bien sûr .. cela peut fonctionner, mais ce n'est peut-être pas la bonne façon de procéder. Dans l'ensemble, choisissez la langue et le format les mieux adaptés au travail spécifique ET à l'environnement. Mais aucun langage n'enlève la pensée derrière lui. Si vous ne pensez pas .. vous tapez simplement.
la source
Cinq choses que je déteste à propos de Java (qui, actuellement, est mon langage préféré) sans ordre particulier.
la source
Ruby a de nombreux défauts liés à sa vitesse, mais je ne les déteste pas. Cela a également des défauts avec l'évangélisation communautaire qui va trop loin, mais cela ne me dérange pas vraiment. Voici ce que je déteste:
La façon dont le passage de bloc aux fonctions est effectué est idiot. Il n'y a aucune raison pour que les blocs soient passés en dehors de la liste des paramètres, ou aient une syntaxe spéciale étrange pour accéder (rendement). Je suis d'avis que les blocs auraient dû avoir une syntaxe moins ambiguë (ou que les hachages auraient pu utiliser différents délimiteurs; peut-être <> plutôt que {}), et passer des paramètres aux méthodes aurait dû être comme tous les autres paramètres.
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, ça m'ennuie vraiment.
la source
Perl
Utilisation mixte des sceaux
Par exemple, aucun de ces éléments n'est identique:
Il
Perl6
est écrit :Manque de vrai OO
Il
Perl6
est écrit :Fonctionnalités regex mal conçues
Il
Perl6
est écrit :Absence d'envoi multiple
Il
Perl6
est écrit :Mauvaise surcharge de l'opérateur
Il
Perl6
est écrit :la source
Je vais faire du PHP comme je l'aime parfois et Python sera fait beaucoup trop.
Pas d'espace de noms; tout est dans une sorte de très grand espace de noms qui est un enfer dans des environnements plus grands
Manque de normes en matière de fonctions: les fonctions de tableau prennent une aiguille comme premier argument, la botte de foin comme deuxième (voir array_search ). Les fonctions de chaîne prennent souvent la botte de foin en premier, l'aiguille ensuite (voir strpos ). D'autres fonctions utilisent simplement différents schémas de dénomination: bin2hex , strtolower , cal_to_jd
Certaines fonctions ont des valeurs de retour étranges, hors de ce qui est normal: cela vous oblige à avoir une troisième variable déclarée de nulle part tandis que PHP pourrait efficacement interpréter un tableau vide comme faux avec son type de jonglage. Il n'y a presque aucune autre fonction faisant de même.
Le langage (jusqu'à PHP6) fait de son mieux pour respecter une rétrocompatibilité presque retardée, ce qui le rend porteur de mauvaises pratiques et de fonctions lorsqu'il n'est pas nécessaire (voir mysql_escape_string contre mysql_real_escape_string ).
Le langage est passé d'un langage de modèles à un langage complet. Cela signifie que n'importe qui peut sortir n'importe quoi quand il le souhaite, et cela est abusé. Vous vous retrouvez avec des moteurs de template pour un langage de template ...
Ça craint d'importer des fichiers. Vous avez 4 façons différentes de le faire (include, include_once, require, require_once), elles sont toutes lentes, très lentes. En fait, toute la langue est lente. Au moins, assez lent que python (même avec un framework) et RoR d'après ce que je comprends.
Mais j'aime toujours PHP. C'est la tronçonneuse du développement Web: vous voulez qu'un site petit à moyen soit fait très rapidement et que tout le monde puisse l'héberger (bien que les configurations puissent différer)? PHP est là, et il est tellement omniprésent qu'il ne faut que 5 minutes pour installer une pile LAMP ou WAMP complète. Eh bien, je recommence à travailler avec Python maintenant ...
la source
Voici certaines choses que je n'aime pas à propos de Java (qui n'est pas mon langage préféré):
la source
C ++
Python
la source
Objectif c
1) Pas d'espaces de noms, juste des conventions de nommage manuelles - cela ne me dérange pas en termes de séparation de classes, mais je ne peux pas importer toutes les définitions de classes dans un espace de noms sur une seule ligne (comme import com.me.somelibrary. *).
2) Les bibliothèques ont encore des trous dans des domaines importants comme le support RegEx.
3) La syntaxe des propriétés est un peu maladroite, nécessitant trois lignes (dans deux fichiers distincts) pour déclarer une propriété.
4) J'aime le modèle de retenue / libération, 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 que ce ne soit pas vraiment une fonction de langage, Xcode est si étroitement lié à l'utilisation d'Objective-C que je ne peux m'empêcher de penser à cet aspect ... fondamentalement, la saisie semi-automatique, est très incertaine. Cela ressemble plus à un système qui vous récompense pour avoir trouvé quelque chose que vous voulez, puis le présente ensuite comme un choix. Mais je suppose que je n'ai jamais aimé les moteurs de saisie semi-automatique.
la source
YES/NO
de dire que les booléens sont une mauvaise chose? Et plus important encore, dites-vous que les paramètres nommés sont une mauvaise chose? Je peux comprendre les bools, mais les paramètres nommés sont peut-être l'une des meilleures fonctionnalités d'ObjC (en termes de lisibilité).C ++
Cordes.
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 complète) n'est pas définie, de sorte que les garanties de performances 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 les leurs, ce qui est malheureusement beaucoup plus confortable à utiliser. Sauf si vous devez les combiner.
Variété de représentations de chaîne
Maintenant, c'est un peu un problème de plate-forme - mais j'espère toujours que cela aurait été mieux quand une classe de chaîne standard moins obstinée aurait été disponible plus tôt. Les représentations de chaîne suivantes que j'utilise fréquemment:
Construire un modèle.
Je suis malade à mort de tout le temps passé à me brouiller avec qui-inclut-quoi, les déclarations avancées, l'optimisation des en-têtes précompilés et inclut de garder au moins les temps de construction incrémentiels supportables, etc. C'était génial dans les années 80, mais maintenant? Il y a tellement d'obstacles à emballer un morceau de code afin qu'il puisse être réutilisé que même les mamans de chien s'ennuient à m'écouter.
Difficile à analyser
Cela rend les outils externes particulièrement difficiles à écrire et à bien faire. Et aujourd'hui, nous, les gars C ++, manquons surtout dans la chaîne d'outils. J'adore ma réflexion C # et mes délégués mais je peux vivre sans eux. Sans grande refactorisation, je ne peux pas.
Le threading est trop difficile Le
langage ne le reconnaît même pas (à l'heure actuelle), et les libertés du compilateur - bien que géniales - sont trop douloureuses.
Initialisation statique et à la demande Techniquement, je triche ici: c'est une autre pièce du puzzle du "code de réutilisation": C'est un cauchemar de faire initialiser quelque chose seulement quand c'est nécessaire. La meilleure solution à tous les autres problèmes de redistribution est de tout jeter dans les en-têtes, ce problème dit "neeener - vous ne pouvez pas".
Certes, beaucoup de choses dépassent le cadre du langage strict, mais l'OMI toute la chaîne d'outils doit être jugée et doit évoluer.
la source
std::string
? peut-être que lire une bonne documentation et / ou un tutoriel surstd::vector
(et pourquoi vous n'êtes pas censé l'utiliserstd::string
dans des endroits où il n'a jamais été conçu) pourrait clarifier cela pour vous.std::string
si je ne peux pas l'utiliser la moitié du temps? (C ++ 0x corrige au moins cela, mais je suis toujours coincé avec des dizaines de bibliothèques qui utilisent différentes représentations de chaînes).but why do we have to bother with them (inclusion guards)
- parce que C ++ n'a pas de modules.How "standard" is a std::string if I can't use it half of the time?
- Je pense que cela dépend de la façon dont vous l'utilisezstd::string
. La classe de chaîne vous permet d'accéder aux données de chaîne commeconst char*
viastd::string::c_str
, ce qui rend déjàstd::string
parfaitement compatible avec chaque classe / fonction qui prend également desconst char*
arguments.JavaScript :
Le
Object
prototype 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 de hachage, mais il est difficile de les utiliser en toute sécurité en tant que tels. En particulier, si l'une de vos clés se trouve
__proto__
, vous avez des ennuis.Pas de fermeture d'objet au moment de la référence de la fonction. En fait, aucune fermeture d'objet du tout - à la place,
this
est définie chaque fois qu'une fonction est appelée avec la notation d'objet ou l'new
opérateur. Entraîne beaucoup de confusion, en particulier lors de la création de rappels d'événements, car ilthis
n'est pas réglé sur ce que le programmeur attend.new
opérateur entraînethis
une valeur égale à l'objet global, ce qui entraîne de nombreuses ruptures.Opérateur d'addition surchargé pour effectuer également la concaténation de chaînes, bien que les deux opérations soient fondamentalement différentes. Il en résulte une douleur lorsqu'une valeur que vous attendez à être un nombre est en fait une chaîne.
==
et les!=
opérateurs effectuent une coercition de type. Les comparaisons entre différents types impliquent une liste de règles dont aucun mortel ne peut se souvenir complètement. Ceci est atténué par l'existence de===
et d'!==
opérateurs.Les deux existent
null
et ontundefined
des significations subtilement différentes mais redondantes. Pourquoi?Syntaxe étrange pour la mise en place de chaînes de prototypes.
parseInt(s)
attend un nombre de style C, traite donc les valeurs avec des zéros en tête comme octaux, etc. Vous pouvez au moinsparseInt(s, 10)
mais le comportement par défaut est déroutant.Pas de portée de bloc.
Peut déclarer la même variable plusieurs fois.
Peut utiliser une variable sans la déclarer, auquel cas elle est globale et casse probablement votre programme.
with { }
.Vraiment difficile à documenter avec des outils comme JavaDoc.
la source
null
etundefined
: parfois, vous voulez vraiment savoir si la variable a été affectée ou non. Puisque null est une valeur, undefined est le seul moyen de le savoir. Certes, la seule fois où j'ai trouvé cela utile était pour créer des fonctions getter / setter.for
comme nom de variable."for"
est valide en tant que clé de hachage.__proto__
n'est pas un mot réservé. Les valeurs de chaîne spéciales qui ne fonctionnent pas comme prévu lorsqu'elles sont utilisées comme clés de hachage violent les attentes raisonnables sur le fonctionnement des tableaux associatifs dans n'importe quelle langue. Ils violent également la spécification EcmaScript.newline may or may not end a statement depending on context
est l'un de mes 5 premiersPython:
__init__
)__getattr__
qui ne l'est pas)print
ing dans un fichier (mais ils corrigent cela dans Python 3)la source
C #
J'aimerais pouvoir
switch()
sur n'importe quel type, et celacase
pourrait être n'importe quelle expression.Impossible d'utiliser la syntaxe d'initialisation d'objet avec des champs /
private set
autoprops 'en lecture seule' . En général, je veux une aide linguistique pour créer des types immuables.Utilisation de
{}
pour l' espace de noms et la classe et la méthode et les blocs de propriété / indexeur et les blocs multi-instructions et les initialiseurs de tableau . Il est difficile de savoir où vous êtes quand ils sont éloignés ou mal assortis.Je déteste écrire
(from x in y ... select).Z()
. Je ne veux pas avoir à revenir à la syntaxe d'appel de méthode, car il manque quelque chose à la syntaxe de la requête.Je veux une
do
clause sur la syntaxe de requête, qui est commeforeach
. Mais ce n'est pas vraiment une requête alors.J'atteins vraiment ici. Je pense que C # est fantastique, et il est difficile de trouver beaucoup de choses cassées.
la source
PHP
la source
C (OK, ce n'est pas mon préféré, mais cela n'a pas encore été fait.)
EDIT: Je pourrais probablement trouver plus si je recourais à plus de code de bibliothèque (comme je l'ai fait avec les sockets, mais ceux-ci sont particulièrement mauvais), mais j'avais déjà l'impression de tricher pour avoir choisi C. C. Beaucoup de langues n'existent que pour prendre les bonnes parties de C et remplacer les mauvaises que c'est un peu comme battre un cheval mort.
la source
Lisp commun:
la source
BrainF * ck
Votre point fort est que vous avez terminé Turing ?! Je peux faire plus dans les expressions régulières Perl!
Manque d'objets. Allez, les gens! C'est comme, bonjour ...
Pas de bibliothèques de réseautage. Tout ce que je veux, c'est gratter une page Web, GOSH.
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.
la source
Javascript
la source
PHP:
Néanmoins, PHP est le langage (de script). ;-)
la source
VB6
la source
Le rubis est ma langue préférée, voici ce que je n'aime pas:
la source
Delphes:
la source
Javascript
Chaque script est exécuté dans un seul 'espace de noms' global ... quelque chose que vous devez surveiller lorsque vous travaillez avec des scripts provenant de différentes sources
Si une variable est utilisée mais n'a pas été définie au préalable, elle est considérée comme une variable globale
Les fournisseurs de navigateurs élaborent des normes à leur guise, rendant le codage pour nous, développeurs utilisant un si beau langage, plus difficile qu'il ne devrait l'être
Respect de la casse - considérant qu'il n'y a pas d'IDE décent pour développer js avec une vérification à la compilation
Solutions de contournement (telles que l'utilisation de la
hasOwnProperty
méthode) pour effectuer certaines opérations, sinon simples.la source
Haskell:
($)
opérateur pourrait être modifiée pour rendre certaines expressions plus jolies.La plupart d'entre eux n'atteignent pas le niveau de haine, et il y a des gens qui essaient de corriger ou de construire de solides solutions de contournement pour chacun d'eux.
Edit: Il y a eu une certaine confusion au sujet du point 5. En particulier, certaines personnes semblent penser que je voulais dire l'ordre des arguments, ce que je ne pense pas. Plutôt que d'expliquer ce que je voulais dire, je vais simplement pointer les gens vers le lien suivant, http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , qui l'exprime bien.
la source