2009-02-12 5 views
1

Pour les langages et les librairies populaires que nous utilisons tous les jours: Quels sont les exemples de mauvaise conception, d'API embarrassantes ou de mauvaise utilisation générale? Concevez les erreurs que nous devons payer parce qu'elles introduisent des bogues subtils, nous devons utiliser des solutions de contournement maladroites ou mémoriser des moyens non intuitifs pour faire avancer les choses.Quelles sont les plus grandes erreurs de conception dans les langages ou bibliothèques populaires?

Je pense en particulier à des problèmes comme: Il y a une classe dans un langage OO qui ne devrait pas vraiment hériter de cette autre classe. Il y a un opérateur spécial qui rend une certaine langue difficile à analyser, et il s'est avéré être inutilisé de toute façon. Une fonction qui est mal nommée ou est souvent utilisée pour d'autres choses que pour lesquelles elle a été conçue (je pense à std::getline pour marquer les chaînes).

Je suis et non à la recherche de contributions qui bash les langues et prétendent que, par exemple, Perl ou un autre langage est mal conçu. Je suis plus à la recherche d'exemples concrets ou d'anecdotes sur des choses qui auraient dû être faites différemment. (Peut-être que les concepteurs pris trop tard et a essayé de le réparer dans les versions ultérieures, mais a dû conserver la compatibilité ascendante.)

+0

Est-ce la même chose que http://stackoverflow.com/questions/282329/what-are-five-things-you-hate-about-your-favorite-language? –

+0

subjective et oserais-je dire que le potentiel d'être un appât de flamme? – Gishu

+0

subj/arg: marquage pour fermer car il n'a pas été fait wiki communautaire, suggéré pour les questions de type sondage car il n'y a pas de bonne réponse. – paxdiablo

Répondre

4

classe Java appelée « NullPointerException »

Après avoir migré de C++ à Java j'ai toujours trouvé amusant pour trouver une exception NullPointerException dans un langage avec "aucun pointeur"

6

La classe d'URL Java fait (ou a fait, il y a quelques années) une recherche DNS lors de la détermination du hashCode d'un objet URL. Ainsi, non seulement une table de hachage avec des URL comme clés est extrêmement lente, mais elle peut changer à l'exécution si deux requêtes DNS successives renvoient des valeurs différentes ou si vous débranchez le câble réseau!

+0

Je viens de vérifier avec Java 5: hashCode() appelle finalement InetAddress.getByName (hôte); ... * OMFG * –

+0

pour les problèmes de compatibilité descendante Je pense que cela va rester comme ça pendant un certain temps – chburd

+0

Oui, c'est une vraie bévue. Personne ne s'attend à ce que hashcode() bloque potentiellement. – mfx

1

Mon préféré vient du monde de Smalltalk. Squeak pour être spécifique. Dans Squeak, la classe Semaphore hérite de LinkedList. Les sémaphores peuvent utiliser des listes liées, mais ce ne sont pas des listes liées elles-mêmes. Cela rend l'interface très étrange. C'est un design OO terrible.

+0

Ce n'est pas spécifique Squeak - Dolphin le fait aussi, mais vous avez raison, c'est horrible! –

1

API où les fonctions renvoient null lorsqu'elles doivent retourner des éléments vides ... et ne documentent pas quand, comment, ou pourquoi elles retourneront null.

2

La majorité des C++ sont des défauts de conception, mais la plupart des gens apprennent à les vivre. [Canards pour la masse des ennemis downvotes]

+0

Pouvez-vous jeter un peu plus de lumière sur votre réponse – yesraaj

+0

@rajKumar: Regardez C++ réponses aux questions fréquemment posées (http://yosefk.com/c++fqa/) –

0

J'ai trouvé un dans Dir.glob de Ruby().

Je n'ai pas été en mesure de prouver que ce n'est pas encore lié à mon environnement particulier, car mon environnement est vieux et bricolé à la main et je dois malheureusement continuer à le supporter.Il semble y avoir au moins 5 cas:

  • Répertoire a des fichiers et un certain match -> Liste de ces fichiers
  • Répertoire a des fichiers et match nul -> Liste vide
  • Directory est vide -> Néant
  • Directory existe, mais l'utilisateur actuel ne peut pas lire (je ne sais pas ce qui se passe ici)
  • Directory est manquant (ont pas testé ce soit)

il m'a fait arracher mes cheveux parce que la documentation ne le décrit pas de cette façon.

1

Exceptions vérifiées ou non vérifiées dans Java. La plupart des développeurs Java ne savent pas quand utiliser quoi, ou, s'ils le font, ils ne sont pas d'accord.

Ensuite, nous avons des choses comme IOExeption que vous ne pouvez jamais manipuler quand elles se produisent mais doivent les vomir (dans tous les sens du terme). Quand vous avez finalement atteint un endroit où vous pouvez les manipuler, vous n'avez aucune idée de ce qui pourrait leur avoir causé, vous pouvez donc présenter l'utilisateur avec le message et la trace de la pile et espérer pouvoir le comprendre (ici " elle "est un utilisateur normal qui sait que Java est une sorte de café".

2

PHP en a un bon nombre, les incohérences ($ needle, $ haystack) ($ haystack, $ needle). La chaîne fonctionne avec mb_ préfixé à eux pour activer multibytesupport. Mon mysql_escape_string préféré et mysql_real_escape_string ... Lets pas démarrés sur la partie OO ... :)

2

Mon préféré est atoi de la norme C lib.

int atoi (const char * str); 
  • En cas de succès, la fonction retourne le nombre entier converti en valeur int.
  • Si aucune conversion valide n'a pu être effectuée, une valeur zéro est renvoyée.

Eh bien, malheureusement, il est douloureux de convertir "0" avec cette fonction que vous ne savez jamais si c'était une erreur ou "0".

+0

Et vous l'auriez-vous retourner quoi? Il fait exactement ce qu'il dit, convertit la chaîne en nombre jusqu'au premier caractère illégal. Il n'y a aucune exception dans C. – paxdiablo

+0

Bien sûr, il fait ce qu'il devrait, le problème est qu'un entier valide (zéro) est utilisé pour signaler une erreur de conversion. Il n'est donc pas possible de convertir chaque nombre entier avec cette fonction. Quelque chose comme "int atoi (int * résultat, const char * str)" résoudrait ce problème. – marsl

+0

Ou, si vous devez renvoyer une sentinelle, faites-en une moins courante, comme INT_MAX. – dsimcha

2

API Java "Calendrier". Il est sujet aux erreurs et difficile à utiliser.

Enumérer quelques-uns des problèmes:

  • nom trompeur: un objet Calendrier est censé modéliser un « système de calendrier », mais dans la pratique encapsule un objet de temps, à savoir qu'il est une sorte de date (qui est lui-même un problème, puisque Date devrait être nommé DateTime ou TimeStamp)
  • Il existe une seule sous-classe concrète de Calendar (GregorianCalendar), mais la classe Calendar abstraite contient des constantes uniquement utiles dans ce cas spécifique (JANVIER, LUNDI, AM_PM, ERA)
  • vous modifiez les champs en utilisant des constantes ("LUNDI", "WEEK_OF_MONTH", etc.) ce sont des entiers et peuvent être mélangés plutôt facilement. En fait, à peu près tous les arguments et la valeur de retour est un entier; les problèmes habituels avec les nombres basés sur 0 et 1 s'appliquent (est-ce que 0 ou 1 janvier?=
  • constantes comme « heure » et « HOUR_OF_DAY » qui n'a de sens que lorsque le radio AM/PM est utilisé (que personne en dehors des États-Unis de toute façon ;-) comprenne
0

En Java j'irais avec InterruptedException être une exception vérifiée. Si vous avez besoin de savoir que votre méthode de sommeil s'est réveillée tôt, cela aurait dû être un booléen retourné de la méthode. Rien ne donne aux exceptions vérifiées un mauvais nom comme InterruptedException.

Questions connexes