In letzter Zeit gab es eine Gruppe von Perl-Hass auf Stack Overflow, daher dachte ich, ich würde meine Frage " Fünf Dinge, die Sie an Ihrer Lieblingssprache hassen " zu Stack Overflow bringen. Nehmen Sie Ihre Lieblingssprache und erzählen Sie mir fünf Dinge, die Sie daran hassen. Dies können Dinge sein, die Sie nur nerven, zugegebene Designfehler, erkannte Leistungsprobleme oder eine andere Kategorie. Sie müssen es nur hassen und es muss Ihre Lieblingssprache sein.
Vergleichen Sie es nicht mit einer anderen Sprache und sprechen Sie nicht über Sprachen, die Sie bereits hassen. Sprechen Sie nicht über die Dinge, die Sie in Ihrer Lieblingssprache mögen. Ich möchte nur die Dinge hören, die Sie hassen, aber tolerieren, damit Sie all die anderen Dinge verwenden können, und ich möchte sie über die Sprache hören, die andere Menschen gerne hätten.
Ich frage dies immer dann, wenn jemand versucht, mir seine Lieblingssprache aufzuzwingen, und manchmal als Interviewfrage. Wenn jemand keine fünf Dinge findet, die er an seinem Lieblingswerkzeug hassen kann, weiß er es nicht gut genug, um es entweder zu befürworten oder die großen Dollars damit zu verdienen. Er hat es nicht in genug verschiedenen Situationen benutzt, um es vollständig zu erforschen. Er befürwortet es als Kultur oder Religion, was bedeutet, dass ich mich irre, wenn ich seine Lieblingstechnologie nicht wähle.
Es ist mir egal, welche Sprache du verwendest. Sie möchten keine bestimmte Sprache verwenden? Dann nicht. Sie durchlaufen die Due Diligence, um eine fundierte Entscheidung zu treffen, und verwenden sie immer noch nicht? Fein. Manchmal lautet die richtige Antwort: "Sie haben ein starkes Programmierteam mit guten Praktiken und viel Erfahrung in Bar. Ein Wechsel zu Foo wäre dumm."
Dies ist auch eine gute Frage für Codeüberprüfungen. Leute, die eine Codebasis wirklich kennen, werden alle möglichen Vorschläge dafür haben, und diejenigen, die sie nicht so gut kennen, haben unspezifische Beschwerden. Ich frage Dinge wie "Wenn Sie dieses Projekt von vorne beginnen könnten, was würden Sie anders machen?" In diesem Fantasieland können sich Benutzer und Programmierer über alles beschweren, was sie nicht mögen. "Ich möchte eine bessere Benutzeroberfläche", "Ich möchte das Modell von der Ansicht trennen", "Ich würde dieses Modul anstelle dieses anderen verwenden", "Ich würde diese Methoden umbenennen" oder was auch immer sie wirklich tun Ich mag die aktuelle Situation nicht. Auf diese Weise kann ich feststellen, wie viel ein bestimmter Entwickler über die Codebasis weiß. Es ist auch ein Hinweis darauf, wie viel vom Programmierer
Hass ist nicht die einzige Dimension, um herauszufinden, wie viel die Leute wissen, aber ich fand es ziemlich gut. Die Dinge, die sie hassen, geben mir auch einen Hinweis darauf, wie gut sie über das Thema nachdenken.
quelle
Antworten:
Fünf Dinge, die ich an Java hasse:
Ich weiß, ich sollte mir Scala ansehen.
quelle
Wow, ich bin überrascht, dass SQL es hier noch nicht geschafft hat. Ich denke, das bedeutet, dass niemand es liebt :)
... und ein paar Bonusgründe, es zu hassen, ohne Aufpreis
quelle
JavaScript :
Alle coolsten Dinge sind wahnsinnig komplex, aber die ganze Coolness ist auch in so wenig Code verpackt, dass Sie sich dumm fühlen, wenn Sie Schwierigkeiten haben, ihm zu folgen
'+' ist eine absurde Wahl des Operators für die Verkettung in einer schwach typisierten Sprache. Haben sie versucht , die Noobs abzuschrecken?
Es ist ein Cross-Browser-Kompatibilitäts-Minenfeld (egal, ob es überhaupt aktiviert ist oder nicht)
Es ist im Allgemeinen nicht vertrauenswürdig - verbunden mit Skummer wie dem Blockieren der Zurück-Taste, Pop-ups, die niemals sterben usw.
Es ist fast unmöglich zu debuggen, da es nur wenige verschiedene Fehlermeldungen und verschiedene Typen gibt (Nummer, Zeichenfolge, Objekt usw.).
Wenn es nicht für jQuery wäre, würde ich es wahrscheinlich immer noch so sehr hassen wie früher :)
quelle
char
s Ganzzahlen zuweisen , alles über void * -Zeiger in alles umwandeln usw.). Es wird statisch statt dynamisch typisiert und erfordert stattdessen eine explizite Typisierung Typinferenz, aber diese haben nichts mit starker v / s schwacher Typisierung zu tun. [Zufällige Beispiele: Python hat implizite dynamische starke Typisierung, Haskell hat (optional explizite) statische starke Typisierung, Java hat explizite (meist statische) starke Typisierung, C hat explizite statische (relativ schwache) Typisierung.] "Stark typisiert" und "schwach typisiert" "sind eigentlich nicht gut definiert.'3'+'2'='32'
,'3'-'2'=1
.PHP:
1) Zwingt mich, unnötige Variablen zu machen:
2) Eine Implementierung von Lambdas, die so lahm ist, dass sie in etwa der Verwendung entspricht
eval()
und so schrecklich falsch ist, dass ich sie nie verwendet habe (siehe http://www.php.net/create_function ).3) Ein Try / Catch-System, das nur etwa 80% der möglicherweise auftretenden Fehler abfangen kann.
4) Regex-Unterstützung ist genauso lahm wie Lambda-Unterstützung, da sie in regulären Zeichenfolgen geschrieben werden muss, was eines der am schwersten zu erlernenden Programmierwerkzeuge etwa dreimal so schwierig macht. Und PHP soll eine "einfache" Sprache sein?!?!?
5) Keine Möglichkeit, Inhalte sicher aus $ _POST herauszuholen, ohne sie zweimal zu schreiben, eine eigene Funktion zu erstellen oder den Operator '@' zu verwenden:
6) Bonusantwort: '@'. Wenn Sie nicht die Mühe haben, Ihren Code richtig zu schreiben, fügen Sie einfach '@' hinzu und schade für jeden, der Ihren Code später debuggen muss.
quelle
C ++
quelle
C # / .NET:
lock
Anweisung geben - stattdessen sollten Sie bestimmte Sperrobjekte haben, und es sollte Methoden geben, wie z. B.Acquire
die Einweg-Sperrtoken zurückgeben. Folgerung: Es sollte nicht für jedes Objekt einen Monitor geben.GetHashCode()
undEquals()
sollte nicht dabei seinSystem.Object
- nicht alles ist zum Hashing geeignet. Stattdessen haben ein ,IdentityComparer
die die gleiche Sache tut, und halten Sie dieIComparer<T>
,IComparable<T>
,IEqualityComparer<T>
undIEquatable<T>
Schnittstellen für individuelle Vergleiche.Die waren mir auf den Kopf gestellt - frag mich morgen und ich werde mir eine andere 5 einfallen lassen :)
quelle
C.
Der manuelle Umgang mit den String-Puffern ist ein fehleranfälliger Schmerz. Da so viel Computer wirklich Zeichenfolgen bewegt und modifiziert (Computer werden nicht so häufig für Dinge verwendet, bei denen große Zahlen eingegeben werden, wie die Leute dachten, sie wären schon lange zurück), ist es wirklich schön, verwaltete Sprachen oder C ++ - Zeichenfolgen verwenden zu können Objekte, um mit diesen umzugehen. Wenn ich es in Straight C machen muss, fühlt es sich an, als würde ich in Treibsand schwimmen.
quelle
Wie wäre es mit fünf Dingen, die ich an "Dinge, die ich an einer Sprache hasse" -Listen hasse? : D.
5- Das Malen eines Orangerots macht es nicht zu einem Apfel.
Wenn eine Sprache entworfen wird, denken die Designer normalerweise daran, wofür sie nützlich ist. Es für etwas völlig anderes zu verwenden kann funktionieren, aber sich zu beschweren, wenn es nicht einfach dumm ist. Nimm Python. Ich bin mir sicher, dass entweder jemand eines Tages ein Dienstprogramm zum Erstellen von Exe aus Python-Code erstellt hat oder dass jemand dies tun wird. Warum um Gottes Erde willst du ? tun? Es wäre ordentlich - versteh mich nicht falsch - aber es hat keinen Sinn. Also hör auf dich darüber zu beschweren!
Ein gut gestaltetes Projekt würde wahrscheinlich Code aus mehreren Sprachen enthalten. Das heißt nicht, dass Sie ein Projekt nicht mit nur einer Sprache abschließen können. Einige Projekte entsprechen möglicherweise den Fähigkeiten der von Ihnen verwendeten Sprache.
4- Stehst du auf Holzbeinen?
Die Plattform kann einen großen Einfluss darauf haben, was die Sprache kann. Heutzutage können Müllsammler oder sogar Pascals frühe Versuche der "Müllsammlung" dazu beitragen, dass das Gedächtnis verblasst (vielleicht mehr RAM?). Computer sind schneller und daher erwarten wir natürlich mehr von unseren Sprachen. Und ganz ehrlich, wir sollten es wahrscheinlich tun. Es ist jedoch ein enormer Preis zu zahlen, damit der Compiler Hash-Tabellen oder -Strings oder eine Vielzahl anderer Konzepte erstellen kann. Diese Dinge werden möglicherweise nicht an die Plattform vererbt, auf der sie verwendet werden. Zu sagen, dass sie leicht in eine Sprache aufgenommen werden können, sagt mir nur, dass Sie möglicherweise kein Bein haben, auf dem Sie stehen können.
3- Wer ist wirklich schuld?
Bugs. Wissen Sie. Ich liebe Käfer. Warum liebe ich Käfer? Weil es bedeutet, dass ich meinen Job behalten kann. Ohne Käfer gäbe es viele geschlossene Pizzerien. Benutzer hassen jedoch Fehler. Aber hier ist ein kleiner Spritzer kaltes Wasser. Jeder Fehler ist die Schuld des Programmierers. Nicht die Sprache. Eine Sprache mit einer so strengen Syntax, die die Anzahl der möglichen Fehler erheblich reduzieren würde, wäre eine völlig nutzlose Sprache. Seine Fähigkeiten könnten wahrscheinlich an einer Hand gezählt werden. Sie wollen Flexibilität oder Kraft? Du hast Fehler. Warum? Weil du nicht perfekt bist und Fehler machst. Nehmen Sie ein wirklich identifizierbares Beispiel in C:
Wir alle wissen, was das tun wird. Was einige von uns jedoch vielleicht nicht erkennen, ist, dass Funktionalität sehr vorteilhaft sein kann. Je nachdem, was Sie tun. Pufferüberschreitungen sind die Kosten für diese Funktionalität. Dieser Code oben. Wenn ich das tatsächlich der Öffentlichkeit zugänglich mache. Das ist wieder .. sag es mit mir .. "Meine Schuld". Nicht C's dafür, dass ich das machen darf.
2- Sollten wir das nicht in den Papierkorb werfen?
Es ist sehr einfach, auf ein Feature in einer Sprache zu verweisen, die wir nicht verstehen, weil wir es nicht oft verwenden und es als dumm bezeichnen. Beschwere dich, dass es da ist usw. Goto unterhält mich immer. Die Leute beschweren sich immer darüber, dass goto in einer Sprache ist. Ich wette, Ihr letztes Programm enthielt eine Art Goto. Wenn Sie jemals eine Pause oder eine Fortsetzung verwendet haben, haben Sie ein goto verwendet. Das ist es. Zugegeben, es ist ein "sicherer" Weg, aber es ist, was es ist. Gehe zu haben ihre Verwendung. Ob "implizite" gotos wie "continue" oder "break" verwendet werden oder explizite gotos (unter Verwendung des tatsächlichen Schlüsselworts "goto" für jede Sprache). Nicht dass Sprachentwickler fehlerfrei sind, aber normalerweise ... wenn Funktionalität seit Anbeginn der Zeit existiert (für diese Sprache). Wahrscheinlich ist dieser Aspekt eine definierende Qualität dieser Sprache. Das heißt .. es ' s wird verwendet und hängt wahrscheinlich aufgrund der Abwärtskompatibilität nicht herum. Es wird heute verwendet. Wie vor 5 Minuten. Und richtig eingesetzt. Nun ... wohl benutzt es auch jemand falsch, aber das bezieht sich auf # 3 auf meiner Liste.
1. - Alles ist ein Objekt.
Ok .. das ist wirklich eine Teilmenge von # 2. Aber dies ist bei weitem die nervigste Beschwerde, die ich in Hasslisten sehe. Nicht alles ist ein Objekt. Es gibt sehr viele Konzepte, die nicht zu Objekten gehören oder sein müssen. Dinge dort zu platzieren, wo sie nicht hingehören, ist einfach hässlich und kann die Effizienz eines Programms beeinträchtigen. Sicher. Je nach Sprache vielleicht nicht viel. Dies bezieht sich auch auf # 5. Das heißt ... ja. Global sind in Ordnung. Funktionen für statische Methoden sind in Ordnung. Die Kombination von OO-Programmierung mit globalen Funktionen ist in Ordnung. Das bedeutet nicht, dass wir alle unseren Code von seinen Objektmodellen "befreien" sollten. Was passiert beim Entwerfen eines Codeabschnitts oder eines ganzen Projekts hinter den Kulissen? sollte ?beim Zusammenstellen berücksichtigt werden. Nicht nur dort, wo dieses Konzept lebt und viele andere Faktoren. Warum globale Funktionen in Klassen oder Namensraumkonzepte einbinden, wenn dies keinen Zweck erfüllt? Nehmen Sie statische Elementvariablen. Das amüsiert mich sehr, weil ... nun ... Abhängig von der Sprache und der Implementierung natürlich, aber im Allgemeinen haben Sie gerade eine globale deklariert. Ja, es gibt einige Gründe, diese Nicht-OO-Konzepte in OO-Wrapper zu verpacken. Eine davon ist natürlich selbstdokumentierender Code. Das kann Sinn machen. Also ... wie ich schon sagte. Gehen Sie nicht raus und "befreien" Sie Ihren Code. Aber jede gute moderne Sprache wird ein globales Konzept außerhalb ihrer OO-Modellierung haben. Ja, ich möchte ausdrücklich darauf hinweisen, dass eine OO-Programmiersprache ohne globales Konzept höchstwahrscheinlich einen schwerwiegenden Designfehler aufweist. Wieder aber .. hängt von der Absicht und dem Design der Sprache ab, daher versuche ich nicht, eine bestimmte Sprache auszuwählen, und es gibt viel zu viele, um sie hier zu analysieren. Überlegen Sie, wo der Code leben und am effektivsten sein soll. Wenn Sie etwas hinzufügen, das weder Funktionalität noch Unterstützung bietet, wird die Tastatur schneller zermürbt. Es tut niemandem gut. Nun ... es sei denn, Sie mögen Brownie-Punkte von der Person, die Ihnen wahrscheinlich fälschlicherweise beigebracht hat, dass alles ein Objekt ist.
Kurz gesagt, das Programmieren ist nicht nur ein gedankenloses Tippen auf die Tastatur. Bei jedem Projekt gibt es viele Überlegungen zum Design. Ich weiß, dass es ein Klischee ist, aber man muss es aus jedem Blickwinkel betrachten. Auch bei heutigen typsicheren Sprachen. Sie werfen nicht nur Code raus und erwarten, dass er gut funktioniert. Sicher ... es mag funktionieren, aber es ist möglicherweise nicht der richtige Weg, dies zu tun. Wählen Sie insgesamt die Sprache und das Format aus, die für den jeweiligen Job UND die Umgebung am besten geeignet sind. Aber keine Sprache nimmt den Gedanken dahinter weg. Wenn Sie nicht denken, tippen Sie nur.
quelle
Fünf Dinge, die ich an Java (das derzeit meine Lieblingssprache ist) hasse , in keiner bestimmten Reihenfolge.
quelle
Ruby hat viele Fehler in Bezug auf seine Geschwindigkeit, aber ich hasse diese nicht. Es hat auch Mängel, wenn die Evangelisation in der Gemeinde über Bord geht, aber das stört mich nicht wirklich. Das hasse ich:
Die Art und Weise, wie der Block an Funktionen übergeben wird, ist albern. Es gibt keinen Grund, warum Blöcke außerhalb der Parameterliste übergeben werden sollten oder eine ungerade spezielle Syntax für den Zugriff haben sollten (Yield). Ich bin der Meinung, dass Blöcke eine weniger mehrdeutige Syntax haben sollten (oder Hashes könnten andere Trennzeichen verwendet haben; vielleicht <> statt {}), und die Übergabe als Parameter an Methoden sollte genau wie alle anderen Parameter sein.
Diese Kuriositäten, wie der Block der letzte übergebene Parameter sein muss und das Übergeben von mehr als einem Block bei längerer Syntax unterschiedlich ist, ärgern mich wirklich.
quelle
Perl
Gemischte Verwendung von Siegeln
Zum Beispiel ist keines davon dasselbe:
Darin
Perl6
steht geschrieben :Mangel an wahrem OO
Darin
Perl6
steht geschrieben :Schlecht gestaltete Regex-Funktionen
Darin
Perl6
steht geschrieben :Fehlender Mehrfachversand
Darin
Perl6
steht geschrieben :Schlechte Überlastung des Bedieners
Darin
Perl6
steht geschrieben :quelle
Ich werde PHP machen, wie es mir manchmal gefällt und Python wird viel zu viel gemacht.
Kein Namespace; Alles befindet sich in einer Art sehr großem Namespace, der in größeren Umgebungen die Hölle ist
Mangel an Standards, wenn es um Funktionen geht: Array-Funktionen nehmen eine Nadel als erstes Argument, Heuhaufen als zweites (siehe array_search ). String-Funktionen nehmen oft zuerst den Heuhaufen, dann die Nadel (siehe Strpos ). Andere Funktionen verwenden nur andere Namensschemata: bin2hex , strtolower , cal_to_jd
Einige Funktionen haben seltsame Rückgabewerte, was nicht normal ist: Dies zwingt Sie dazu, eine dritte Variable aus dem Nichts deklarieren zu lassen, während PHP ein leeres Array mit seinem Typ-Jonglieren effizient als falsch interpretieren könnte. Es gibt so gut wie keine anderen Funktionen, die dasselbe tun.
Die Sprache (bis PHP6) bemüht sich, eine nahezu verzögerte Abwärtskompatibilität zu respektieren, sodass sie schlechte Praktiken und Funktionen enthält, wenn sie nicht benötigt wird (siehe mysql_escape_string vs. mysql_real_escape_string ).
Die Sprache entwickelte sich von einer Template-Sprache zu einer Full-Backend-Sprache. Dies bedeutet, dass jeder alles ausgeben kann, wann er will, und es wird missbraucht. Sie erhalten Template-Engines für eine Template-Sprache ...
Es ist scheiße beim Importieren von Dateien. Sie haben 4 verschiedene Möglichkeiten (include, include_once, require, require_once), die alle langsam, sehr langsam sind. Tatsächlich ist die ganze Sprache langsam. Zumindest ziemlich langsamer als Python (sogar mit einem Framework) und RoR, wie ich erfahre.
Ich mag PHP trotzdem. Es ist die Kettensäge der Webentwicklung: Sie möchten, dass eine kleine bis mittlere Website sehr schnell erstellt wird und dass jeder sie hosten kann (obwohl die Konfigurationen unterschiedlich sein können)? PHP ist genau dort und so allgegenwärtig, dass die Installation eines vollständigen LAMP- oder WAMP-Stacks nur 5 Minuten dauert. Nun, ich werde jetzt wieder mit Python arbeiten ...
quelle
Hier sind einige Dinge, die ich an Java nicht mag (was nicht meine Lieblingssprache ist):
quelle
C ++
Python
quelle
Ziel c
1) Keine Namespaces, nur manuelle Namenskonventionen - das stört mich in Bezug auf die Klassentrennung nicht, aber ich vermisse es, alle Klassendefinitionen in einem Namespace in einer einzigen Zeile importieren zu können (wie import com.me.somelibrary. *).
2) Bibliotheken haben noch einige Lücken in wichtigen Bereichen wie der RegEx-Unterstützung.
3) Die Eigenschaftssyntax ist etwas umständlich und erfordert drei Zeilen (in zwei separaten Dateien), um eine Eigenschaft zu deklarieren.
4) Ich mag das Retain / Release-Modell, aber es ist einfacher als es sein sollte, eine Referenz freizugeben und sie später versehentlich zu verwenden.
5) Obwohl Xcode nicht wirklich eine Sprachfunktion ist, ist es so eng mit der Verwendung von Objective-C verbunden, dass ich über diesen Aspekt nachdenken muss ... im Grunde ist die automatische Vervollständigung sehr zweifelhaft. Es ist eher ein System, das Sie dafür belohnt, dass Sie etwas gefunden haben, das Sie möchten, und es anschließend als Auswahl präsentiert. Aber dann habe ich Autocomplete-Motoren wohl nie gemocht.
quelle
YES/NO
dass Boolesche Werte eine schlechte Sache sind? Und was noch wichtiger ist: Sagen Sie, dass benannte Parameter eine schlechte Sache sind? Ich kann Bools verstehen, aber benannte Parameter sind möglicherweise eine der besten Funktionen von ObjC (in Bezug auf die Lesbarkeit).C ++
Saiten.
Sie sind nicht mit Plattformzeichenfolgen kompatibel, sodass Sie die Hälfte der Zeit std :: vector verwenden. Die Kopierrichtlinie (Copy on Write oder Deep Copy) ist nicht definiert, daher können keine Leistungsgarantien für eine einfache Syntax gegeben werden. Manchmal stützen sie sich auf STL-Algorithmen, die nicht sehr intuitiv zu bedienen sind. Zu viele Bibliotheken rollen ihre eigenen, die leider viel komfortabler zu bedienen sind. Es sei denn, Sie müssen sie kombinieren.
Vielzahl von String-Darstellungen
Nun, dies ist ein kleines Plattformproblem - aber ich hoffe immer noch, dass es besser gewesen wäre, wenn eine weniger hartnäckige Standard-String-Klasse früher verfügbar gewesen wäre. Die folgenden Zeichenfolgendarstellungen verwende ich häufig:
Modell erstellen.
Ich bin todkrank wegen all der Zeit, die ich damit verbracht habe, mich mit Who-Includes-What, Forward-Deklarationen, der Optimierung vorkompilierter Header und Includes zu beschäftigen, um zumindest inkrementelle Build-Zeiten erträglich zu halten usw. Es war großartig in den achtziger Jahren, aber jetzt? Es gibt so viele Hürden, ein Stück Code zu packen, dass es wiederverwendet werden kann, dass selbst Mütterhunde sich langweilen, wenn sie mir zuhören.
Schwer zu analysieren
Dies macht es besonders schwierig, externe Tools zu schreiben und richtig zu machen. Und heute fehlt es uns C ++ - Leuten hauptsächlich in der Werkzeugkette. Ich liebe meine C # -Reflexion und meine Delegierten, aber ich kann ohne sie leben. Ohne großartiges Refactoring kann ich nicht.
Threading ist zu schwer Die
Sprache erkennt es (bis jetzt) nicht einmal, und die Freiheiten des Compilers sind zwar großartig, aber zu schmerzhaft.
Statische und On-Demand-Initialisierung Technisch gesehen betrüge ich hier: Dies ist ein weiteres Puzzleteil im "Wrap-Up-Code zur Wiederverwendung": Es ist ein Albtraum, etwas nur dann zu initialisieren, wenn es benötigt wird. Die beste Lösung für alle anderen Redist-Probleme besteht darin, alles in Header zu werfen. Dieses Problem lautet "neeener - du kannst nicht".
Zugegeben, vieles davon geht über den strengen Sprachumfang hinaus, aber IMO muss die gesamte Toolchain beurteilt und weiterentwickelt werden.
quelle
std::string
? Vielleicht könnte das Lesen einer guten Dokumentation und / oder eines Tutorials überstd::vector
(und warum Sie es nicht anstd::string
Orten verwenden sollten, für die es nie entwickelt wurde) dies für Sie klären.std::string
wenn ich ihn die Hälfte der Zeit nicht verwenden kann? (C ++ 0x behebt das zumindest, aber ich bin immer noch mit Dutzenden von Bibliotheken beschäftigt, die unterschiedliche Zeichenfolgendarstellungen verwenden).but why do we have to bother with them (inclusion guards)
- weil C ++ keine Module hat.How "standard" is a std::string if I can't use it half of the time?
- Ich denke, das hängt davon ab, wie Sie es verwendenstd::string
. Mit der String-Klasse können Sie wie über auf die String-Datenconst char*
zugreifenstd::string::c_str
, was bereitsstd::string
mit jeder Klasse / Funktion, die auchconst char*
Argumente akzeptiert, perfekt kompatibel ist .JavaScript :
Der
Object
Prototyp kann geändert werden. Jedes einzelne Objekt in Ihrem Programm erhält neue Eigenschaften, und wahrscheinlich bricht etwas zusammen.Alle Objekte sind Hash-Maps, aber es ist schwierig, sie sicher als solche zu verwenden. Insbesondere wenn einer Ihrer Schlüssel zufällig ist
__proto__
, sind Sie in Schwierigkeiten.Kein Objektschluss zur Funktionsreferenzzeit. Tatsächlich wird überhaupt kein Objekt geschlossen - stattdessen
this
wird festgelegt, wann immer eine Funktion mit Objektnotation oder demnew
Operator aufgerufen wird . Dies führt zu großer Verwirrung, insbesondere beim Erstellen von Ereignisrückrufen, dathis
nicht die Erwartungen des Programmierers festgelegt sind.new
Operators führt dazu,this
dass sie dem globalen Objekt gleichgesetzt wird, was zu erheblichen Brüchen führt.Der Additionsoperator ist überladen, um auch eine Zeichenfolgenverkettung durchzuführen, obwohl sich die beiden Operationen grundlegend unterscheiden. Führt zu Schmerzen, wenn ein Wert, von dem Sie erwarten, dass er eine Zahl ist, tatsächlich eine Zeichenfolge ist.
==
und!=
Operatoren üben Typzwang aus. Vergleiche zwischen verschiedenen Typen beinhalten eine Liste von Regeln, an die sich kein Sterblicher vollständig erinnern kann. Dies wird durch die Existenz von===
und!==
Betreibern gemildert .Beides
null
undundefined
existieren mit subtil unterschiedlichen, aber redundanten Bedeutungen. Warum?Seltsame Syntax zum Einrichten von Prototypketten.
parseInt(s)
erwartet eine Zahl im C-Stil, behandelt also Werte mit führenden Nullen als Oktal usw. Sie können dies zumindest,parseInt(s, 10)
aber das Standardverhalten ist verwirrend.Kein Blockbereich.
Kann dieselbe Variable mehrmals deklarieren.
Kann eine Variable verwenden, ohne sie zu deklarieren. In diesem Fall ist sie global und bricht wahrscheinlich Ihr Programm.
with { }
.Wirklich schwierig mit JavaDoc-ähnlichen Tools zu dokumentieren.
quelle
null
undundefined
: Manchmal möchten Sie wirklich wissen, ob der Variablen ein Wert zugewiesen wurde oder nicht. Da null ein Wert ist, ist undefined die einzige Möglichkeit, dies festzustellen. Zugegeben, das einzige Mal, dass ich dies nützlich fand, war das Erstellen von Getter / Setter-Funktionen.for
als Variablenname verwenden können."for"
als Hash-Schlüssel.__proto__
ist kein reserviertes Wort. Spezielle Zeichenfolgenwerte, die bei Verwendung als Hash-Schlüssel nicht wie erwartet funktionieren, verstoßen gegen angemessene Erwartungen hinsichtlich der Funktionsweise von assoziativen Arrays in einer beliebigen Sprache. Sie verstoßen auch gegen die EcmaScript-Spezifikation.newline may or may not end a statement depending on context
ist einer in meiner Top 5 ListePython:
__init__
)__getattr__
nicht)print
Verknüpfen einer Datei (aber das wird in Python 3 behoben)quelle
C #
Ich wünschte, ich könnte
switch()
auf jedem Typ, und dascase
könnte jeder Ausdruck sein.Die Objektinitialisierersyntax kann nicht mit 'schreibgeschützten' Feldern /
private set
Autoprops verwendet werden. Im Allgemeinen möchte ich Sprachhilfe bei der Erstellung unveränderlicher Typen.Verwendung von
{}
für Namespace- und Klassen- sowie Methoden- und Eigenschafts- / Indexerblöcke sowie Blöcken mit mehreren Anweisungen und Array-Initialisierern . Macht es schwierig herauszufinden, wo Sie sind, wenn sie weit voneinander entfernt sind oder nicht übereinstimmen.Ich hasse es zu schreiben
(from x in y ... select).Z()
. Ich möchte nicht auf die Methodenaufrufsyntax zurückgreifen müssen, da der Abfragesyntax etwas fehlt.Ich möchte eine
do
Klausel zur Abfragesyntax, die wie folgt istforeach
. Aber es ist dann nicht wirklich eine Frage.Ich erreiche wirklich hier. Ich finde C # fantastisch und es ist schwer, viel zu finden, was kaputt ist.
quelle
PHP
quelle
C (OK, es ist nicht mein Favorit, aber es wurde noch nicht gemacht.)
BEARBEITEN: Ich könnte mir wahrscheinlich mehr einfallen lassen, wenn ich auf mehr Bibliothekscode zurückgreifen würde (wie ich es mit Sockets getan habe, aber diese sind besonders schlecht), aber ich hatte bereits das Gefühl, dass ich betrogen habe, weil ich C ausgewählt habe. Es gibt so viele Sprachen, die nur zum Mitnehmen existieren die guten Teile von C und ersetzen die schlechten, dass es so ist, als würde man ein totes Pferd schlagen.
quelle
Common Lisp:
quelle
BrainF * ck
Ihr Highlight ist, dass Sie Turing komplett sind ?! Ich kann mehr in regulären Perl-Ausdrücken tun!
Mangel an Gegenständen. Komm schon, Leute! Es ist wie, hallo ...
Keine Netzwerkbibliotheken. Ich möchte nur eine Webseite kratzen, GOSH.
Keine erstklassigen Funktionen. Herzlichen Glückwunsch - Sie können mit Ihren Java-Freunden Mitleid haben.
Ein unendliches Band zur Aufbewahrung und sonst nichts. Dies ist so anal anmaßend, dass wir genauso gut Lisp schreiben könnten.
quelle
JavaScript
quelle
PHP:
Trotzdem ist PHP die (Skriptsprache). ;-);
quelle
VB6
quelle
Ruby ist meine Lieblingssprache. Folgendes mag ich nicht:
quelle
Delphi:
quelle
JavaScript
Jedes Skript wird in einem einzigen globalen 'Namespace' ausgeführt ... etwas, auf das Sie achten müssen, wenn Sie mit Skripten aus verschiedenen Quellen arbeiten
Wenn eine Variable verwendet wird, aber noch nicht definiert wurde, wird sie als globale Variable betrachtet
Browser-Anbieter stellen nach Belieben Standards auf, was das Codieren für uns Entwickler, die eine so schöne Sprache verwenden, schwieriger macht, als es sein sollte
Groß- und Kleinschreibung beachten - wenn man bedenkt, dass es keine anständige IDE für die Entwicklung von js mit Überprüfung der Kompilierungszeit gibt
Problemumgehungen (z. B. die Verwendung von
hasOwnProperty
Methoden) zum Ausführen einiger ansonsten einfacher Vorgänge.quelle
Haskell:
($)
Operators könnte geändert werden, um einige Ausdrücke schöner zu machen.Die meisten davon erreichen nicht das Niveau des Hasses, und es gibt Leute, die versuchen, solide Problemumgehungen für jedes dieser Probleme zu beheben oder zu konstruieren.
Bearbeiten: Es gab einige Verwirrung über Punkt 5. Insbesondere scheinen einige Leute zu denken, dass ich die Reihenfolge der Argumente gemeint habe, was ich nicht tue. Anstatt zu erklären, was ich meinte, verweise ich die Leute einfach auf den folgenden Link, http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , der es gut ausdrückt.
quelle