Was sind fünf Dinge, die Sie an Ihrer Lieblingssprache hassen? [geschlossen]


403

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.


11
Dies ist eine wirklich schöne Variante der alten Frage "Ihre Lieblingssprache". Gute Begründung.
Tom Leys

14
Ich finde es interessant, dass es zum Zeitpunkt dieses Schreibens 24 Antworten gibt, von denen sich nur eine (meine) mit .NET oder einer .NET-Sprache befasst, obwohl SO ein großes .NET-Publikum hat. Ich habe keine Ahnung, was dies über SO oder .NET sagt, aber es ist interessant ...
Jon Skeet

22
Die ersten 15 Jahre der Programmierung mit C / C ++ hasste ich (in alphabetischer Reihenfolge): 1. Zeiger 2. Zeiger 3. Zeiger 4. Zeiger 5. Zeiger 5. Zeiger
Ileon

4
Ich frage mich, wie viele Kommentare die Leute über den Hass auf die Sprache ihrer Wahl gemacht haben, weil sie nicht verstanden haben, wie man in der Sprache ihrer Wahl
programmiert

3
Das ist eine fantastische Frage. Wenn Sie sich fragen, wie eine Sprache aussieht, ist das Lesen von 3 verschiedenen Antworten auf dieser Seite mit Sicherheit die beste nützliche Information für die Zeit, die Sie finden können. Auch eine gute Möglichkeit, die Erfahrung (und Demut) eines Programmierers zu messen, wenn Sie die Sprache bereits kennen.
j_random_hacker

Antworten:


182

Fünf Dinge, die ich an Java hasse:

  • Keine erstklassigen Funktionen.
  • Keine Typinferenz.
  • Fehlende vernünftige Standardeinstellungen in z. B. Grafiken.
  • NullPointerException enthält keine weiteren Informationen darüber, was null ist.
  • Die Verbreitung sinnlos "konfigurierbarer" Frameworks / Dienstanbieterschnittstellen / Factory-Klassen / Abhängigkeitsinjektionssysteme. Die Konfigurierbarkeit wird fast nie verwendet, DRY wird ungeheuerlich verletzt und der Code vervierfacht sich in der Größe und halbiert die Lesbarkeit.

Ich weiß, ich sollte mir Scala ansehen.


7
@both: Die NPE wird in der ersten Zeile der Stack-Trance angezeigt. Es enthält (meistens) Klasse, Java-Dateinamen und Zeilennummer wie: "at your.faulty.code.Instance (Intance.java:1234)" Dann öffnen Sie einfach diese Datei, gehen zu dieser Zeile und dort ist eine Variable, der nichts zugewiesen ist.
OscarRyz

35
@ Oscar Reyes - Äh, das wissen wir. In dieser Zeile befinden sich möglicherweise mehrere Variablen, und die Ausnahmemeldung sagt mir nicht, welche null ist.
Zarkonnen

10
Scala hat auch seine Warzen. Es ist jedoch großartig besser als Java.
Wheaties

10
+1 für die Verbreitung von Frameworks usw.
Erich Kitzmüller

6
@Valentin, stellen Sie sich vor, der Spaß an der NullPointerException befindet sich in einer riesigen Protokolldatei eines nächtlichen Laufs, und Sie müssen herausfinden, was passiert ist ... Debugging ist keine Option.
Thorbjørn Ravn Andersen

216

Wow, ich bin überrascht, dass SQL es hier noch nicht geschafft hat. Ich denke, das bedeutet, dass niemand es liebt :)

  • Inkonsistente Syntax über Implementierungen hinweg
  • Subtile Codeunterschiede können aus scheinbar unklaren Gründen massive Auswirkungen auf die Leistung haben
  • Schlechte Unterstützung für Textmanipulation
  • Einfache Eintrittskosten, aber steile Lernkurve zur Beherrschung der Sprache
  • Minimale Standardisierung in der gesamten Community für Best Practices, einschließlich Syntaxstil.

... und ein paar Bonusgründe, es zu hassen, ohne Aufpreis

  • Die WHERE-Klausel ist die letzte, die es einfach macht, ein UPDATE oder DELETE vorzeitig auszuführen, wodurch die gesamte Tabelle zerstört wird. Stattdessen sollte das WO irgendwo vorne hingehen.
  • Es ist schwierig, eine relationale Teilung zu implementieren.
  • Ich kann einen Wert auf NULL setzen, aber ich kann ihn nicht auf Gleichheit mit NULL testen. Ich kann IS NULL überprüfen, aber das macht den Code nur komplizierter - meiner Meinung nach unnötig.
  • Warum müssen wir die Formel für eine GROUPed-Spalte vollständig neu spezifizieren, anstatt einen Alias ​​für die Spalte und dann GROUP BY den Alias ​​(oder den Spaltenindex wie bei SORT) festzulegen?

7
Vielleicht kann niemand lernen, es zu lieben, bis er aufhört, es als Sprache zu betrachten. :)
Alan Moore

4
+1 für alles. Und doch fragen sich die Leute, warum ich die Kopfschmerzen von ORM ertragen werde ...
James Schek

2
@ Alan M ... ist das nicht das, wofür das L steht? :)
Kev

29
Ich kann nicht verstehen, warum sich die Syntax für INSERT so stark von UPDATE unterscheidet. Und MERGE ist unverständlich.
LaJmOn

3
Die Notwendigkeit von IS NULL sollte klar sein, wenn Sie bedenken, dass NULL ein drittes mögliches Ergebnis ist, direkt nach TRUE und FALSE. Da die Bedeutung "unbekannt" ist, kann man nicht sagen, ob etwas Unbekanntes mit einem anderen Unbekannten übereinstimmt. Ein weiteres Beispiel: Wenn NULL gleich NULL ist, würde dies bedeuten, dass das gesamte Konzept der Erstellung von JOINs unmöglich wäre, da jeder NULL-Wert mit einem anderen NULL-Wert abgeglichen werden könnte. Wenn Sie dies verstehen (was auch als ternäre Logik bezeichnet wird), verstehen Sie möglicherweise den Grund für die Einführung des Operators "IS" zum Testen gegen NULL.
Alex

159

JavaScript :

  1. 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

  2. '+' ist eine absurde Wahl des Operators für die Verkettung in einer schwach typisierten Sprache. Haben sie versucht , die Noobs abzuschrecken?

  3. Es ist ein Cross-Browser-Kompatibilitäts-Minenfeld (egal, ob es überhaupt aktiviert ist oder nicht)

  4. Es ist im Allgemeinen nicht vertrauenswürdig - verbunden mit Skummer wie dem Blockieren der Zurück-Taste, Pop-ups, die niemals sterben usw.

  5. 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 :)


15
Ich stimme mausch zu. ECMAscript an und für sich ist eine schöne und mächtige Sprache. Es sind die lästigen Browser (: Husten: IE), die den Namen durcheinander bringen.
TJ L

32
@Mausch: Wo lebt Javascript in den allermeisten Fällen? Sie sagen, das Äquivalent von "Autos tragen nicht zur globalen Erwärmung bei, sondern fahren Autos" - natürlich, aber ohne den Punkt - was machen Sie sonst noch mit einem Auto?
jTresidder

20
@Chris: Ja, "+" ist ein guter Operator für die Verkettung in einer stark typisierten Sprache (wie Python). In einer schwach getippten Sprache (wie Javascript oder C) ist es schrecklich; es entscheidet (lautlos!), dass 'sum:' + 2 + 3 nicht 'sum: 5' ist, sondern 'sum: 23'. Jemand mit mehr Javascript-Erfahrung kann bessere Beispiele geben.
ShreevatsaR

5
Ja, C ist im Vergleich zu beispielsweise Python schwach typisiert (z. B. können Sie chars 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.
ShreevatsaR

5
@ShreevatsaR Das klassische Beispiel ist: '3'+'2'='32', '3'-'2'=1.
Thomas Ahle

148

PHP:

1) Zwingt mich, unnötige Variablen zu machen:

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

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:

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

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.


44
was ist mit list ($ first) = explode ('|', $ string); ?
mlarsen

44
Idealerweise möchte ich some_function verwenden (explode ('|', $ string) [0]);
zu viel PHP

8
Welches seltsame variable Scoping? Es ist eine gute Idee, alles lokal zu haben und zu zwingen, zu deklarieren, wann Sie ein globales verwenden möchten. Es verhindert, dass Noobs Funktionen erstellen, die nur globale Werte verwenden, anstatt Argumente zu verwenden und Werte zurückzugeben, wie sie es sollten.
Scragar

24
Sie haben Funktionen vergessen, bei denen sich die Parameterreihenfolge zufällig ändert
dusoft

39
Sie haben verbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb usw. vergessen.> _>
Warty

135

C ++

  • Es ist viel zu einfach, den Speicher zufällig zu beschädigen und fast unmöglich zu findende Fehler zu erstellen (obwohl Valgrind einen großen Beitrag zur Behebung dieses Problems leistet ).
  • Vorlagenfehlermeldungen.
  • Wenn Sie Vorlagen verwenden, ist es einfach, alles in eine Datei aufzunehmen und dann dumme Kompilierungszeiten zu bekommen.
  • Die Standardbibliothek ist in der heutigen Zeit ein Witz (standardmäßig noch keine Threads oder Netzwerke?)
  • Viele böse kleine Teile von C stechen durch (insbesondere alle Konvertierungen zwischen short / int / unsigned / etc ..)

13
Ich stimme der STL zu, aber ich werde sagen, was da ist, ist ziemlich gut.
Bernard

22
Unicode. Ich respektiere die Einfachheit von ASCII, aber um Himmels willen, wir sind jetzt weit im 21. Jahrhundert.
Wilhelmtell

29
@Kieveli const Korrektheit ist eigentlich eines der Dinge, die ich am meisten vermisse, wenn ich in anderen Sprachen programmiere. besonders die dynamisch getippten. Raii ist ein großes Feature, das ich auch oft vermisse.
Wilhelmtell

6
Die meisten C ++ - Probleme sind auf einen ISO-Standard zurückzuführen und für 10 Jahre gesperrt.
Graham.reeds

7
+1 "Vorlagenfehlermeldungen."
João Portela

129

C # / .NET:

  • Klassen sollten standardmäßig versiegelt sein
  • Es sollte keine lockAnweisung geben - stattdessen sollten Sie bestimmte Sperrobjekte haben, und es sollte Methoden geben, wie z. B. Acquiredie Einweg-Sperrtoken zurückgeben. Folgerung: Es sollte nicht für jedes Objekt einen Monitor geben.
  • GetHashCode()und Equals()sollte nicht dabei sein System.Object- nicht alles ist zum Hashing geeignet. Stattdessen haben ein , IdentityComparerdie die gleiche Sache tut, und halten Sie die IComparer<T>, IComparable<T>, IEqualityComparer<T>und IEquatable<T>Schnittstellen für individuelle Vergleiche.
  • Schlechte Unterstützung für Unveränderlichkeit
  • Schlechte Art, Erweiterungsmethoden zu entdecken - es sollte eine viel bewusstere Entscheidung sein als nur die Tatsache, dass ich einen Namespace verwende.

Die waren mir auf den Kopf gestellt - frag mich morgen und ich werde mir eine andere 5 einfallen lassen :)


22
Standardmäßig versiegelt: Die Vererbung sollte entweder in eine Klasse unterteilt werden (was Zeit kostet und zukünftige Optionen einschränkt) oder verboten werden. hashCode / equals: Es saugt auch Java an. Eines Tages werde ich einen langen Blog-Beitrag darüber schreiben. Lesen Sie Effective Java, um zu erfahren, warum Gleichheit in Vererbungsketten schwierig ist.
Jon Skeet

88
Standardmäßig zu versiegeln bedeutet, dass Sie über jeden möglichen Grund nachgedacht haben, den jemand von Ihrer Klasse erben möchte, und Sie glauben, dass keiner von ihnen Sinn macht. Sorry, aber keiner von uns ist so schlau.
Ed S.

69
In diesem Fall bin ich nicht klug genug, um von meinem Code abzuleiten: weil ich nicht vorhersagen kann, welche zukünftigen Änderungen ich vornehmen könnte, die Ihren Code beschädigen könnten. Das ist ein sehr bedeutendes Problem, IMO. Das Versiegeln des Codes ist restriktiver, führt jedoch zu mehr Implementierungsfreiheit und Robustheit.
Jon Skeet

11
Ich kann nicht glauben, dass niemand die "goto case" -Syntax erwähnt hat, ich hasse diese!
Aistina

20
Es ist gut, dass Jon Skeet kein C # entworfen hat, oder meine Liste würde so aussehen: "1. Klassen sind standardmäßig versiegelt; 2. Sperren ist zu kompliziert; 3. Die meisten Objekte sind nicht hashbar"!
Gabe

113

C.

  • String-Manipulation.

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.


50
Einverstanden. String-Manipulation ist Punkt 1 bis 5 von Dingen, die ich an C hasse.
BoltBait

1
Verwenden Sie einfach die sichere String-Bibliothek von DJB oder so. Die XML-Manipulation ist in den meisten Sprachen schwierig, und viele Programme führen XML-Manipulationen durch, aber es werden nicht viele Beiträge angezeigt, in denen steht: "Perl ist völlig kaputt, weil es DOM-Knoten als primitiven Datentyp nicht unterstützt." Sie benutzen eine Bibliothek.
Steve Jessop

5
Die Manipulation von C-Strings ist zwar scheiße, aber was Sprachprobleme betrifft, ist es nicht das Schlimmste.
Chris Lutz

3
strcat zu verketten, aber warten ... hat das Ziel genügend Speicherplatz ... ok, muss if-Anweisung einfügen, um zu überprüfen ... aber warten Sie, was ist, wenn sich meine Zeichenfolge auf dem Heap befindet? Ok, muss eine Variable behalten, um die Größe zu verfolgen ... Und das kann weiter und weiter und weiter gehen ...
blwy10

4
Wir brauchen einen Thread für fünf Dinge, die wir an C nicht hassen ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

94

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:

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

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.


19
Sprachen sind nicht perfekt, und wenn Sie eine Liste von Dingen erstellen, die Sie an einer Sprache hassen, erhalten Sie möglicherweise einige interessante Kommentare und Ideen. Erstens können andere Ihnen Lösungen geben, von denen Sie nicht wussten, dass sie existieren (sehen Sie sich die Beiträge an, Sie werden sehen, dass einige Dinge gelernt wurden). Zweitens stellt es ein Benutzerfeedback für die Sprachentwickler dar (wären Sie nicht interessiert, wenn Ihre Benutzer eine Liste der 5 Dinge erstellt hätten, die sie an Ihrer Software am meisten hassen?), Und drittens ist es ein bisschen interessant, über die Fehler nachzudenken Ihrer Werkzeuge.
Sylverdrag

4
Wenn Sie es auf dieser Ebene anzeigen, sind nicht nur break and continue gotos, sondern Schleifen gotos (springen Sie an den Anfang der Schleife, wenn die Bedingung erfüllt ist), wenn goto (wenn die Bedingung nicht erfüllt ist, springen Sie über den Block, Funktionsaufrufe sind goto (springe zum Anfang der Funktion und springe später zurück), ...
Helium

17
Das Erstellen ausführbarer Dateien aus dem Quellcode "hat keinen Sinn"? Was?
Detly

4
Perl konnte seit Ende der 80er Jahre eine ausführbare Datei aus einer Perl-Datei erstellen. Eine Sache zu verteilen ist nützlich. Keine Notwendigkeit, a) Perl zu installieren, b) Programmkomponenten zu installieren, c) vielleicht ein Skript zu schreiben, um Pfade festzulegen und alles auszuführen ... Ja, wirklich nutzlos.
Xcramps

1
Wenn Sie jedoch keine EXE-Dateien aus der Quelle erstellen können, können Windows-Benutzer diese nicht ausführen. ;)
Evan Plaice

88

Fünf Dinge, die ich an Java (das derzeit meine Lieblingssprache ist) hasse , in keiner bestimmten Reihenfolge.

  1. So sehr ich ein Fan von Java Generics bin, gibt es viele Kuriositäten, die sich aus der Art und Weise ergeben, wie es entworfen wurde. Als solche gibt es eine Vielzahl von ärgerlichen Einschränkungen bei Generika (von denen einige das Ergebnis der Typlöschung sind).
  2. Die Funktionsweise von Object.clone () und den klonbaren Schnittstellen ist völlig fehlerhaft.
  3. Anstatt die Landstraße zu nehmen und alles zu einem Objekt zu machen (a.la. SmallTalk), hat Sun zwei verschiedene Kategorien von Datentypen erstellt: Objekte und Grundelemente. Infolgedessen gibt es jetzt zwei Darstellungen für grundlegende Datentypen und seltsame Kuriositäten wie Boxen / Entpacken und das Nichteinfügen von Grundelementen in eine Sammlung.
  4. Swing ist zu komplex. Versteh mich nicht falsch: Es gibt viele coole Sachen, die man mit Swing machen kann, aber es ist ein großartiges Beispiel für Überentwicklung.
  5. Diese letzte Beschwerde ist gleichermaßen die Schuld von Sun und denen, die XML-Bibliotheken für Java geschrieben haben. Java XML-Bibliotheken sind viel zu kompliziert. Um einfach eine XML-Datei einzulesen, muss ich mir oft Gedanken darüber machen, welchen Parser ich verwende: DOM oder SAX? Die APIs für jeden sind gleichermaßen verwirrend. Native Unterstützung in der Sprache zum einfachen Parsen / Schreiben von XML wäre sehr nett.
  6. java.util.Date ist scheiße. Es ist nicht nur unnötig kompliziert, sondern alle nützlichen Methoden wurden veraltet (und durch andere ersetzt, die die Komplexität erhöhen).

32
Sie haben java.util.Date vergessen!
TM.

3
Außerdem: Die "Cloneable" -Schnittstelle verfügt nicht über eine "clone ()" - Methode. Dies macht die klonbare Schnittstelle zu einem Oxymoron. Und da clone () ein Objekt zurückgibt, ist die Typensicherheit aus dem Fenster (es wird kein Versuch unternommen, dies zu korrigieren, selbst nachdem Generics in J2SE 5.0 eingeführt wurde).
Ryan Delucchi

2
Solange wir klonbar schlagen, könnte genauso gut die sogenannte serialisierbare "Schnittstelle" enthalten sein. Wann immer ich es benutze, möchte ich mich immer erstechen.
WDS

12
Es ist schwierig, einfache Dinge wie das Öffnen einer Datei und das Lesen daraus zu tun.
Eric Johnson

3
@Ryan clone () muss nicht unbedingt "Object" zurückgeben. Mit J2SE 5.0 hat Java kovariante Rückgabetypen eingeführt, was bedeutet, dass Sie jeden Subtyp einer Basisklasse zurückgeben können. Ein öffentlicher MyType-Klon () ist also möglich!
Hilfsmethode

73

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:

  • Closures (Blöcke) haben 4 verschiedene Erstellungssyntaxen, von denen keine optimal ist. Die elegante Syntax ist unvollständig und mehrdeutig mit Hashes, und die vollständige Syntax ist hässlich.
  • Die Community ist in der Regel gegen echte Dokumentation und bevorzugt das Lesen des Codes. Ich finde das kindisch und faul.
  • Der Missbrauch von Metaprogrammierungen, insbesondere in Bibliotheken, macht Fehler zu einem Albtraum, den man aufspüren muss.
  • In einem ähnlichen Zusammenhang macht es die allgegenwärtige Metaprogrammierung schwierig, wenn nicht unmöglich, eine umfassende IDE zu erstellen.
  • 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.

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

    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.


2
suboptimale m17n & Unicode-Unterstützung, obwohl sie immer besser wird. 1.9 bleibt kompliziert ...
Keltia

37
Ich dachte, dass Metaprogrammiermissbrauch "idiomatischer Rubin" genannt wird :)
Slartibartfast

2
akway: Die anderen beiden Syntaxen sind Lambda und Proc.new .
Myrddin Emrys

2
In Bezug auf die Dokumentation hörte ich einmal einen Vortrag von jemandem, der im Verlag Pragmatic Programmers arbeitete und sagte, dass er bei der Gründung des Unternehmens ein Ruby-Buch wollte, weil das einzige, das verfügbar war, auf Japanisch war. Sie hätten dieses Buch also von ihrer Firma übersetzen und veröffentlichen lassen können. Aber was sie stattdessen getan haben, um den Quellcode zu lesen :-) Das Ruby-Buch war anscheinend eines der Bücher, die Pragmatic Programmers ins Leben gerufen haben.
Arthur Reutenauer

13
Ich finde es interessant, dass 3 davon mit Menschen zu tun haben und nicht mit der Sprache selbst. Ruby bleibt die Sprache, die ich am wenigsten hasse.
Toby Hede

72

Perl

  • Gemischte Verwendung von Siegeln

    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;
    
    • Zum Beispiel ist keines davon dasselbe:

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

    Darin Perl6steht geschrieben :

    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;
    
  • Mangel an wahrem 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'}
    }
    

    Darin Perl6steht geschrieben :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • Schlecht gestaltete Regex-Funktionen

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

    Darin Perl6steht geschrieben :

    / <?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
    
  • Fehlender Mehrfachversand

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

    Darin Perl6steht geschrieben :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • Schlechte Überlastung des Bedieners

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

    Darin Perl6steht geschrieben :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
Ich sehe den Mangel an echtem OO nicht als so schlimm an, wie du es machst. Manchmal ist es ein Retter, besonders wenn das von Ihnen verwendete CPAN-Modul nicht daran gedacht hat, das aufzudecken, was Sie benötigen. Und das Fehlen eines Mehrfachversands könnte schlimmer sein: Perl hätte stark typisiert werden können ;-)
Tanktalus

3
Ich mag es, dass Perl nicht stark typisiert ist, aber es wäre nützlich, einige Typinformationen hinzuzufügen.
Brad Gilbert

13
Es scheint, als hätten Sie sich entschieden, eine Sprache zu kritisieren, die nicht Ihr Favorit ist (Sie hätten perl6 kritisieren sollen)
Frew Schmidt

5
Was bringt es, mit Perl 6 zu vergleichen? Schlagen Sie vor, dass Perl 6 Ihre Probleme behebt oder fortsetzt?
Robert P

2
Ich bezweifle, dass ich mehr sagen muss als: ozonehouse.com/mark/periodic
Arafangion

57

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.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • 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 ...


4
Ich nehme an, Punkt 1 ist in 5.3 implementiert :) Während die Parameterreihenfolge besser wird, ist die Benennung immer noch schlecht. Ich bin jedoch mit der Abwärtskompatibilität einverstanden.
Ross

4
Ich muss # 4 lieben. Das hat mich auch die ganze Zeit am meisten gestört.
Franz

1
Ich denke, das Geschwindigkeitsargument ist ziemlich subjektiv. Die Geschwindigkeit hängt viel mehr davon ab, wie effizient der Code ist, als von der Sprache selbst. Schlechter PHP-Code ist wahrscheinlich langsamer als hochwertiger Python-Code, aber gutes PHP bietet möglicherweise auch eine bessere Leistung als schlechtes Python.
Selfawaresoup

17
no_really_now_mysql_escape_the_string_im_serious ()
Salaryman

2
Namespaces schmamespaces. PHP ist im World Wide Web, also sollte alles global sein
Evan Plaice

50

Hier sind einige Dinge, die ich an Java nicht mag (was nicht meine Lieblingssprache ist):

  • Löschen von Generika (dh keine reifizierten Generika)
  • Unfähigkeit, mehrere Ausnahmen (verschiedener Typen) in einem einzigen Fangblock abzufangen
  • Mangel an Destruktoren (finalize () ist ein sehr schlechter Ersatz)
  • Keine Unterstützung für Schließungen oder die Behandlung von Funktionen als Daten (anonyme innere Klassen sind ein sehr ausführlicher Ersatz)
  • Überprüfte Ausnahmen im Allgemeinen oder im Besonderen, wodurch nicht behebbare Ausnahmen überprüft werden (z. B. SQLException)
  • Keine Unterstützung auf Sprachebene für wörtliche Sammlungen
  • Keine Typinferenz, wenn Konstruktoren generischer Klassen aufgerufen werden, dh die Typparameter müssen auf beiden Seiten des '=' wiederholt werden.

1
@Svish - Ich denke, der Punkt ist, dass Sie dieses Konstrukt nur verwenden würden, wenn es Ihnen egal ist, mit welcher Art von Ausnahme Sie es zu tun haben. Mit anderen Worten, wenn Sie alle identisch behandeln möchten
Dónal

3
Ich würde einen Mangel an Destruktoren nicht als Fehler bezeichnen, wenn die Sprache einen GC hat und einen GC, der mit jeder Veröffentlichung besser und besser wird. Destruktoren wurden in Java 1.1.8 vermisst, aber nicht in Java 6, weil gc so stark verbessert wurde.
Mike Reedell

7
C # behebt alle diese Probleme, außer dass mehrere Ausnahmen abgefangen werden. Generika werden reifiziert, Destruktoren werden durch using / IDisposable ersetzt, Verschlüsse werden durch anon-Methoden und Lambdas implementiert, Ausnahmen werden deaktiviert, es gibt Sammlungsliterale und es gibt 'var', um zu vermeiden, dass der konstruierte Typ zweimal angegeben wird.
Daniel Earwicker

1
Java hat definitiv Schließungen. Eine anonyme innere Klasse schließt über lokale Endvariablen in ihrem Bereich. Ich bin damit einverstanden , dass anonyme innere Klassen für anonyme Funktionen kein richtiger Ersatz sind, aber sie sind Verschlüsse.
Adam Jaskiewicz

2
Anon innere Klassen sind KEINE Abschlüsse: Versuchen Sie, einen Besucher-Rückruf mit etwas wie "sum + = current.amount ()" zu erstellen, wobei "sum" eine nicht endgültige Variable aus dem umschließenden Bereich ist. Nah dran, aber keine Zigarre.
Roboprog

40

C ++

  1. Vorlagensyntax
  2. Probleme mit der Diamantvererbung
  3. Die Fülle / das Fehlen von Standardbibliotheken, die moderne Sprachen haben (obwohl Boost nahe kommt).
  4. IOStreams
  5. Die Syntax für IOStreams

Python

  1. Leerzeichen sind (manchmal) sinnvoll
  2. unterstrichene Schlüsselwörter
  3. Eingeschränkte Thread-Unterstützung (zumindest derzeit)
  4. "Selbst" statt "dies"
  5. Leerzeichen sind (manchmal) sinnvoll

80
Sie können "sich selbst" als "dies" bezeichnen, was Sie wirklich wollen (obwohl es für andere schwierig sein könnte, zu folgen). "Selbst" ist kein Schlüsselwort, und Sie können die Variable beliebig benennen.
Mipadi

36
Los geht's, ich würde tatsächlich die Aussagekraft von Leerzeichen (insbesondere Einrückungen) in Python als eines der größten Pluspunkte auflisten ...;)
Oliver Giesen

22
"Leerzeichen sind sinnvoll" ist eine der besten Eigenschaften von Python! ps versuchen dies in einem Interpreter "aus zukünftigen Importklammern" auszuführen
hasen

4
Ich bin mit so ziemlich Ihrer gesamten Python-Liste nicht einverstanden, mit Ausnahme der Thread-Unterstützung. Leerzeichen sind nicht sinnvoll, Einrückungen sind sinnvoll. Es gibt einen großen Unterschied.
Christian Oudard

3
Beeindruckend. Es ist, als hätte niemand einen Texteditor erfunden, der Leerzeichen / Tabulatoren als Sonderzeichen hervorhebt / anzeigt (Was codieren Sie im Editor?). Wenn Sie Tabulatoren auf Leerzeichen erweitern, sterben Sie bitte in einem Feuer.
Gefälschter Name

37

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.


2
Stimmen Sie den Namespaces zu, das Präfixieren von Klassen mit Buchstabencodes ist dumm. Und ich würde fehlende Unterstützung für echte Klassenvariablen hinzufügen, ich mag es nicht, sie mit Dateistatik zu fälschen.
Zoul

2
Objective-C-Eigenschaften. Im Ernst, sie sind schockierend, ich kann den Hype nicht verstehen, besonders wenn ich sehe, wie gut C # sie macht.
Justicle

6
Eigentlich hat mir dieser Aspekt von Lisp und ObjC sehr gut gefallen - Sie brauchen nur einen Editor mit guter Klammeranpassung wie Emacs oder XCode. Normalerweise tippe ich Klammern paarweise ein, bevor ich etwas in sie tippe, damit ich nicht wirklich auf Probleme mit dem Abgleich stoße ... und XCode kann auch den von einer Klammer eingeschlossenen Bereich hervorheben, indem ich einfach auf eine der Klammern doppelklicke.
Kendall Helmstetter Gelner

1
@ Chris S: Wollen Sie damit sagen, YES/NOdass 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).
Jbrennan

3
Vielleicht bin ich ein Masochist, aber ich mag vorangestellte Klassennamen. Es macht die Google- und Dokumentationssuche kristallklar. Es gibt keine Verwirrung darüber, welche Art von Zeichenfolge Sie verwenden, wenn die Klasse NSString heißt.
Kubi

36

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:

    • generisches LPCTSTR,
    • LPC (W) STR zugewiesen von CoTaskMemAlloc,
    • BSTR, _bstr _t
    • (w) Zeichenfolge,
    • CString,
    • std :: vector
    • Eine Roll-My-Own-Klasse ( Seufzer ), die einem (w) char * -Puffer bekannter Länge Bereichsprüfungen und grundlegende Operationen hinzufügt
  • 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.


Das Durchsuchen der Dokumentation zur STL ist wie das Suchen nach Handbüchern zum Erstellen einer Grafikkarte von Grund auf neu.
aviraldg

Ehrlich gesagt klingen die meisten dieser Punkte so, als hätten Sie sich nie die Mühe gemacht, C ++ richtig zu lernen ... dies wird in # 3 ziemlich offensichtlich, da Inklusionsschutz etwas ist, das jeder C ++ - Programmierer wissen sollte. Ich bin mir auch nicht sicher, wie ich Punkt 1 verstehen soll. Sind Sie verwirrt std::string? Vielleicht könnte das Lesen einer guten Dokumentation und / oder eines Tutorials über std::vector(und warum Sie es nicht an std::stringOrten verwenden sollten, für die es nie entwickelt wurde) dies für Sie klären.

@nebukadnezzar: Ich fand Meyers auf der STL beleuchtet, aber es löst nicht die grundlegenden Probleme. Ehrlich gesagt klingt dies so, als müssten Sie nie ein großes Projekt pflegen, Sie müssten nie eine zirkuläre Abhängigkeit in einer dreitiefen Include-Hierarchie suchen. Ich weiß, dass es Wachen gibt, aber warum müssen wir uns um sie kümmern? Übrigens. Sie beheben nicht jedes Problem. Wie "Standard" ist ein, std::stringwenn 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).
Peterchen

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 verwenden std::string. Mit der String-Klasse können Sie wie über auf die String-Daten const char*zugreifen std::string::c_str, was bereits std::stringmit jeder Klasse / Funktion, die auch const char*Argumente akzeptiert, perfekt kompatibel ist .

weil C ++ keine Module hat - genau meine Beschwerde: Das Build-Modell ist antik (ich würde auch jede andere Lösung als Module akzeptieren). ----- perfekt kompatibel - aber perfekt inkompatibel mit vielen anderen Szenarien (ich würde argumentieren, dass C ++ 0x dies behebt, sagt, dass ich hier einen Punkt habe.) Ich würde mich freuen, wenn std :: string allgegenwärtig genug gewesen wäre wurden vor 10 Jahren als DIE Saitenklasse angenommen, aber es war nicht - die andere Beschwerde.
Peterchen

35

JavaScript :

  • Der ObjectPrototyp 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 thiswird festgelegt, wann immer eine Funktion mit Objektnotation oder dem newOperator aufgerufen wird . Dies führt zu großer Verwirrung, insbesondere beim Erstellen von Ereignisrückrufen, da thisnicht die Erwartungen des Programmierers festgelegt sind.

    • Folgerung: Das Aufrufen einer Funktion ohne Objektnotation oder des newOperators führt dazu, thisdass 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 nullund undefinedexistieren 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.


3
Für nullund undefined: 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.
Zach

1
"Wenn einer Ihrer Schlüssel zufällig Proto ist " - nun, es ist ein reserviertes Wort mit besonderer Bedeutung. Es ist wie sich zu beschweren, dass Sie nicht forals Variablenname verwenden können.
Nickf

5
@nickf: Der Schlüssel zu einem Hash ist eine Zeichenfolge. Zeichenfolgen können einen beliebigen Wert haben, einschließlich reservierter Wörter. Insbesondere gilt der Wert "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.
Daniel Cassidy

2
Thomas: Newline beendet nicht immer eine Aussage. Daher beenden sinnvolle Codierer jede Anweisung mit einem Semikolon, um den Code klarer zu machen.
Daniel Cassidy

2
newline may or may not end a statement depending on contextist einer in meiner Top 5 Liste
Reinierpost

34

Python:

  • Fehlende statische Eingabe
  • Standardargumentbehandlung (insbesondere die Tatsache, dass Sie das Standardargument ändern können für zukünftige Anrufer !)
  • Zu viele Unterstriche erforderlich (Konstruktoren müssen aufgerufen werden __init__ )
  • Mangel an richtigen privaten Mitgliedern und Funktionen (Konvention besagt nur, dass die meisten Dinge, die mit Unterstrich beginnen, privat sind, mit Ausnahme all der Dinge wie __getattr__ nicht)
  • Lustige Syntax für das printVerknüpfen einer Datei (aber das wird in Python 3 behoben)

10
Was ich möchte, ist eine Option zur Verwendung statischer Typen.
Greg Hewgill

4
Übrigens: init ist nicht wirklich der Konstruktor, das Objekt wurde bereits erstellt, als Sie dort eintreten (raten Sie mal, was Selbst ist ...). Der Konstruktor ist akut neu, da Sie Zugriff auf die zu instanziierende Klasse erhalten.
André

90
Wenn Sie statisches Tippen bevorzugen, warum ist Python Ihre Lieblingssprache?
Finnw

9
finnw: Statische Eingabe eignet sich hervorragend für einige Arten von Programmen und wird für andere Arten nicht wirklich benötigt. Normalerweise macht mir das Fehlen einer statischen Eingabe nichts aus, aber wenn Sie es brauchen, ist es wirklich schön, zumindest die Option zu haben.
Greg Hewgill

8
Ich würde sagen, dass das Fehlen einer statischen Typisierung ein Merkmal ist, nicht die fehlende Funktionalität ...
arnorhs

32

C #

  • Ich wünschte, ich könnte switch()auf jedem Typ, und das casekönnte jeder Ausdruck sein.

  • Die Objektinitialisierersyntax kann nicht mit 'schreibgeschützten' Feldern / private setAutoprops 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 doKlausel zur Abfragesyntax, die wie folgt ist foreach. 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.


14
+1 für das Einschalten eines beliebigen Typs
oɔɯǝɹ

+1 für Switch-Probleme und {} Probleme, über die ich bis jetzt nicht wirklich nachgedacht hatte
Maslow

Ich hasse {}. Sie sehen zu sehr nach () aus. Fehlanpassungen waren für mich nie ein großes Problem, da ich sie immer auf das gleiche Niveau gebracht habe, es sei denn, es handelt sich im Grunde genommen um Einzeiler.
Loren Pechtel

2
+1 für die linq-Abfrage. Insbesondere, wenn nur ein Objekt zurückgegeben werden soll. Anstelle von (von x in y select) .first (), warum nicht a (von x in y select top 1) oder etwas, das näher an die tatsächliche SQL-Syntax passt.
AdmSteck

Wenn Sie möchten, können Sie einen beliebigen Typ einschalten (), und dieser Fall kann ein beliebiger Ausdruck sein. Überprüfen Sie den F # -Musterabgleich. c-sharpcorner.com/UploadFile/mgold/…
gradbot

26

PHP

  1. Keine Debugging-Funktionen, wenn Sie den Server nicht steuern, und selbst dann sind sie irgendwie scheiße
  2. Die extreme Menge an schlechtem PHP-Code gibt allen PHP-Programmierern einen schlechten Ruf
  3. Inkonsistente Funktionsbenennung
  4. Unfähigkeit, eine statisch typisierte Variable zu haben, wenn ich eine möchte (ich bin 90% der Zeit ein großer Fan von dynamischer Typisierung)
  5. REGISTER_GLOBALS ist der Teufel

25
REGISTER_GLOBALS hat einmal meinen Hund gefressen :(
Pim Jager

2
1: Ich empfehle xdebug und einen GUI-Client wie MacGDBp. Das lindert wirklich einige der Schmerzen ... Ich stimme den anderen Punkten zu.
Jonas Due Vesterheden

5
# 2: Oh Gott, lass mich nicht damit anfangen. Ich muss mich als PHP-Entwickler immer gegen Leute verteidigen, die nur das Chaos gesehen haben, das viele Leute mit PHP verursachen.
Selfawaresoup

1
+1 für # 2 Ich habe viel zu viel Zeit damit verbracht, mich als PHP-Entwickler zu verteidigen.
UnkwnTech

+1 für # 2 - führt auch zu schlechtem Gehalt :(
Shiki

25

C (OK, es ist nicht mein Favorit, aber es wurde noch nicht gemacht.)

  • Syntax der Socket-Bibliothek.
  • Keine Funktionsüberlastung.
  • Saiten im C-Stil.
  • Pufferüberläufe.
  • Kryptische Syntax. Ich weiß nicht, wie oft ich Sachen wie Atoi nachgeschlagen, mir auf die Stirn geschlagen und "Natürlich!"

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.


22
Welche Socket-Syntax? C hat kein Konzept für Steckdosen.
Ferruccio

3
Oh komm schon! Sie können mit fünf kommen. Saugt Zeigerarithmetik nicht einfach? :)
Brian D Foy

8
+1 Ich habe über "C-Saiten" gelacht. Und @brain_d_foy: Zeigerarithmetik ist nur zum Kotzen, wenn Sie es nicht verstehen.
Chris Lutz

1
@ Chris Luts: Schon als ich C lernte (bevor ich C ++ oder eine andere OO-Sprache kannte), wusste ich nur, dass etwas an Char-Arrays nicht stimmt. :)
Bill the Lizard

2
Zeigerarithmetik ist eine Motorsäge - sehr effizient, aber Sie riskieren, Ihr ganzes Bein zu nehmen
Thorbjørn Ravn Andersen

24

Common Lisp:

  1. Schlüsselwörter sind oft zu wortreich.
  2. Die Unterstützung der Bibliothek ist erbärmlich.
  3. Funktioniert nicht gut in Betriebssystemen, die den Speicher strenger behandeln möchten.
  4. Hat keine guten Möglichkeiten für die Interaktion mit dem Betriebssystem.
  5. Die "Schleifen" -Funktion ist nicht gut definiert und sieht sicher nicht Lispy aus.

2
'loop' ist vielleicht nicht lispy, aber was ist daran schlecht definiert?
Daniel Cassidy

2
Ich habe den Standard selbst nicht gelesen, ich gehe hauptsächlich auf Paul Grahams "On Lisp". Er sagt, der Standard sei meistens ein Beispiel und definiere Eckfälle überhaupt nicht gut.
David Thornley

3
Meinst du nicht, dass Schlüsselwörter zu wortreich sind?
GClaramunt

Ich bin damit einverstanden, dass es nicht "lispy" ist, aber CLtLv2 verbringt viel Zeit damit. Ich denke nur, dass es viel zu viel zu tun hat. sunsite.univie.ac.at/textbooks/cltl/clm/…
Hans Van Slooten

Neben "loop" ist "format" auch nicht sehr lisplike. Ich hasse sowohl "Format" als auch "Loop", obwohl Lisp meine Lieblingssprache ist.
Paul Reiners

24

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.


6
Es gibt keine Unterstützung für Namespaces oder dynamische Module. Wie kann erwartet werden, dass wir Kontrollsysteme für chemische Anlagen ohne solche Grundlagen schreiben?
Donal Fellows

Kein syntaktischer Zucker, z. B.> 10 (10-mal bewegen), 0 (Null einfügen), +5 (5 hinzufügen).
Squall

23

JavaScript

  1. Zahlen als Zeichenfolgen - Mathematik kann frustrierend sein, wenn Zahlen als Zeichenfolgen interpretiert werden. 5 + 2 = 52? Grrr ...
  2. Berechtigungen - alles Beste erfordert die Genehmigung des Benutzers!
  3. Bildschirmaktualisierungen - Der Browser muss sich im eingeschwungenen Zustand befinden, um den Bildschirm zu aktualisieren. Es scheint keine Möglichkeit zu geben, die Aktualisierung des Bildschirms mitten in einem Skript zu erzwingen.
  4. Langsam - obwohl Googles Chrome nett ist ...
  5. Browserunterschiede machen die Verwendung der Sprache zu einer [zensierten].

4
Die Zahlen als Zeichenfolgen können leicht festgelegt werden. Wenn Sie jemals eine Zeichenfolge haben, müssen Sie diese analysieren (x, 10). Der Riesenfehler ist, wenn Sie die, 10 weglassen, und es interpretiert '017' als OKTAL
Orion Edwards

3
false == 0 == [] == "" aber null und NaN nicht. NaN! = NaN. null == null.
Jimmy

7
typeof "a string" == "string". Typ eines neuen Strings ("ein anderer String") == "Objekt. Neuer String ('a'). Konstruktor ==" a ". Konstruktor. Typ eines neuen Arrays () == 'Objekt'
Jimmy

1
für (x im Objekt) gibt Funktionen zurück
Jimmy

14
-1, diese Liste handelt hauptsächlich von Browserproblemen, nicht von der Sprache selbst.
Mauricio Scheffer

20

PHP:

  • Man kann nie sicher sein, dass bestimmte fast gängige Erweiterungen auf allen Webservern verfügbar sind.
  • versucht in Zukunft alles zu sein (gehe, Schließungen, ...)
  • viele Sicherheitsrisiken für unerfahrene Benutzer
  • Mehr Bedienerüberlastung wäre schön
  • all die armen Programmierer, die nicht lernen, wie man es richtig macht, und ihm einen schlechten Namen geben

Trotzdem ist PHP die (Skriptsprache). ;-);


OK, nur noch eine Sache!
Brian D Foy

4
Stimme Punkt 5 voll und ganz zu - wäre auch auf einer Javascript-Liste.
Steve Claridge

Ich bin nicht einverstanden mit "all den armen Programmierern, die nicht lernen, wie man es richtig macht, und geben ihm einen schlechten Namen". Ich würde es durch "massive Optionen zur Konfiguration der Laufzeitsprache" ersetzen.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Nur Windows.
  2. Nicht länger unterstützt.
  3. Arrays können bei einer beliebigen Anzahl beginnen, anstatt alle auf 0 zu normalisieren.
  4. Kompilierte Anwendungen hängen von vielen DLLs ab, um ordnungsgemäß ausgeführt zu werden.
  5. Viele komplizierte Steuerelemente wie ein Browser-Steuerelement oder komplizierte Codeteile können die IDE beschädigen, wenn Sie nicht kompilierten Code ausführen, funktionieren jedoch beim Kompilieren einwandfrei.

13
VB ist jemandes Lieblingssprache? O_o. Warum ist "Syntaz, der völlig anders und mit anderen Sprachen nicht kompatibel ist" und "gibt schlechte Gewohnheiten in Bezug auf andere Sprachen" hier nicht?
Jonta

3
Ich finde # 3 tatsächlich eine sehr mächtige Funktion, kein Fehler - ich würde VB.NET wirklich lieben, wenn ich diese hätte. AWK hat es in gewissem Sinne, aber dann in AWK-Arrays sind wirklich Hashes in Verkleidung :(
Joe Pineda

3
Auf 1 und 4 und .NET C # erfordert kein vollständiges Framework und Betriebssystem ??? (Hey, ich habe gehört, dass du Mono-Bigot bist ... es ist immer noch ein "vollständiger Rahmen" für dich, und ich bezweifle, dass ein Debian-Dist es jemals isst). In Bezug auf 5 behielt kein vernünftiger VB6-Programmierer (damals) die Standardoption "Compile On Demand" bei ...
jpinto3912

2
Muss immer noch gelegentlich vb6 unterstützen. Pet Pieves: Kann eine Variable bei der Deklaration nicht initialisieren, keine parametrisierten Konstruktoren, eine Klasse pro Datei usw. Wenn sie diese Probleme beheben würden, könnte die Sprache weitere 10 Jahre problemlos weiterlaufen.
AngryHacker

14
Was ist mit "On Error Resume Next" ... das heißt, "dieser Code ist F ** KED, aber
wir können

18

Ruby ist meine Lieblingssprache. Folgendes mag ich nicht:

  • Grüne Fäden + blockierende C-Bibliotheken = Riesenversagen
  • SO SCHMERZLICH LANGSAM
  • Die Standardbibliothek selbst widerspricht der Verwendung von Bang! Methoden
  • Modul include + verlängern ist chaotisch.
  • "Offene Klassen" können nicht erfasst werden - ich möchte einen String # -Dostuff hinzufügen, aber ich möchte nicht, dass dieser in alle Bibliotheken von Drittanbietern gelangt
  • Keine binäre Bereitstellungsverpackungslösung.

3
Haben Sie Ruby 1.9.1 ausprobiert? Es bietet eine enorme Beschleunigung im Vergleich zu Ruby 1.8.6
Christian Stade-Schuldt

Versuchen Sie es mit jrubyc. JVM JIT FTW!
KitsuneYMG

+1 für das Einbeziehen vernünftiger Probleme, im Gegensatz zu den "Hass" der von Ruby am besten bewerteten Antwort.
Phrogz

17

Delphi:

  • IDE ist etwas instabil.
  • Code Insight ist manchmal verwirrt.
  • Das Debuggen ist manchmal fehlerhaft.
  • Das Aktualisieren mehrerer Projektdateien kann umständlich sein.
  • Wenn Sie starten, wenn ein oder mehrere Pakete nicht verfügbar sind, wird die Fehlermeldung mehrmals angezeigt.

5
All dies scheinen Beschwerden über Delphi, die IDE, und nicht über Delphi, die Sprache (AKA Object Pascal) zu sein
Dónal,

11
Vermutlich liegt das daran, dass Object Pascal perfekt ist ;-)
Mark Bessey

3
Ich bin ein bisschen zu spät zur Party, aber hier geht es trotzdem: - Methodensignaturen müssen zweimal notiert werden (Schnittstelle + Implementierung) - Der Einheitenname muss mit dem Dateinamen identisch sein. WTF?!?
Martijn

1
Ich finde den Anfang ... neigt dazu, überlegen zu sein - sie sind viel klarer als {}. Sie verbringen viel mehr Zeit damit, Code zu lesen als ihn zu schreiben. Für einen Kritikpunkt können Sie in einem Fall keine definierten Unterbereiche von Aufzählungstypen verwenden, obwohl dies völlig legal ist, wenn Sie den Bereich genau dort in dem Fall deklarieren. Auch keine Vorwärtsreferenzen zwischen Einheiten.
Loren Pechtel

1
@AlexanderN: Nein, es war noch nie so lebendig, beliebt oder großartig.
Andreas Rejbrand

16

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 hasOwnPropertyMethoden) zum Ausführen einiger ansonsten einfacher Vorgänge.


AFAIK, alle Erweiterungen der JS- Sprache (nicht des DOM) durch Browser-Anbieter wurden zumindest zur Standardübernahme gedrängt - auch wenn der Standardprozess dies nicht erreicht hat. hasOwnProperty / Workarounds: zweischneidiges Schwert. Um die "Einfachheit" zu erzwingen, verlieren wir viel Kraft und Flexibilität. Diese Beschwerde macht mich immer wütend. Schreiben Sie Ihre Schleifen richtig (und überprüfen Sie auch Ihre Objektmitglieder richtig)!
Augenlidlosigkeit

15

Haskell:

  1. Aus der trägen Auswertung tritt Platz aus.
  2. Numerische Hierarchie nicht in Bezug auf mathematische Abstraktionen konstruiert.
  3. Strenge monadische E / A können das Debuggen erschweren.
  4. Die großen Implementierungen behandeln E / A auf eine Weise, die mit dem Standard nicht ganz kompatibel zu sein scheint. (Insbesondere gibt die Ausgabe von Zeichen nur die niedrigen 8 Bits aus - und dann wird Code erstellt, der diese Annahme verwendet, um binäre E / A auszuführen. Ick.)
  5. Die Assoziativität des ($)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.


3
Warum sollten Sie die Assoziativität von ($) ändern wollen? 'fghx' Klammern als '((fg) h) x' und 'f $ g $ h $ x' Klammern als 'f (g (hx))' ...
Erik Hesselink

1
Ich <3 Haskell. Die Standardbibliothek muss Berge mathematischer Abstraktionen enthalten, einschließlich Vektorräume et al. Das Vorspiel benötigt auch einen Operator, der genau wie ($) verkettet, aber von links nach rechts {source |> func1 |> filter func2 |> map (func3 10)}.
Yfeldblum

10
Sie haben das wirklich Schlechte verpasst: die Tendenz der Haskell-Programmierer, Variablennamen mit einem Buchstaben zu verwenden.
Benjamin Confino

1
Ein linksassoziativer ($) Operator ist nur eine Funktionsanwendung, die in Haskell durch das Leerzeichen dargestellt wird. @ Gerechtigkeit: Probieren Sie die Flip-Funktion. (|>) = flip ($)
Apocalisp

1
Kann jemand den Punkt von # 5 erklären? Ich dachte, richtige Assoziativität sei der springende Punkt von ($).
Tim Matthews
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.