Welches Syntaxelement hassen Sie am meisten in einer Programmiersprache, die Sie häufig verwenden? [geschlossen]

27

Egal wie sehr Sie eine Programmiersprache lieben, es gibt immer ein paar Details, die nicht so schön sind, wie sie sein könnten.

In dieser Frage möchte ich mich speziell auf Syntaxelemente konzentrieren. Welches Syntaxelement ist für Sie in einer Programmiersprache, die Sie häufig verwenden (vielleicht Ihre Lieblingsprogrammiersprache oder die, die Sie bei der Arbeit verwenden müssen), am unlesbarsten, unklarsten, unbequemsten oder unangenehmsten?

Timwi
quelle
@ Nathan Taylor, nicht für diese Frage, aber für eine andere Frage .
11.
Wurde diese Frage geändert? Denn als ich antwortete, konzentrierte es sich nicht auf "Syntaxelemente" ... Ich muss meine Antwort jetzt ändern.
Talvi Watia
@Talvi: Nein, es ging von Anfang an um Syntax.
Timwi
@ Timwi komisch, es muss ein Fall von "Beantwortung einer Frage, die denkt, es sei eine andere" sein.
Talvi Watia
Wenn Sie abstimmen können und denken, dass dies eine nützliche Frage ist, oder wenn Sie unten nützliche Antworten haben, stimmen Sie ab. StackExchange-Sites benötigen Stimmen, um eine gute Community aufzubauen. Sie können 30 Stimmen pro Tag abgeben, verschwenden Sie sie nicht. Speziell Anwender mit hohem Ansehen und niedrigen Zählen erhaltenen Stimmen lesen Sie bitte diesen: meta.programmers.stackexchange.com/questions/393/...
Maniero

Antworten:

39

Einfügen von Semikolons in JavaScript.

Ich bin nicht wirklich oft davon gebissen worden, aber es ist eine phänomenal schlechte Idee, die mir den Kopf verdreht.


Hier sind die Regeln (aus ECMA-262, Abschnitt 7.9)

  1. Wenn das Programm ein Token enthält, das von der formalen Grammatik nicht zugelassen ist, wird ein Semikolon eingefügt, wenn (a) an dieser Stelle ein Zeilenumbruch vorliegt oder (b) das unerwartete Token eine schließende Klammer war.
  2. Wenn das Ende einer Datei erreicht ist und das Programm sonst nicht analysiert werden kann, wird ein Semikolon eingefügt.
  3. Wenn eine "eingeschränkte Produktion" auftritt und ein Zeilenendezeichen an einer Stelle enthält, an der die Grammatik die Anmerkung "[kein Zeilenendezeichen hier]" enthält, wird ein Semikolon eingefügt.

Beispiel:

return 1; // returns 1

return
1; // returns undefined
Tim Goodman
quelle
2
JavaScript: Die am meisten missverstandene Programmiersprache der Welt ~ Douglas Crockford
pramodc84
Ja, viele erwarten, dass JavaScript eine "Freiformsprache" ist, aber das ist es nicht.
Andreas Rejbrand
13
Es ist sinnvoll, wenn Sie feststellen, dass JavaScript für die Erstellung von HTML entwickelt wurde. In diesem Zusammenhang wurde auch lange versucht, zu interpretieren, was Ihr Code "wirklich bedeutet", wenn er syntaktisch nicht gültig ist. (Schauen Sie sich das Robustness-Prinzip einmal an - die größte Katastrophe in der Geschichte des Computerbetriebs.)
Mason Wheeler,
7
Diese Art von Fehlern sind für mich ein Code-Geruch, der den Programmierer schlampig macht und niemals mit den meisten formalen "strengen" Sprachen gearbeitet hat, die normalerweise einen Syntaxfehler verursachen würden, wenn das Semikolon weggelassen wird.
Talvi Watia
7
Wohoo, endlich jemand anderes, der auch an das Robustness-Prinzip denkt, ist eine Katastrophe, die HTML zu dem Chaos gemacht hat, das es ist.
Roman Starkov
39

Java-Bean-Syntax aufgrund fehlender C # -Eigenschaften

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

Probleme habe ich damit

  • Zu viel Code - Haben Sie ein Feld, das dokumentiert ist, eine Getter-Methode, die dokumentiert ist, und eine Setter-Methode, die dokumentiert ist. Dieses äußerst einfache Beispiel enthält 20 Codezeilen für eine einzelne Eigenschaft
  • Clutters Methodenlisten - „Lassen Sie mich diese Methode finden, die Hand auf: getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH... ah da ist es, hashCode.
  • Mehrere Dokumentationsbereiche führen zu mangelhafter, veralteter oder fehlender Dokumentation. Ärgerlich, wenn man versucht, die Funktionsweise von Code zu verstehen
  • So ärgerlich, dass eine dritte Partei sich ein Plugin einfallen lassen musste, um dies einfach zu machen - Spoon , Shark , unter anderem.
TheLQ
quelle
9
Noch einmal, wenn Code so ausführlich ist, dass er automatisch generierte Tools benötigt, stimmt etwas nicht. Ich bin ein NetBeans-Typ, aber er kann auch automatisch Getter und Setter generieren. Aber Javadoc fällt aus der Synchronisation, es ist immer noch wortreich, es wirbelt immer noch Javadoc, etc.
TheLQ
11
Wenn Sie für alles Getter benötigen, stimmt etwas mit dem Client- Code nicht.
Donnerstag,
7
Getter und Setter zu haben, bricht die Kapselung. Das Feld könnte genauso gut sein public. Mitglieder sollten privat sein und von der Klasse mit übergeordneter Logik sinnvoll manipuliert werden, nicht mit Gettern und Setzern aus dem Client-Code.
greyfade
6
@greyfade: Wenn es öffentlich ist, können Sie die Funktion des Einstellungscodes nicht einfach ändern (Sie müssen den gesamten Code ändern, der das Feld von außen einstellt).
Bart van Heukelom
3
@SHiNKiROU: Java sieht sauber aus? Ich habe das noch nie gehört! Mein Hauptproblem mit Java ist die Tatsache, dass scheinbar einfache Dinge Dutzende von Codezeilen erfordern, die ich mental ignorieren muss.
Konfigurator
33

Whitespace-Empfindlichkeit.

Python nervt mich in dieser Hinsicht. Ich meine, ich rücke sowieso richtig ein, aber es nervt mich, dass ich muss . Präsentation als Teil der Syntax zu sehen, ärgert mich.

Fischtoaster
quelle
8
du wirst es lieben lernen
user10008
2
Syntax ist Präsentation
Winston Ewert
32

Die switchAnweisung (in C, C ++, C #, Java usw.)

Hier ist ein Beispiel, warum ich es sehr unbequem finde:

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

Dies wird nicht kompiliert, da die Variable iim selben Bereich neu deklariert wird. Dies scheint ein kleines Detail zu sein, aber es beißt mich wirklich oft. Ich kann geschweifte Klammern hinzufügen, um dies zu mildern, aber es wäre schön gewesen, wenn die geschweiften Klammern obligatorischer Bestandteil der Syntax gewesen wären und es keine redundante zusätzliche Einrückungsebene gab. Ich hasse es auch wirklich, das Extra schreiben zu müssen break. Das wäre viel schöner:

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

Dies lässt es eher wie eine if/ else-Kette aussehen , was eine gute Sache ist, da es auch semantisch ähnlich ist. Zumindest in C # wäre es jedoch immer noch nicht dasselbe, da in einer switchAnweisung die Reihenfolge der case-Bezeichnungen keine Rolle spielt, aber in einem if/ elsees.

Timwi
quelle
1
Leider beseitigt Ihre verbesserte Syntax das wohl größte Feature von Switch in den meisten dieser Sprachen: Fall-through. "Duff's Device" in C ist ein perfektes Beispiel für den Wert dieser besonderen "Fehlfunktion". In C-ähnlichen Sprachen ist es auch üblich, in Dolmetschern und ähnlichen Programmen eine Durchbruchsfunktion zu verwenden.
greyfade
7
Nein, es beseitigt es nicht. Es ist nur erforderlich, dass es expliziter (mit a gotooder ähnlichem) dargestellt wird, wie dies bereits in C # der Fall ist.
Timwi
8
@greyfade: Jeder Code, der Duffs Gerät in C verwendet, muss einen schrecklichen Tod erleiden. Compiler treffen bessere Entscheidungen über diese Art von Dingen als Sie.
Billy ONeal
4
@greyfade: Delphi wird um den mehrfachen Wert Problem , indem einfach mehrere Indizes im Fall erlaubt: case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;.
Frank Shearar
3
@jkerian: Jetzt stell dir vor, breakes wäre die Standardeinstellung und es müsste nur noch ein Fallthrough angegeben werden. Sie müssen sich nicht mehr daran erinnern, es zu kommentieren! :)
Timwi
27

Array-Deklarationen in VB.NET

Es gelingt mir immer zu vergessen, dass Sie beim Initialisieren von festen Arrays in VB.NET die Obergrenze des Arrays und nicht die Anzahl der Elemente wie in C / C ++, PHP oder Java angeben. Abgesehen von VB6 (wir werden dort nicht hingehen ...) kann ich mir keine andere Sprache vorstellen, die das so macht:

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20
Heather M
quelle
Ich denke, dass alle BASIC-Sprachen dies tun ... Ich weiß, dass es die ursprünglichen BASIC- und QBasic-Sprachen tun.
Michael K
OMG das ist wirklich horrend .... +1
mikera
25

VB6 - Separate Variablendeklaration und Zuordnung

In den meisten Sprachen können Sie eine Variable deklarieren und in einer Codezeile zuweisen. VB6 zwingt Sie dagegen, zwei zu verwenden.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

Sie können einen Doppelpunkt verwenden, um zwei Befehle in eine Zeile einzufügen, der Code wird jedoch schnell unübersichtlich.

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection
derekerdmann
quelle
7
+1 für die Verwendung von VB6 als häufigste Sprache.
Walter
9
Ich benutze es täglich ... schluchzen.
Systempuntoout
Hat Pascal keine ähnliche Syntax? Ich fand es immer böse.
greyfade
1
Es gibt einen besonderen Fall: Wenn Sie auf Dim Hurp As New Collectionetwas zugreifen, auf das Hurpes sich bezieht Nothing, wird es vor dem Zugriff auf magische Weise initialisiert. Wenn Sie es explizit auf stellen Nothingund erneut berühren, wird es wiederbelebt ... keuchen!
Jeffrey Hantin
1
+ 1 Million für Derp. Derp de derp de tiddly tum de derp.
MVCylon
24

Kommentieren in CSS

//Kommentiert keine Codezeilen wie in vielen anderen Sprachen wie PHP und Javascript. Obwohl /* this is commented out */funktioniert, bevorzuge ich zu verwenden //.

Es ist ärgerlich, weil ich die Hälfte der Zeit vergesse, in der ich CSS bearbeite und dann zurückgehen muss, um den Fehler zu beheben.

Talvi Watia
quelle
Sie würden heutzutage denken, dass unformatiertes CSS als Objektcode betrachtet wird.
Tom Hawtin - Tackline
// funktioniert gut, um CSS auszukommentieren. Das mache ich die ganze Zeit. Alles was ich wirklich tue ist Müll zu tippen. aber es scheint zu funktionieren, indem man die nicht zu analysierende Zeile überspringt.
MVCylon
1
@MVCylon Wenn Sie mit // eine Zeile auskommentieren, wird auch alles nach der folgenden Zeile übersprungen. {innerhalb dieses bestimmten Stils} Mit anderen Worten, es schlägt fehl, weil diese Zeilen nicht übersprungen werden sollten.
Talvi Watia
20

PHP - konsistente Reihenfolge der Argumente

PHP verfügt über eine Reihe praktischer Funktionen, mit denen Sie praktisch jede Operation ausführen können, die Sie sich für ein Array oder einen String vorstellen können. Für viele dieser Operationen müssen sowohl a $needleals auch a verwendet $haystackwerden. Unterschiedliche Funktionen führen sie jedoch in unterschiedlicher Reihenfolge aus. Welche Funktion welche Argumente erfordert, ist eine dieser Tatsachen, die mein Gehirn nicht aufnimmt, egal wie oft ich auf sie stoße!

Nehmen Sie die Funktionen in_array und strstr :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

Komischerweise scheint PHP intern mit dieser Reihenfolge übereinzustimmen, da alle String-Funktionen zu verwenden scheinen, $haystack, $needlewährend Array-Funktionen umgekehrt sind, aber dies kann für jemanden, der neu in PHP ist, etwas gewöhnungsbedürftig sein. Es gibt einen guten Beitrag auf ExpressionEngine, der ausführlicher über diese besondere Eigenart spricht, sowie eine Diskussion über die PHP-Fehlerliste , die eine sehr kurze Antwort des PHP-Teams enthält!

[email protected]
Benutze dann eine anständige IDE.
ConroyP
quelle
2
Es ist einfacher, sich an die Reihenfolge zu erinnern $needle, $haystackda dies an die Art und Weise erinnert , wie man sagt , eine Nadel im Heuhaufen zu finden .
Kiamlaluno
3
Protip: Bei Array-Funktionen steht die Nadel an erster Stelle. Bei String-Funktionen steht der Heuhaufen an erster Stelle.
GSto
17
Ich liebe den Namen strstr. So schön sinnlos.
Konfigurator
5
Lesen Sie einfach den verlinkten Eintrag im Bugtracker von PHP. Ernsthaft wtf? oO Imho-Konsistenz ist ein gültiges Problem für jede API, und nur zu antworten, dass Sie eine anständige IDE verwenden, ist einfach keine gültige Antwort. Zumindest hätte es von den Entwicklern als weniger entzündlich bezeichnet werden können.
Baelnorn
2
Ehrlich gesagt, was mich verrückt macht, ist, dass es überhaupt keine Funktion sein sollte! Es sollte nur eine Methode sein: $ haystack-> find ($ needle). Beschlossene Sache.
Riwalk
19

Python

self Parameter in Instanz Methodendefinitionen

Goran Peroš
quelle
In einer Klassenmethode heißt sie normalerweise cls und die Verwendung von self verstößt gegen die Konvention.
Es macht tatsächlich Sinn, wenn Sie darüber nachdenken. Es ist dasselbe wie das Deklarieren einer privaten Methode in anderen Sprachen, der Parameter self ist nur in Python explizit, wo er in anderen Sprachen implizit ist. Wenn es implizit sein soll, fügen Sie den @ classmethod-Dekorator vor der Methodendeklaration hinzu. Siehe docs.python.org/library/functions.html#classmethod . Wenn Sie die Details dazu kennen, erhalten Sie einen Einblick, wie dies implizit in anderen Sprachen geschieht.
Evan Plaice
4
Ich verstehe die Gründe und warum es dort gelassen wird neopythonic.blogspot.com/2008/10/… aber ich mag es immer noch nicht
Goran Peroš
@Evan Plaice: 'Selbstparameter sind nur in Python explizit, wo sie in anderen Sprachen impliziert sind' Das ist nur ein Teil der Geschichte. Der andere Teil ist Python, der wöchentlich getippt wird. Zusammen ist es schrecklich, zu vergessen, selfpassiert leicht und kostet Zeit.
Maaartinus
@maaartinus Fügen Sie dann Ihren Instanzmethoden einen Klassenmethoden-Dekorator hinzu. Hat nichts mit "schwach getippt" zu tun. Es macht nur die Beziehung zwischen statischen Methoden / Funktionen (kein "self" -Parameter) und Instanzmethoden (einschließlich "self") offensichtlich. Einer Instanzmethode ist die übergeordnete Klasse nur dann bekannt, wenn Sie ihr einen Verweis geben. In anderen Sprachen verbirgt sich das von mir beschriebene Unterscheidungsmerkmal nur hinter syntaktischem Zucker. Wenn ich die Wahl hätte, alles noch einmal zu machen, hätte ich zuerst angefangen, OOP in Python zu lernen.
Evan Plaice
18

Java

Zeitraum. Punkt. Ende der Geschichte.

Wo soll man anfangen? Oh, ich weiß, wo ich anfangen soll: Java ist wahnsinnig kompliziert und hässlich und dumm und von Natur aus kaputte Generika. Muss ich mehr sagen? :( Okay, dann: Schreibe Erasure .

Dann gibt es nicht deterministisches Ressourcenmanagement. Kewl Fußschütze!

Was kommt als nächstes? Oh ja: Javas blöde Regexes sind mein irritierendstes, brodelndes Rindfleisch. Ich kann nicht zählen, wie oft ich abgespritzt wurde, weil ich nicht genug Backslashes hatte. Dies ist noch schlimmer, als keinen Zugriff auf Unicode-Eigenschaften aus diesem Jahrtausend zu haben - was ein absoluter Reinfall ist. Zehn verdammte Jahre veraltet !!! Völlig nutzlos. Mach es kaputt.

Dann gibt es den Fehler, dass die Zeichenklassenverknüpfungen nicht mit Nicht-ASCII funktionieren. Was für ein königlicher Schmerz! Und erwägen Sie nicht einmal die Verwendung \p{javaWhiteSpace}; Mit einigen sehr verbreiteten Unicode-Whitespace-Codepunkten ist das nicht richtig.

Wussten Sie, dass es eine \p{javaJavaIdentifierStart}Immobilie gibt? Was haben sie gedacht? Ich bin so froh, dass sie so kluge Spanner haben.

Haben Sie jemals versucht, das CANON_EQ-Flag zu verwenden? Wissen Sie, dass das wirklich funktioniert und was nicht ? Wie wäre es mit einem sogenannten "Unicode-Fall"? Eine Menge normaler Gehäuse-Dinge funktionieren überhaupt nicht.

Dann machen sie es schwierig, wartbare reguläre Ausdrücke zu schreiben. Java hat immer noch nicht herausgefunden, wie man mehrzeilige Strings schreibt, also schreibt man am Ende wahnsinnige Dinge wie diese:

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

Was sind all diese Zeilenumbrüche? Oh, nur Java-Dummheit. Sie verwendeten Perl-Kommentare, keine Java-Kommentare ( Idioten! ), Die bis zum Ende der Zeile reichen. Wenn Sie diese also nicht \ndort ablegen, hacken Sie den Rest Ihres Musters ab. Duh und doppelt duh!

Verwenden Sie keine regulären Ausdrücke in Java: Sie werden am Ende einfach Dinge zerschlagen wollen, es ist alles so schmerzhaft und kaputt. Ich kann nicht glauben, dass sich die Leute damit abfinden. Manche nicht .

Dann können wir anfangen, über Javas idiotischen Unsinn mit Codierungen zu sprechen. Erstens gibt es die Tatsache, dass die Standard-Plattformkodierung immer eine lahme 8-Bit-Kodierung ist, obwohl Javas Zeichen Unicode sind. Dann gibt es eine Möglichkeit, wie sie bei einem Codierungsfehler keine Ausnahme auslösen. Sie werden garantiert Mist bekommen. Oder wie wäre es damit:

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

Was ist der Unterschied? Wussten Sie, dass nur eine davon eine Ausnahme auslöst, wenn Sie einen Codierungsfehler haben? Der Rest macht sie nur mundtot.

Dann gibt es die Idiotie der Java-Zeichen, die nicht ausreichen, um einen Charakter zu halten! Was zur Hölle denken sie? Deshalb nenne ich sie charchars. Sie müssen Code wie diesen schreiben, wenn Sie erwarten, dass er richtig funktioniert:

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

Und wer denkt jemals daran, das zu tun? Nahe bei niemandem.

Wie viele Charaktere gibt es in "\uD83D\uDCA9"? Eins oder zwei? Kommt darauf an, wie man sie zählt. Die Regex-Engine verarbeitet natürlich logische Zeichen, sodass ein Muster ^.$erfolgreich ist und ein Muster ^..$fehlschlägt. Dieser Wahnsinn wird hier demonstriert:

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^..$/ => matched.

Dieser Schwachsinn ist alles, weil man das absolut Vernünftige nicht schreiben kann \u1F4A9, und natürlich bekommt man auch keine Warnung, dass man das nicht kann. Es macht einfach das Falsche.

Dummkopf.

Während wir gerade dabei sind, ist die gesamte \uXXXXNotation angeboren hirntot. Der Java-Präprozessor ( ja, Sie haben es gehört ) hat es vor Java verstanden, und es ist Ihnen untersagt, absolut vernünftige Dinge zu schreiben "\u0022", zum Beispiel, wenn Java dies sieht, hat sein Präprozessor es in verwandelt """, und Sie verlieren. Oh warte, nicht wenn es in einer Regex ist! Sie können also "\\u0022"ganz gut verwenden.

Riiiiiiiight!

Wussten Sie, dass es in Java keine Möglichkeit gibt, einen isatty(0)Anruf zu tätigen? Sie dürfen nicht einmal solche Gedanken denken. Es wäre nicht gut für dich.

Und dann gibt es den ganzen Klassenweg Greuel.

Oder die Tatsache, dass es keine Möglichkeit gibt, die Codierung Ihrer Java-Quelldatei in derselben Quelldatei anzugeben, damit Sie sie nicht verlieren? Noch einmal verlange ich zu wissen: WAS HÖLLE HATTE IHR DENKEN?

Stoppen Sie den Wahnsinn! Ich kann nicht glauben, dass die Leute sich diesen Müll gefallen lassen. Es ist ein kompletter Witz. Ich wäre lieber ein Walmart-Begrüßer, als die Schleudern und Pfeile des unverschämten Java-Wahnsinns zu ertragen. Es ist alles kaputt und sie können es nicht nur nicht reparieren, sie werden es auch nicht reparieren.

Dies von den gleichen schelmischen Leuten, die sich auf eine Sprache rühmten, die es illegal machte, eine printf()Funktion zu haben . Gee, dass Sie sicher , wirklich gut geklappt, nicht wahr , obwohl !?

Bloße Totenköpfe. Schlampen ist ihnen zu nett. Wenn ich in Assembler programmieren wollte, würde ich. Dies ist keine heilsame Sprache. Der Kaiser hat keine Kleider.

Wir hassen es. Wir hassen es für immer . Lass es sterben sterben sterben !

tchrist
quelle
Haha, gut, ich fasse Java nicht an, weil es zu unpoliert ist, wie du es beschreibst. \ U00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00fcber \ u00cber \ u00cber \. Wenn Sie UTF-16-ness akzeptieren, dann macht der Regex das Richtige. es ist der .length Anruf, der versaut.
Roman Starkov
4
-1. Mit Ausnahme von Regexp-Kommentaren und Unicode-Escapezeichen ist keines der von Ihnen erwähnten Elemente ein Syntaxelement.
Jörg W Mittag
3
@ Jörg, willst du Syntax? Okay, gut: Mit Java können Sie Steuerzeichen, einschließlich ESC und NUL, in Bezeichner einfügen. WTH dachten sie ???
Tchrist
4
@ tchrist: Wow! Wenn ich jemals wieder ein Java-Programm schreibe, werden alle meine Variablen Namen haben, die aus einer unterschiedlichen Anzahl von Backspace-Zeichen bestehen ( ^H) :)
j_random_hacker
1
@tchrist, fühlst du dich jetzt besser?
16

Funktionszeiger-Deklarationssyntax in C und C ++:

(int)(*f)(int, int);

Damit wird ein Funktionszeiger mit dem Namen deklariert, fdessen Spitzenwert zwei ints dauern und ein zurückgeben kann int.

Ich würde eine Syntax wie diese bevorzugen:

f: (int, int) => int

gAngenommen, Sie möchten einen Funktionszeiger deklarieren, dessen Pointee zwei ints und eine Funktion von intund intnach annehmen kann int, und ein zurückgeben int.

Mit C- oder C ++ - Notation deklarieren Sie es als:

(int)(*g)(int, int, int(int, int));

Mit der oben vorgeschlagenen Notation kann dasselbe deklariert werden als:

g: (int, int, (int, int) => int) => int

Letzteres ist viel intuitiver IMO.


Nebenbei: Die Programmiersprache OOC behebt diese Syntax (und verschiedene andere syntaktische Probleme in C und C ++). Schauen Sie sich hier die Homepage an .

fehlender Faktor
quelle
Einverstanden, einige "C" / "C ++" unterstützen es nicht oder mit anderer Syntax. Eine spezielle Syntax gibt an, wann eine Programmiersprachenfunktion unterstützt wird. Aus diesem Grund hat C # die "Delegate" -Syntax hinzugefügt.
Umlcat
Delegaten sind nicht nur syntaktischer Zucker, weil sie auch das Objekt speichern (im Gegensatz zu C ++
Memberfunktionszeigern
14

Ausführlichkeit in Java.

dh:

public static final int 
OscarRyz
quelle
6
Verglichen mit? (15 Zeichen)
TheLQ
7
Im Vergleich zu: const intzum Beispiel.
OscarRyz
11
"public static final int x = 4;" im Vergleich zu "x = 4" in Haskell.
Jared Updike
24
Das ist keine Ausführlichkeit. Versuchen Sie a+(b*c)/d*e+f/g^20, BigIntegerin Java zu schreiben . Warum erlaubt diese Sprache keine Bedienerüberladung?
MAK
4
@Michael: Programmierer, die auf diese Weise vor sich selbst geschützt werden müssen, können sich am besten selbst schützen (und den Schmerz für alle anderen verringern), indem sie überhaupt nicht programmieren: D.
MAK
12

\ we \ wouldnt \ fix \ our \ Parser-Namespace-Syntax in PHP

Die Syntax ist nicht nur hässlich, sondern führt zu Verwirrung, wenn neuere Entwickler über Namespaces in Strings nachdenken müssen. (PHP interpoliert Backslashes in Strings in doppelten Anführungszeichen als Escape-Sequenzen. Der Versuch, einen Namespace wie \you\should\never\do\thatin einem String in doppelten Anführungszeichen anstelle eines Strings in einfachen Anführungszeichen darzustellen, führt zu Zeilenumbrüchen, Tabulatoren und Katastrophen.)

Mario
quelle
Jemand hat sich eine bessere :: Möglichkeit ausgedacht, aber PHP besteht darauf, dass jeder Operator anders sein muss. Ich bin jedoch gespannt, was das Problem des Missbrauchs ist.
Alan Pearce
Zustimmen. PHP benötigt Namespaces, aber diese Syntax
bringt
9

Ich verachte die Tatsache, dass geschweifte Klammern nach einer if / while / for-Anweisung optional sein können.

Vor allem, wenn ich Code wie sehe,

if (...)
    for(...)
        ... One line of stuff ...

Bitte setzen Sie einfach die Zahnspange ein und fertig.

Jim A
quelle
6
Hmm .. das kommt drauf an. Bei "Abort Ifs", die lediglich eine Bedingung prüfen und einen Fehlercode zurückgeben (oder eine Ausnahme auslösen), würde ich die geschweiften Klammern lieber nicht sehen.
Billy ONeal
4
Ich würde zustimmen, wenn Sie sich auf extreme Fälle mit mehreren Ebenen beschränken würden, aber Ihre Aussage ist zu pauschal. Die Möglichkeit, Kurzformulare für einfache ifs und Schleifen mit nur einer Anweisung zu erstellen, ist von großem Nutzen.
Timwi
2
Meine Regel: Nur wenn eine Anweisung mehrere Unteranweisungen erfordert oder wenn sie eine solche Anweisung enthält, sollte sie in geschweifte Klammern gesetzt werden. So for (...) while (...) if (...) { x(); y(); }wird for (...) { while (...) { if (...) { x(); y(); } } }natürlich besser umgeschrieben als bei entsprechender Einrückung.
Jon Purdy
6
Ich bin eher das Gegenteil - ich verachte Leute, die darauf bestehen, Klammern zu tragen, wenn sie völlig unnötig sind. Lerne einfach zu programmieren.
Jerry Coffin
3
Ich mag die Klammern sogar in einzelnen if-Anweisungen. Dadurch kann ich den Programmfluss besser verfolgen.
Ricardo Santos
9

VBScript hat keine logischen Operatoren

Im Gegensatz zu fast jeder vernünftigen Sprache verwendet VBScript anstelle von logischen Operatoren bitweise Operatoren. Was bedeutet das in der Praxis? Nun, wie Eric Lippert betont :

If Blah = True Then Print "True!" Else Print "False!"

und

If Blah Then Print "True!" Else Print "False!"

sind in VBScript NICHT gleich!

Schlimmer noch, dies bedeutet, dass es in VBScript keine Kurzschlussauswertung gibt, so dass die folgende Anweisung Ihr Programm zum Absturz bringt, wenn dies der Fall BlahistNothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

Richtig, VBScript wertet beide Teile des AND-Vergleichs aus, auch wenn der erste falsch ist! Lass es auf dich einwirken...

Dan Diplo
quelle
3
Bis zu dem Tag, an dem Sie einen Fehler in einem gejagt If x Then ... If Not x Then ... End If ... End Ifund herausgefunden haben, dass x 2 ist, haben Sie nicht wirklich in VB / VBScript programmiert.
Konfigurator
7

EDIT: Nach der Diskussion in den Kommentaren habe ich beschlossen, diese Antwort zu aktualisieren, um mich besser zu erklären.

Ich hasse es wirklich, wie Funktionszeiger in C aussehen. Normalerweise sieht jede Variablendeklaration wie ein Tupel aus: type varname; Funktionszeigerdeklarationen sehen dagegen wie eine Deklaration der Funktion mit * vor dem Funktionsnamen aus. Ich kann dies als Beschreibung eines Zeigertyps akzeptieren, aber in C deklariert dies sowohl den Typ als auch den Namen einer Variablen dieses Typs. Dies erscheint mir inkonsistent, da Typdeklarationen sich ansonsten von Variablendeklarationen unterscheiden. struct myStruct{int X; int Y;}Definiert nur einen Typ, keine benannte Variable myStruct. Ebenso sehe ich keinen Grund, Typdeklarationen und Variablendeklarationen in Funktionszeigern zu einer atomaren Anweisung zu gruppieren , noch schätze ich die Abweichung von der type varname;Struktur.

Jemand wies darauf hin, dass dies mit einer Spiralregel vereinbar ist, und das mag der Fall sein, aber das Kennzeichen einer guten Syntax ist, dass sie selbsterklärend und ihre interne Logik offensichtlich ist. Die Spiralregel ist keineswegs offensichtlich.

EpsilonVector
quelle
1
Es ist konsistent mit dem Rest der Sprache, also geht es bei Ihrer Beschwerde vielleicht um die Syntax von C-Deklaratoren im Allgemeinen? Bevorzugen Sie die in Go verwendete Syntax ?
3.
Inwiefern konsequent? Normalerweise heißt es: type varname; Und wenn wir einen neuen zusammengesetzten Typ wie eine Struktur erstellen, kommt zuerst die Deklaration, möglicherweise mit einem typedef, und dann erstellen wir eine Variable dieses Typs. Wenn wir einen Funktionszeiger deklarieren, ist dies int (* foo) (int arg1, int arg2), der dann als Typ eines Arguments verwendet wird, das an eine Funktion übergeben wird: void newFoo (int (* foo) (int arg1, int art2) )) .... und als Variable: foo = a_compatible_func; Ich denke, dass eine Funktionsdeklaration zuerst und dann eine var-Deklaration als nächstes konsistenter wäre, wie folgt: typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
EpsilonVector
Deshalb hast du typedef.
Zneak
4
@EpsilonVector: Ich stimme eher zu, dass die Funktionszeigersyntax unangenehm ist, aber es gibt eine einfache Regel, die das Lesen erleichtert. Die Spiralregel
greyfade
1
EpsilonVector: Ich bin mir nicht sicher, was Sie von einer Zeigervariablendeklaration erwarten würden, wenn sie nicht den Namen der Variablen deklariert.
6

Semikolons in VBScript - oder das Fehlen davon

Ich arbeite den ganzen Tag in Sprachen, in denen am Ende jeder Zeile ein Semikolon steht. Fügen Sie am Ende der Zeile in VBScript eins hinzu, und Ihr Code wird nicht mehr ausgeführt.

Nathan Taylor
quelle
4
Nicht, weil ich Semikolons besonders mag, sondern weil ich es wirklich hasse , wenn VB wirklich lange Zeilen anregt , indem es Zeilenumbrüche so unbequem macht.
Shog9
6

In / Out-Argumente. Ich bin alles für Argumente (gut, dass ich das bin), unsere Argumente sind auch in Ordnung, aber ein Argument, das diese beiden Zustände vermitteln muss, ärgert mich.

Was ich hier anstrebe, sind Funktionen, die Eingaben von einem Parameter nehmen und diese Eingabe dann mit einer Ausgabe überschreiben. Es ist in Ordnung, ein Objekt als Referenz zu übergeben, um es zu aktualisieren. Aber, meistens für primitive Typen, ist es nicht richtig für mich, ein Objekt zu nehmen, es zu verwenden und dann vollständig zu ändern. Sie sollten die Bedeutung des Arguments nicht durch ein Inout ändern.

zneak
quelle
Welche Sprache hast du im Sinn? Wenn C #, dann würde ich nicht zustimmen, dass es ärgerlich ist, weil es immer explizit ist (im Gegensatz zu C ++). Außerdem kenne ich keine Standardsprache, in der Sie gezwungen sind, Argumente als in / out zu deklarieren.
3.
@finnw Ich habe noch nie eine Sprache , wo man gesehen hatte zu sagen , infür inArgumente entweder, ich bin über sie nur zu reden. Meiner Meinung nach kann nichts ein In / Out-Argument entschuldigen, und es lindert den Schmerz nicht, sie explizit zu machen. Es sollte keinen Grund geben, eine lokale Variable mit einem Wert zu initialisieren, der für die Funktion hilfreich ist, und dieselbe Variable muss dann plötzlich enthalten, was auch immer die Funktion dort ablegen möchte. Diese beiden sollten unterschiedlich sein. Immer.
Zneak
Entschuldigung, ich war da nicht ganz klar. Ich wollte sagen "Ich kenne keine Sprache, in der alle Argumente implizit in + out sind", dh Sie sind nicht gezwungen, diese Funktion zu verwenden, aber es gibt legitime Anwendungsfälle (z. B. Aktualisieren eines, structbei dem der neue Wert vom Wert abhängt von einem anderen feld desselben struct.)
finnw
@finnw Als Referenz übergebene Objekte (wie Instanzen von classObjekten in C #), die von einer Funktion geändert werden, sind für mich in Ordnung. Abgesehen davon, dass ich nicht konstante Strukturen nicht mag, ist es auch in Ordnung, ein structmit dem refSchlüsselwort zu übergeben, um es zu aktualisieren. Was ich wirklich hasse, ist, wenn die Eingabe mit der Ausgabe überschrieben wird. Das beste Beispiel, das ich mir vorstellen kann, ist die acceptFunktion von Berkeley Socket : Es braucht ein socklen_t*Argument, das bei der Eingabe die Größe der übergebenen Zeichen enthalten muss struct sockaddr*. und enthält bei der Ausgabe die Anzahl der Bytes, die darauf geschrieben wurden. Das sollte kriminell sein.
Zneak
Ich bin damit einverstanden, dass dies schlecht ist (IIRC, einige Win32-E / A-Funktionen tun dasselbe), aber dies ist ein Missbrauch der Funktion (der Funktionsaufruf ändert die Bedeutung der übergebenen Variablen, nicht nur ihren Wert) und bedeutet nicht die Funktion selbst ist schlecht.
3.
6

Array-Deklarationen in C und C ++.

Typischerweise hat eine Variablendeklaration das Format type variable_name. Sie können diese Erklärungen leicht von links nach rechts lesen. Aber int foo[size]sieht zunächst so aus, fooals würde es als int deklariert , und dann liest man weiter und sieht, dass foo vom Typ "Array von ganzen Zahlen" ist. int[size] fooliest sich viel besser.

Und ich hasse es auch , wenn Programmierer aus einem ähnlichen Grund Zeiger wie folgt erklären: int *foo. Aus irgendeinem Grund haben dachte ich nicht aus, das ist die typische Art und Weise es geschrieben ist.

Jacob
quelle
1
Zu Zeigerdeklarationen: Sie sind so geschrieben, weil das ' ' an den Variablennamen gebunden ist, nicht an den Typ. Alsoint* a, b; deklariert * nichta und bals Zeiger; nur aist. Daher ist es besser, es als zu schreiben int *a, b;(oder noch besser, sie als zwei Deklarationen zu schreiben).
Steve Melnikoff
Guter Punkt. Es ist schade *, nicht an den Typ zu binden.
Jacob
2
Und das heißt nichts von Funktionszeigern ... void(int) *f;? Nö:void (*f)(int);
Notiz an sich selbst - denke an einen Namen
In modernem C ++ werden Zeiger und Arrays kaum benötigt.
Fredoverflow
2
@Steve Melnikoff: Obwohl ich diese Antwort positiv bewertet habe, finde ich das von int* a, b;Ihnen angesprochene Problem viel ungeheuerlicher.
j_random_hacker
5

Redundante Parametrierung in Java:

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

Was andere Art der Parametrierung ist der Compiler denken foo haben könnte?

Hoa Long Tam
quelle
4
Ich hoffe, Sie kennen die (begrenzte) Typinferenz von Java? HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
Donnerstag,
1
Java 7:HashMap<String,HashMap<String,String>> foo = new HashMap<>();
Bart van Heukelom
5
Nun, es kann jeden Typ haben, den es will, die Typen werden sowieso gelöscht ...
Konfigurator
Fehlende Typinferenz, meinst du?
Fehlender Faktor
What other type parameterization does the compiler think foo could have?- Aus welchem ​​Grund auch immer, es handelt sich um einen rohen Typ - als ob irgendjemand mit Verstand rohe und parametrisierte Typen mischen würde.
Maaartinus
5

Da sich die Leute bereits über =vs. beschwert haben ==, möchte ich auf eine viel schlechtere Alternative hinweisen. PL / Ich hatte beides :=und =, aber wenn etwas "offensichtlich" ein Auftrag war, konnte man damit davonkommen =. Mit können :=Sie eine Zuweisung erzwingen, wenn der Compiler sie andernfalls als Vergleich interpretiert.

Leider hat sich der Compiler nicht immer so entschieden, wie man es erwarten würde. Betrachten Sie nur ein offensichtliches Beispiel:

A = B = 0;

Nun, für die meisten Leute, die mit den meisten "gewöhnlichen" Sprachen vertraut sind, ist die Bedeutung ziemlich offensichtlich - weisen Sie A und B jeweils 0 zu. PL / I ist nur ein bisschen ... anders. Aus Gründen, die nur den (wahnsinnigen) Designern der Sprache bekannt sind, wird der erste =als Aufgabe interpretiert, der zweite =jedoch als Vergleich. Daher vergleicht dies B mit 0 und ordnet dann das Ergebnis dieses Vergleichs A zu (gemäß der C-Stil-Konvention, dass "falsch" zu 0 und "wahr" zu 1 führt).

Wenn B also 0 ist, wird A zu 1. Andernfalls wird A zu 0. Mit anderen Worten: Anstatt A und B denselben Wert zuzuweisen, stellt dies tatsächlich sicher, dass A nicht denselben Wert wie B haben kann.

Fazit: auch wenn die C / C ++ / PHP Stil zunächst scheint wie ein Schmerz, die Alternative ist viel schlimmer 1 .

1 Nun, technisch gibt es eine andere Alternative: Pascal-Stil, bei dem =Vergleich und Zuordnung immer erforderlich sind :=. Nachdem Sie das eine Weile benutzt haben, ist es ziemlich offensichtlich (zumindest für mich), dass Zuweisungen häufiger sind als Vergleiche. Wenn Sie zusätzliches "Zeug" benötigen, um die beiden zu disambiguieren, sollten Sie die Zuweisungen auf jeden Fall einfach und sauber halten Benötigen Sie die zusätzliche "Grunge" für Vergleiche, nicht umgekehrt.

Jerry Sarg
quelle
1
Ich würde sogar vorschlagen, ==für die Gleichstellung und :=für die Zuordnung zu verwenden. Auf diese Weise haben Sie mehr zu tippen, aber das Vermeiden der Einsamkeit =hilft, Fehler zu vermeiden.
Maaartinus
@ Maartinus: zumindest für mich klingt das wie die absolut schlechteste Möglichkeit, aber so ist das Leben ...
Jerry Coffin
3

Perl

  1. Ich wünschte Perl lass mich schreiben if($x < 10) do_something();. Im Moment muss man das entweder do_something() if($x < 10);als oder als schreiben if($x < 10) { do_something(); }.
Gaurav
quelle
9
do_something() if ($x < 10); ist nicht so schlimm
Zneak
Es ist nicht und in vielen Fällen ist es viel sauberer als if(..) ... das Booten, da Sie alle Ausdrücke rechts anordnen können. Aber es gibt Zeiten, die ich wirklich sagen möchte if($x < 10) do_something();, und es ist bedauerlich, dass Perl mich nicht zulässt.
Gaurav
7
Es ist unglücklich, bis Sie schreiben if ($x<10) do_something(); and_call_me(); und sich dann fragen, warum Sie nie einen Anruf erhalten. Ich wünschte, C und Familie würden die Klammern benötigen, um diese Art von Fehler zu verhindern.
AShelly
2
@AShelly: oder warum du eigentlich immer einen Anruf bekommst.
zneak
1
@ zneak Außer nein elses. (Ich wünschte, es hätte EXPR1 if COND else EXPR2wie Python)
Ming-Tang
3

reinterpret_cast<unsigned long>in c ++. Diese Operation ist nützlich, um mit fremden APIs umzugehen und numerische Präzision zu gewährleisten. Warum sollte es so schmerzhaft sein, sie zu tippen und so hässlich anzusehen?

Ahelly
quelle
17
Es ist hässlich, Sie daran zu erinnern, dass Sie sich bemühen sollten, Code zu schreiben, der ihn nicht benötigt. :)
greyfade
Für mich ist das eine gute theoretische Art von Argumentation in der Informatik, aber meiner Erfahrung nach ist es zu nützlich, sie zu vermeiden (ein Großteil meiner Erfahrung ist jedoch einfach altes C, daher habe ich wahrscheinlich eine Voreingenommenheit).
AShelly
5
Es ist nicht wirklich ein theoretisches CS-Argument: Die Verwendung von a reinterpret_castin C ++ ist ein sehr starker Codegeruch. In 99% der Fälle, in denen Sie es verwenden möchten, sollten Sie dies wahrscheinlich nicht tun müssen - Sie haben wahrscheinlich etwas falsch gemacht. Die anderen 1% der Zeit, in der Sie mit C. reinterpret_castkommunizieren, unterbrechen das Typsystem, damit etwas funktioniert, wenn es sonst nicht funktioniert. Das ist normalerweise eine schlechte Sache.
greyfade
3

Das for ... in- Konstrukt in JavaScript und das foreach- Konstrukt in PHP beim Schleifen über Arrays. Beide machen es einfacher, Fehler zu schreiben als richtigen Code.

Joeri Sebrechts
quelle
3
Wow, das ist so ein Blödsinn. "Als richtiger Code". Geh weg.
Jonathan Sterling
Wenn ich zusätzlichen Code schreiben muss, um sie sicher zu verwenden, können sie in meinem Buch leichter falsch verwendet werden. Für ... in sind zusätzliche Überprüfungen erforderlich, um sicherzustellen, dass Sie nicht über Objekte aus dem Prototyp iterieren, und für foreach müssen Sie die Referenzen anschließend bereinigen, oder Sie riskieren, den letzten Wert im Array zu überschreiben.
Joeri Sebrechts
der foreach mit wechselnden referenzen (& operator) ist ein berühmter
fehler
1
Ich bin verwirrt, ich dachte, es sei allgemein bekannt, dass das "for..in" -Konstrukt in Javascript defekt ist ... warum ist das anstößig?
lvilnis
2

Zeiger von Arrays oder Arrays von Zeigern in C / C ++. Ich bin immer noch verwirrt über diese.

Casebash
quelle
3
Lesen Sie den Typ rückwärts. int[]*ist ein Zeiger auf ein Array von Ganzzahlen und int*[]ein Array von Zeigern auf Ganzzahlen. Funktioniert auch gut mit consts: int* constIst ein konstanter Zeiger auf Ganzzahlen, wohingegen const int*und int const*Zeiger auf konstante Ganzzahlen (oder auf Ganzzahlkonstanten) sind.
Zneak
@zneak: "Von rechts nach links" funktioniert nicht, siehe die erwähnte "Spirale im Uhrzeigersinn" / "Inside Out" -Regel.
Oder verwenden Sie einfach typedefs und es gibt keine Verwirrung.
Billy ONeal
In modernem C ++ werden Zeiger und Arrays kaum benötigt.
Fredoverflow
4
@ tchrist: Nicht wahr. int (*p)[10];deklariert p, ein Zeiger auf ein Array von 10 Zoll zu sein. Wenn sizeof (int) == 4p++p
ja
2

Die Tatsache, dass Python auf der Textformatierung beruht.

Ashalynd
quelle
1

Javascript / Java usw., entspricht dem Vergleich, zB wenn (a == 1)

Wie oft schreibe ich, wenn (a = 1)?

Als Mensch habe ich das perfekt gelesen. Aber der verdammte Interpreter / Compiler sagt: "Hey, ich werde 1 zu a zuordnen, dann prüfen, ob a gleich 1 ist, und würden Sie es glauben, ja, das ist es!

Fährt mich die Wand hoch.

if (a == 1) ist weitaus weniger lesbar und der Interpreter / Compiler sollte sowieso wissen, was ich meine; Viele andere kleinere Sprachen (VB) arbeiten seit Hunderten von Jahren erfolgreich daran.


quelle
Was if (a = true)soll das heißen?
Tom Hawtin - Tackline
2
Die Zuweisung sollte nur keinen Wert zurückgeben. Es ist manchmal nützlich, aber in den meisten Fällen ist es nur ein Schmerz im Nacken.
Konfigurator
in Javascript fängt JSLint das für Sie.
Zachary K
Das Problem ist, dass die Zuweisung von Bedingungen hilfreich sein kann. Ich finde <tt> while (element = list-> next ()) </ tt> gut lesbar. Ich bin mir also nicht sicher, ob ich es entfernen lassen möchte.
Inca
3
@Tom: Das heißt, Sie verstehen keine Booleschen Werte. Wenn Sie meinten if (a == true), schreiben Sie einfach if (a). Wenn Sie meinten a = true, dann ist die ifAussage überflüssig.
dan04
1

Ausführlichkeit in anonymen Java-Klassen. Wird hoffentlich bald behoben.

Alex
quelle
Es sei denn, Sie möchten mehr als eine Methode.
Tom Hawtin - Tackline
0

structPointer->memberin C / C ++. Kann gut sein, um den Code eines anderen zu lesen, aber ich mag es nicht. Zwei Zeichen statt eines ... was für eine Platzverschwendung!

Federico Klez Culloca
quelle
2
Leider muss unterschieden werden ., was für Mitglieder eines Nicht-Zeiger-Objekts gilt. Mehrdeutige Syntax ist schlecht, mmmkay?
greyfade
2
@greyfade: Ja! Da der Compiler möglicherweise seine Typsystemregeln nicht verwenden kann, um festzustellen, wann Sie einen Zeiger auf einen Strukturtyp verwenden und die Dereferenzierung implizit anwenden. Nein, das ist verrücktes Gerede! (Und trotzdem kann es Ihnen irgendwie eine Fehlermeldung geben, wenn Sie etwas falsch machen.) Die Syntax ist nicht mehr eindeutig. Es ist nur C, wie üblich, ein Kopfzerbrechen. Delphi macht implizite Dereferenzen ganz gut, wenn Sie tatsächlich in dunklen Ecken arbeiten, die Zeiger auf Datensätze erfordern, so kann es ohne Verwirrung eines Parsers getan werden ...
Mason Wheeler
5
@Mason: Wie sieht es mit Fällen aus shared_ptr, in denen ->auf den enthaltenen Typ zugegriffen wird und .auf Eigenschaften von sich shared_ptrselbst zugegriffen wird ? Es tut mir leid, aber hier stimme ich überhaupt nicht zu.
Billy ONeal
2
könnte schlimmer sein. Könnte PHP sein, mit dem Sie ->auf Mitglieder von irgendetwas zugreifen müssen .
Carson Myers
1
@maaartinus: Jeder Code, der so stark von der nicht offensichtlichen Reihenfolge der Operationen abhängt, ist kein Code, den ich schreiben werde.
Billy ONeal
0

Mehrzeiliger Code von Scala in Klammern

Zum Beispiel:

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

Was Sie tatsächlich davon bekommen, ist grandios. Es generiert den Konstruktor und die Getter und Setter für Sie. Aber es ist sicher hässlich und bricht alle meine mentalen Modelle, wie man Code einrückt, und im Grunde fühle ich mich wie in einem bizarren Sandwich mit Java auf der einen Seite und Lisp auf der anderen Seite. (Oh, warte ... das ist eher der Punkt von Scala.)

Tom Morris
quelle
Ich bin verwirrt - meinst du den Teil in der Klammer ( val barund so weiter) oder den Teil in geschweiften Klammern (der folgende Teil extends Model)? (Es gibt keine Klammern in diesem Code)
Billy ONeal
3
Der Teil in Klammern. Ich bin Engländer. Wir bezeichnen diese als Klammern, verdammt noch mal, weil sie in dieser Situation keine runde Sache sind.
Tom Morris
2
Es sieht nicht so schlecht , wenn auf diese Weise eingerückt: pastebin.com/h9qC8XGg
missingfaktor
Ich finde es besser lesbar, diese Konstruktorparameterlisten horizontal zu schreiben, insbesondere wenn ich nur wenige Parameter habe.
MJP
Sieht für mich nach einer Methode aus. Wie Simula. Gute alte Schule.
Tom Hawtin - Tackline