Es scheint mir, als hätte Ruby eine Menge syntaktischer Flexibilität, und viele Dinge könnten auf verschiedene Arten geschrieben werden.
Gibt es Sprachmerkmale / syntaktische Zucker / Codierungskonventionen, die Sie als Ruby-Programmierer aus Gründen der Übersichtlichkeit vermeiden ? Ich frage nach Dingen, die Sie wählen nicht absichtlich zu verwenden, nicht Sachen, die Sie noch lernen müssen.
Wenn Ihre Antwort lautet: "Ich benutze alles!", kommentieren Sie jemals Code, der sonst offensichtlich wäre, wenn der Leser die relevante Ruby-Syntax kennt?
[Ich bin besonders an Ruby in einem RoR-Kontext interessiert, aber alles ist willkommen.]
Der gesamte Bereich von "$" globals (siehe Pickaxe2 pp333-336) stammt größtenteils von Perl , sind ziemlich grässlich, obwohl ich gelegentlich $:
anstelle von $ LOAD_PATH gefunden habe.
Ich verzichte generell darauf, mit Affepatching über Bord zu gehen, weil dies zu Problemen mit der Wartbarkeit und Lesbarkeit führen kann. Es ist ein großartiges Feature, wenn es richtig verwendet wird, aber es ist leicht, sich davon wegtragen zu lassen.
Die for ... in ... -Schleife. Es kompiliert direkt zu obj.each (und wirft eine seltsame Fehlermeldung entsprechend) und ist völlig unnötig. Ich sehe nicht einmal, wo es Lesbarkeit verbessert - wenn Sie seit mehr als einer Woche ruby gewesen sind, # sollte jeder natürlich sein.
Zunächst einmal: Ich werde viele dieser Regeln brechen, wenn es sich um ein kurzes, einmaliges Skript oder einen Einzeiler in der Befehlszeile oder in irb
handelt. Aber die meiste Zeit verbringe ich mit mittelgroßen oder größeren Skripten oder Anwendungen. Also:
Vermeiden:
class << self
code block für Klassenmethoden. Es ist ein süßer Trick, aber nicht besser als def self.foo
und weniger lesbar (besonders nach der ersten Seite). for i in collection
: Verwenden Sie stattdessen collection.each
. proc {...}
: normalerweise lambda {...}
ist besser. @@foo
). Sie sind problematisch und können in der Regel ohne großen Aufwand durch Variablen auf Klassenebene ersetzt werden. ruby -w
ausgeführt wird. Dies ist besonders wichtig, wenn Sie ein Juwel schreiben, das von anderen verwendet werden soll. else
' in einem ' begin ... rescue ... end
' Block. Persönliche Präferenz: Es ist zu viel von einem Randfall und so wenige Leute wissen sogar, dass es existiert oder wie es funktioniert, um es wert zu sein. ObjectSpace
und GC
. Du musst wahrscheinlich nicht dorthin gehen. Du willst definitiv nicht dorthin gehen. =begin
und =end
mehrzeilige Kommentare. Persönliche Präferenz für zeilenweise Kommentare. Diese ärgern mich nur höllisch. Verwenden Sie es, aber sparsam oder als letztes Mittel (und kommentieren Sie es angemessen):
eval
(oder class_eval
, usw.) beim Übergeben einer Zeichenfolge. Es gibt einige Metaprogrammierungstricks, die Sie einfach nicht ausführen können, ohne eine Zeichenfolge zu übergeben. Und gelegentlich, die String-Version führt dramatisch besser (und manchmal das ist wichtig). Ansonsten sende ich lieber Blöcke aus aktuellem Ruby-Code für meine Metaprogrammierung. Eval kann für viele Metaprogrammierungsaufgaben vollständig vermieden werden. $:
, $$
, require "English"
und andere Umgebungsvariablen, aber selbst dann können Sie Ihre Verwendung einschränken).
__END__
. and
für einen Datenblock. Hervorragend für ein kleines Ein-Datei-Skript. Nicht hilfreich für eine Multi-Datei-App. Benutze es nicht, aber vermeide es auch nicht:
Dinge, die ich oft benutze, die andere vielleicht nicht interessieren oder die ich nicht oft sehe:
or
' und ' &&
' Schlüsselwörter: Sie haben einen anderen Vorrang als ||
und %code% , also müssen Sie vorsichtig mit ihnen sein. Ich finde ihren unterschiedlichen Vorrang sehr nützlich. Eine Sache, die ich wirklich hasse, ist die "unsachgemäße" Verwendung von {}
und do ... end
für Blöcke. Ich kann nicht genau finden, wo ich die Praxis selbst gelernt habe, aber es ist allgemein akzeptiert, {}
für einzelne Zeilenblöcke und do ... end
für mehrzeilige Blöcke zu verwenden.
Richtige Verwendung:
%Vor%oder
%Vor%Unsachgemäße Verwendung:
%Vor%oder
%Vor% All dies wird natürlich mit 576
Vermeiden Sie es, zu viele Methodenaufrufe miteinander zu verketten. In Ruby ist es sehr üblich, Methoden miteinander zu ketten.
%Vor%Das scheint in Ordnung zu sein, aber bricht Demeter-Gesetz :
Formaler ausgedrückt erfordert das Demeter-Gesetz für Funktionen, dass eine Methode M eines Objekts O nur die Methoden der folgenden Arten von Objekten aufrufen darf:
Das obige Beispiel ist nicht perfekt und eine bessere Lösung wäre etwa so:
%Vor%Das Problem des Beispiels ist nicht Rubys Fehler, aber es ist sehr einfach, Code zu erzeugen, der Demeter-Gesetz bricht und Code unlesbar macht.
Kurz gesagt, vermeiden Sie Funktionen, die die Lesbarkeit von Code verringern . Es ist sehr sehr wichtig, dass der von Ihnen erzeugte Code leicht zu lesen ist.