Scala - infix vs dot-notation
Ist es die beste Praxis für einen über den anderen? Ich lese die Scala-Buch von Odersky et al. und wie es scheint, infix verwendet wird, um eine Menge Sammlungen von API-Funktionen, in der Erwägung, dass dot ist reserviert für Programmierer-definierte Funktionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich persönlich habe keine harten und schnellen Regeln, aber ich Neige dazu, verwenden Sie infix-notation nur mit symbolischen Methode Namen und dot-notation für alphanumerische lieben.
Infix-notation macht es umständlich code ändern später. Hier sind einige Beispiele.
Stell dir vor, du hast diese Codezeile:
Nehme an, bei einigen letzteren Punkt in der Zeit, die Sie brauchen, um hinzuzufügen, ein
toList
am Ende. Sie legte es so:Dies kann dazu führen, Semikolon Inferenz Probleme. Um diese Probleme zu vermeiden, können Sie entweder setzen Sie ein Semikolon am Ende, oder legen Sie eine neue Zeile. Beide Optionen sind hässlich, meiner Meinung nach. Um zu vermeiden, all diesen Unsinn, ich gehe lieber mit
xs.filter(f).map(g)
. Es ist immer einfacher, umgestalten, mit dieser syntax.Anderes Beispiel: Sagen wir ich habe Folgendes in meinem code:
Sagen, ich brauche, um die Bedingung zu negieren. Wenn ich ändern Sie es wie folgt:
Mist. Dieser wird analysiert, wie
(!foo).contains(bar)
. Nicht das was wir wollten.Dass Sie brauchen, um eine neue Bedingung hinzuzufügen zusätzlich, und ändern Sie es so:
Anderen Mist. Dieser wird analysiert, wie
foo.contains(bar.&&(cond))
. Nicht das was wir wollten, wieder.Natürlich, man könnte hinzufügen, ein paar Klammern, aber das wäre hässlich und schwer zu Lesen/Bearbeiten, verglichen mit dot-notation.
Nun, alles, was ich oben sagte, gilt für symbolische Methode Namen zu. Jedoch symbolische Methoden unnatürlich Aussehen, wenn verwendet mit dot-syntax, und so habe ich lieber der infix-syntax für Sie.
Einer Ausnahme von der Richtlinie über: Interne DSLs. Sie sind in der Regel in Handarbeit mit Sorgfalt, um nicht zu verursachen, analysieren Probleme beim schreiben in der vorgeschriebenen Art und Weise in Ihrer Dokumentation/Beispiele (die in der Regel verwendet infix-notation).
(xs filter f map g).toList
ist noch viel sauberer und deutlicher alsxs.filter(f).map(g).toList)
someExpression
=>someExpression.newPart
ist nicht wesentlich besser alssomeExpression
=>(someExpression).newPart
In beiden Fällen müssen Sie.newPart
. Zugegeben, Sie haben zum hinzufügen von Klammern, im zweiten Fall aber ist es wahrscheinlich, Sie begann mit viel weniger von Ihnen in den ersten Platz. Der Strohmann war, um zu rechtfertigen, der erste Ansatz mit dem "Dies kann dazu führen, Semikolon Inferenz Probleme." Erklärung - was ist ein symptom der zusätzlichen postfix-Aufruf, nicht für den ursprünglichen Ausdruck.Es ist eine Frage der persönlichen Vorliebe. Ihre Entscheidung für eine Art oder die andere sollte auf der Grundlage, was Ihr code die meisten lesbar.
Aber beachten Sie, dass die Fähigkeit, lassen Sie den Punkt und die Klammern beschränkt sich nur auf bestimmte syntaktische Konstruktionen, so manchmal muss man einfach zurück zu fallen mit Ihnen.
a.op(b)
ist mehr alsa op b
aber kürzer als(a op b)
. Kleiner Unterschied, aber es kann Teil der "most readable" Berücksichtigung.Es ist eine gute style guide in der offiziellen Scala-Website Dokumentation, die beschreiben, korrekter Gebrauch infix-notation über die Punkt-notation.
Suffix-Notation:
Arheit-1:
Höherer Ordnung Funktionen:
Symbolische Methoden/Operatoren:
Habe ich gefunden, dass die Verwendung von infix-notation für
map
funktioniert gut, wenn ich bin, erstellen von seinen Anhängern mit dem Katzen Bibliothek. z.B.:können Sie loszuwerden, die umgebenden Klammern, etwa so:
und in meiner Sicht ist die zweite Variante liest sich schöner. Geschmackssache, nehme ich an. Wollte nur hinzufügen meine zwei Cent Wert.
Den oben genannten Werken, weil
|
in "|@|" hat eine höhere Priorität alsm
im "map". Lesen Sie diesen Teil der Scala-lang-Spezifikation, um mehr zu erfahren detail:http://scala-lang.org/files/archive/spec/2.12/06-expressions.html#infix-operations