Ruby Private & Protected Methods: Understanding method Visibility

co to jest prywatna metoda w Ruby?

jest to rodzaj metody, którą można wywołać tylko z poziomu klasy, w której jest zdefiniowana.

pozwala to kontrolować dostęp do metod.

metoda Ruby może być:

  • prywatne
  • publiczne (domyślnie)
  • chronione

domyślnie wszystkie Twoje metody są public.

każdy może z nich skorzystać!

ale możesz to zmienić, wykonując metodę privatelub protected.

dlaczego jest to przydatne?

ponieważ możesz ułatwić zmianę tych metod.

wyobraź sobie, że piszesz bibliotekę kodu, która będzie używana w kilku różnych projektach w pracy.

kiedy te projekty implementują Twoją bibliotekę, będą wywoływać metody w klasach, które utworzyłeś.

teraz:

wydajesz nową wersję…

ale zdecydowałeś się zmienić nazwę na public metodzie.

to spowoduje błędy w każdym projekcie, który używa tej metody!

Zapamiętaj to:

posiadając mniej publicznych metod zwiększasz swobodę zmian wewnątrz klasy.

zobaczmy kilka przykładów kodu!

zrozumienie prywatnych metod w Ruby

czy kiedykolwiek widziałeś komunikat o błędzie „private method called”?

ten:

self.puts 123# NoMethodError: private method `puts' called

następnie próbowano użyć metody private nieprawidłowo.

możesz używać tylko prywatnej metody.

przykład:

puts 123

to ta sama metoda, ale musisz to tak nazwać.

prywatne metody są zawsze wywoływane w kontekście self.

innymi słowy …

możesz używać tylko prywatnych metod z:

  • Inne metody z tej samej klasy
  • metody odziedziczone z klasy nadrzędnej
  • metody zawarte w module

oznacza to, że nie można wywoływać prywatnych metod spoza klasy, która je definiuje.

bo to wymagałoby „jawnego odbiornika”.

chyba że…

używasz metody takiej jak send, aby ominąć tę regułę.

send(:puts, "apple")

jak zdefiniować metodę private?

def bacon "private bacon"endprivate :bacon

samo słowo private nie jest słowem kluczowym, jest to metoda zdefiniowana w module Kernel.

gdzie umieścić swoje prywatne metody

to normalne, że klasa ma więcej niż jedną prywatną metodę.

gdzie umieszczacie te metody?

zrób to:

class Food def public_method end private def bacon end def orange end def coconut endend

każda metoda instancji po private staje się metodą prywatną.

możesz użyćprivate_class_method :method_namejeśli chcesz zdefiniować metodę klasy jako prywatną

jest to wspólny wzorzec, aby najpierw zdefiniować wszystkie Twoje publiczne metody, a następnie zdefiniować swoje private metody razem na końcu klasy.

publiczne metody

Public jest domyślną widocznością metody w Rubim.

oto przykład:

def orange "Vitamin C"end

jeśli masz obiekt food, który definiuje orange, możesz go tak nazwać:

food.orange

jeśli metoda została upubliczniona lub zabezpieczona, można ją ponownie upublicznić.

public :orange

co to jest metoda chroniona?

metody chronione są mniej powszechne.

są one jak metody private, ale można je wywołać na obiekcie & nie tylko bezpośrednio.

jeśli wypróbujesz ten przykład z prywatnym, otrzymasz błąd:

class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food

dostajesz błąd, ponieważ name byłby prywatny, więc nie możesz zrobić other.name.

ale z protected ten kod działa!

prywatne Vs chronione metody

to jest różnica, fakt, że protected zachowuje metodę private, ale pozwala również na wywołanie tej metody na obiekcie.

z prywatnym możesz zrobić tylko name, z chronionym możesz zrobić object.name.

kiedy należy używać protected?

tylko jeśli masz bardzo konkretny przypadek, jak metoda equals (==).

dokumentacja Rubiego zaleca użycie private zamiast protected, gdy tylko jest to możliwe.

i jest taka notka:

„chroniona metoda jest powolna, ponieważ nie może używać wbudowanej pamięci podręcznej.”

byłem ciekawy tego, więc sprawdziłem kilka benchmarków:

public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s

to różnica 8,5% w wydajności.

Video Tutorial

podsumowanie

nauczyłeś się o metodach Ruby visibility, public, private & chronionych. Nie są to słowa kluczowe Ruby, są to same metody zdefiniowane w klasie Module.



+