Gdzie umieścić prywatne metody w Rubim?


95

Większość blogów, samouczków lub książek ma prywatne metody na dole każdej klasy / modułu. Czy to najlepsza praktyka?

Uważam, że korzystanie z prywatnych metod jest dla mnie wygodniejsze. Na przykład:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

W ten sposób uważam, że kod jest bardziej czytelny, zamiast ciągłego przewijania w górę iw dół, co jest bardzo irytujące.

Czy w tym podejściu jest coś strasznego? Czy posiadanie prywatnych metod na dole to nie tylko najlepsza praktyka i coś innego?


w rzeczywistości twój sposób też nie jest zły. Ja też postępuję tak samo w kilku przypadkach, wydaje się to wygodniejszeprivate def my_method...end
r3bo0t

Odpowiedzi:


131

Moim zdaniem najlepszą praktyką jest pójście sekwencyjnie i deklarowanie swoich metod bez zachowania tajemnicy z punktu widzenia.

Na koniec możesz ustawić dowolną metodę jako prywatną, dodając po prostu: private :xmethod

Przykład:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

Czy to uzasadnia twoje pytanie?


19
Nie sądzę, żeby to był świetny pomysł z punktu widzenia czytelności, ponieważ klasa rośnie coraz dłużej.
Alexander Suraphel

2
Naprawdę uważam, że powinieneś sortować metody według ważności i tego, co nazywa się tym, co, gdy wszystkie inne rzeczy wydają się równe. Metody prywatne są szczegółami implementacji i powinny być ostatnią rzeczą, którą widzi czytelnik, dlatego powinny znajdować się niżej w pliku. Zgadzam się z powyższym komentarzem, że nie będzie to działać dobrze w przypadku większych plików. To nie powinna być akceptowana odpowiedź, na tej stronie jest o wiele lepsza rada.
Luke Cowell

58

Istnieje również opcja dodania privateprzed definicją metody od Ruby 2.1.

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

Patrząc na definicję, od razu wiesz, czy metoda jest prywatna, bez względu na to, gdzie w pliku jest zdefiniowana. To trochę więcej pisania (jeśli nie uzupełniasz autouzupełniania) i nie wszystkie twoje defbędą ładnie wyrównane.


5
Trzeba było dodać uwagę, że jest to dostępne w Rubim 2.1, gdzie metody zwracają klucz z własną nazwą: bugs.ruby-lang.org/issues/3753
konole

Uważam, że prywatny może być również używany jako blok, czyli zawarcie niektórych prywatnych metod w prywatny początek ... koniec
edx

zobacz odpowiedź @devpuppy , aby zapoznać się z uwagą dotyczącą robienia tego za pomocą metod klasowych.
manroe

Dodanie privatetylko raz, przed ymethod, również działa. Nie ma potrzeby wielokrotnego dodawania.
Iulian Onofrei

@IulianOnofrei Gdybyś miał poniżej inną metodę zmethodbez private, ta metoda nie byłaby prywatna. Więc musisz to powtórzyć (przynajmniej z Rubim 2.3).
tsauerwein

52

Jak inni już zauważyli, konwencja polega na umieszczeniu metod prywatnych na samym dole, w ramach jednej klasy prywatnej. Jednak prawdopodobnie powinieneś również wiedzieć, że wielu programistów używa do tego metody z podwójnym wcięciem (4 spacje zamiast 2). Powodem jest to, że często nie widzisz słowa „prywatne” w swoim edytorze tekstu i zakładasz, że mogą one być publiczne. Poniżej znajduje się ilustracja:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

Ta metoda powinna zapobiec konieczności przewijania w górę iw dół i sprawi, że inni programiści będą wygodniejsi w kodzie.


4
To była cała wściekłość, kiedy zostawiłem ten komentarz w '12. Nie widzę tego zbyt często i wypadło to z łask.
Noah Clark

szeregowych można również sformatować w środku begin..endzaraz po private. Wtedy wcięcie może być ustawione automatycznie przez edytor, ponieważ kod wewnątrz elementu beginjest (w powyższym przykładzie) wcięty semantycznie z 4 spacjami.
Petrus Repo

Podążam za tym samym podejściem ... najpierw, publica potemprivate
Rahul Goyal

1
Nigdy tego nie widziałem i pracuję z Rubim od 2007 roku. Generalnie nie polecałbym tego.
Marnen Laibow-Koser

15

Myślę, że metody publiczne są pewnego rodzaju interfejsem obiektu i logiczne jest umieszczenie ich w najbardziej widocznym miejscu, tj. Na górze pliku.


5
Tak, umieść metody publiczne tam, gdzie najprawdopodobniej je znajdziesz, na ogół w górnej części pliku, a rzeczy, na które prawdopodobnie nie powinieneś patrzeć, powinny być zakopane na dole. Tak jak pisze się artykuł w gazecie, najważniejsze rzeczy postaw na pierwszym miejscu.
tadman

14

Nie musisz umieszczać publicani privatepowyżej każdej metody. Zwykle wszystkie moje metody prywatne umieszczam na końcu moich zajęć. Nie musisz też wyraźnie mówić, publicponieważ metody są domyślnie publiczne. Na przykład:

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

Przeczytaj ponownie moje pytanie. Zredagowałem to bardziej szczegółowo
ZX12R

1
To bardziej konwencja niż cokolwiek innego. To, co robisz, jest słuszne i jeśli ma to dla ciebie większy sens, powinieneś się tego trzymać. Uważam, że konwencja jest bardziej czytelna, ale to prawdopodobnie dlatego, że tak nauczyłem się ją pisać, więc jestem do tego przyzwyczajony.
Kyle Decot

co właściwie oznacza / robisz deklarowanie metody jako „publicznej”?
ZX12R

6

Pochodzę z tła Java i nienawidzę przewijania, aby zobaczyć typ metody. Myślę, że to szaleństwo, że nie można określić widoczności poszczególnych metod bez brzydoty. Skończyło się na umieszczeniu komentarza #privateprzed każdą metodą ssania, a następnie zadeklarowaniu private :....


1
a niedawny rubin może po prostu powiedzieć, private def method...że jest ładniejszy
akostadinov

5

Nie podoba mi się konieczność określania publicznego lub prywatnego dla każdej metody. Umieszczenie wszystkich metod prywatnych na dole pozwala mi mieć pojedyncze wystąpienie „prywatnego” na plik. Myślę, że to kwestia gustu.


5

Jeden styl polega na grupowaniu metod razem, tak aby można było używać tylko privatei protectedmaksymalnie raz na klasę. Innym stylem jest określenie widoczności zaraz po definicji metody:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

Począwszy od Ruby 2.1.0 defzwraca nazwę metody jako symbol, więc możliwy jest bardziej uproszczony styl:

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

(Zauważ, że używamy private_class_methoddla metod klasowych - w przeciwnym razie otrzymalibyśmy NameError: undefined methododprivate oczekuje metody instancji. Nawet jeśli używamy jej jako makra, jak w oryginalnym przykładzie, wpływa to tylko na widoczność metod instancji.)

Najbardziej podoba mi się ten styl widoczności w wierszu, ponieważ pozwala on na dowolną organizację metod. Zmniejsza ryzyko dodania nowej metody w niewłaściwym miejscu i nieumyślnego uczynienia jej prywatną.

Jeśli chodzi o składnię metody klas, możesz to obsłużyć w ten sposób:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

jest to jedyne miejsce, w którym wspominałem wcześniej o private_class_methodwezwaniu, a ostatnia część dotycząca używania class << selfbloku, aby uniknąć konieczności korzystania z niego, to dobra wskazówka. Do tej pory nie wiedziałem, że metody klasy „nornal” (zadeklarowane za pomocą def self.foo; endzamiast class << self; def foo; endnie będą miały wpływu na privatespecyfikator.
manroe

3

Dennis miał idealną odpowiedź, to znaczy, używając ruby> = 2.1, po prostu przedrostek def z private (lub protected, public)

Ale uważam, że teraz można również używać prywatnego jako bloku, jak w:

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0

Generalnie moje metody zamawiam w następujący sposób:

  1. Konstruktor
  2. Inne metody publiczne, w porządku alfabetycznym
  3. private, napisane tylko raz
  4. Metody prywatne w kolejności alfabetycznej

Używam funkcji „przejdź do definicji” w moim edytorze, aby nie wymagało to dużego przewijania. W każdym razie, jeśli klasa jest na tyle duża, że ​​przewijanie staje się problematyczne, prawdopodobnie należy ją podzielić na kilka klas.


Powinienem również wspomnieć, że zwykle umieszczam metody konwersji (takie jak to_s) pod koniec sekcji publicznej.
Marnen Laibow-Koser
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.