Gibt es Ruby-Sprachfunktionen, die Sie vermeiden?

8

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

    
Dan Rosenstark 04.06.2009, 09:50
quelle

8 Antworten

11

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.

    
Mike Woodhouse 04.06.2009, 10:21
quelle
8

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.

    
Firas Assaad 04.06.2009 09:54
quelle
7

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.

    
Skade 04.06.2009 11:45
quelle
6

Das mag offensichtlich sein, aber ich vermeide generell die Verwendung von eval, wenn es Alternativen gibt.

    
Sam 04.06.2009 14:26
quelle
6

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:

  • mit 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.
  • Klassenvariablen (z. B. @@foo ). Sie sind problematisch und können in der Regel ohne großen Aufwand durch Variablen auf Klassenebene ersetzt werden.
  • Alles, was eine Warnung auslöst, und vorzugsweise alles, was eine Warnung auslöst, wenn es über die strengere 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.
  • Hinzufügen oder Neudefinieren von Methoden für Klassen, die nicht von mir erstellt wurden und von Code außerhalb meiner Kontrolle verwendet werden können; a.k.a Affen-Patchen. Diese Regel gilt hauptsächlich für größere Codebasen und Bibliotheken. Ich mache gerne und schnell eine Ausnahme für kleine einmalige Skripte. Ich mache auch eine Ausnahme für die Reparatur von fehlerhaften Bibliotheken von Drittanbietern (obwohl Sie sich beim Upgrade selbst in den Fuß schießen können!). Selector Namespaces (oder etwas Ähnliches) würde einen langen Weg machen, um Ruby in dieser Hinsicht schön zu machen. Das heißt, manchmal ist es die Mühe wert. ; -)
  • Globale Variablen (außer für Klassen). Ich gebe sogar $ stdout als Parameter für meine Objekte oder Methoden ein, anstatt sie direkt zu verwenden. Es macht die Wiederverwendung des Codes viel einfacher und sicherer. Manchmal können Sie es nicht vermeiden (z. B. $: , $$ , require "English" und andere Umgebungsvariablen, aber selbst dann können Sie Ihre Verwendung einschränken).
    • Sprechen wir darüber, ich bevorzuge es, meine Verwendung der Perlsymbol-Globals vollständig zu beschränken, aber wenn sie mehr als ein bisschen verwendet werden müssen, dann __END__ .
  • break, redo, next, try: Oft machen sie einen Block, eine Schleife oder eine Methode viel eleganter, als es sonst sein könnte. Normalerweise machen sie dich nur ein paar Minuten lang den Kopf kratzen, wenn du diesen Code eine Weile nicht gesehen hast.
  • 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:

  • versuche / fange
  • Fortsetzungen

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.
  • regex black magic (vorausgesetzt, ich habe ein paar Beispiele in Unit-Tests dafür)
  • HEREDOC-Zeichenfolgen
nicholas a. evans 05.06.2009 14:49
quelle
1

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

ausgeführt     
Ryan Neufeld 05.06.2009 14:16
quelle
1

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:

  1. O selbst
  2. M's Parameter
  3. alle Objekte, die erstellt / instanziiert wurden innerhalb von M
  4. Os direkte Komponentenobjekte

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.

    
Pekka Mattila 06.06.2009 13:21
quelle
0
%Vor%

oben Syntax ist gültig, aber Sie sollten nie verwenden.

    
Subba Rao 11.06.2009 13:45
quelle

Tags und Links