it-swarm.com.de

Wo private Methoden in Ruby platzieren?

Die meisten Blogs, Tutorials oder Bücher haben private Methoden am Ende einer Klasse/eines Moduls. Ist das die beste Praxis?

Ich finde es bequemer, private Methoden zu haben, wenn es nötig ist. Beispielsweise:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

Auf diese Weise finde ich den Code besser lesbar, anstatt ununterbrochen nach oben und unten zu scrollen, was sehr irritierend ist.

Ist an dieser Herangehensweise etwas schrecklich Falsches? Sind private Methoden im Grunde nicht nur eine bewährte Methode und etwas anderes?

93
ZX12R

Meiner Meinung nach ist es die beste Vorgehensweise, nacheinander zu arbeiten und Ihre Methoden zu deklarieren, ohne dabei die Privatsphäre zu wahren.

Am Ende können Sie jede Methode als privat kennzeichnen, indem Sie einfach Folgendes hinzufügen: private :xmethod

Beispiel:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

Rechtfertigt dies Ihre Frage?

127
kiddorails

Es gibt auch die Möglichkeit, private der Methodendefinition voranzustellen, da Ruby 2.1.

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

Anhand der Definition wissen Sie sofort, ob eine Methode privat ist, unabhängig davon, wo in der Datei sie definiert ist. Es ist etwas typischer (wenn Sie nicht automatisch vervollständigen) und nicht alle Ihre defs werden gut ausgerichtet sein.

53
Dennis

Wie andere bereits betont haben, besteht die Konvention darin, private Methoden unter eine private Klasse zu stellen. Sie sollten jedoch wahrscheinlich auch wissen, dass viele Programmierer hierfür eine doppelt eingerückte (4 statt 2 Leerzeichen) Methode verwenden. Der Grund dafür ist, dass Sie in Ihrem Texteditor häufig nicht "privat" sehen und davon ausgehen, dass sie öffentlich sein könnten. Eine Abbildung finden Sie unten:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

Diese Methode sollte verhindern, dass Sie einen Bildlauf nach oben und unten durchführen müssen, und andere Programmierer sollten sich in Ihrem Code wohler fühlen.

51
Noah Clark

Ich denke, dass öffentliche Methoden eine Art Schnittstelle des Objekts sind und es logisch ist, sie an der prominentesten Stelle zu platzieren, d. H. Oben in der Datei.

15
Flexoid

Sie müssen public oder private nicht über jede Methode setzen. Normalerweise schreibe ich alle meine privaten Methoden in meine Klasse. Sie müssen auch nicht explizit public angeben, da die Methoden standardmäßig öffentlich sind. Beispielsweise:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end
12
Kyle Decot

Ich komme aus dem Java Hintergrund und ich hasse es, scrollen zu müssen, um den Methodentyp zu sehen. Ich finde es verrückt, dass man die Sichtbarkeit einer Methode nicht ohne Hässlichkeit festlegen kann. Also habe ich einen Kommentar abgegeben #private Vor jeder Saugmethode und anschließende Deklaration von private :....

6
akostadinov

Ich nehme an, das ist Geschmackssache, aber ich würde jede Methode, die in der Zeile privat steht, nach dieser Methode explizit wie folgt benennen:

 class Example
   def cthulhu
   end

   def rlyeh
   end

   def foo
   end
   private :foo

   def bar
   end
   private :bar

   def baz
   end
   private :baz     
 end
4
crogers

Ich mag es nicht, öffentlich oder privat für jede Methode angeben zu müssen. Wenn ich alle privaten Methoden ganz nach unten setze, kann ich nur eine Instanz von "private" pro Datei verwenden. Ich denke, es ist Geschmackssache.

4
David

Ein Stil besteht darin, Methoden so zu gruppieren, dass Sie private und protected höchstens einmal pro Klasse verwenden. Ein anderer Stil besteht darin, die Sichtbarkeit direkt nach der Methodendefinition anzugeben:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

Ab Ruby 2.1.0 def gibt den Methodennamen als Symbol zurück, sodass ein optimierterer Stil möglich ist:

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(Beachten Sie, dass wir private_class_method Für Klassenmethoden verwenden - ansonsten erhalten wir NameError: undefined method, Da private eine Instanzmethode erwartet. Auch wenn es wie im Original als Makro verwendet wird Beispiel betrifft nur die Sichtbarkeit von Instanzmethoden.)

Mir gefällt dieser Inline-Sichtbarkeitsstil am besten, da Sie damit Methoden nach Ihren Wünschen organisieren können. Dies verringert das Risiko, dass eine neue Methode am falschen Ort hinzugefügt und versehentlich privat gemacht wird.

Die Syntax der Klassenmethode kann stattdessen folgendermaßen behandelt werden:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end
4
devpuppy

Dennis hatte die perfekte Antwort, das heißt, wenn er Ruby> = 2.1 verwendet, muss dem def nur ein privates (oder geschütztes, öffentliches) Präfix vorangestellt werden.

Aber ich glaube, dass es jetzt auch möglich ist, private als Block zu verwenden, wie in:

private begin
   def foo
   end
   def bar
   end
end

def Zip
end
1
edx

Ich bestelle meine Methoden im Allgemeinen wie folgt:

  1. Konstrukteur
  2. Andere öffentliche Methoden in alphabetischer Reihenfolge
  3. private, nur einmal geschrieben
  4. Private Methoden in alphabetischer Reihenfolge

Ich verwende in meinem Editor die Funktion "Gehe zur Definition", damit nicht viel gescrollt wird. Wenn die Klasse jedoch groß genug ist, um Probleme beim Scrollen zu verursachen, sollte sie wahrscheinlich in mehrere Klassen unterteilt werden.

0