Mam pytanie na dwie części
Najlepsze praktyki
- Mam algorytm, który wykonuje pewne operacje na strukturze danych przy użyciu interfejsu publicznego
- Obecnie jest to moduł z wieloma metodami statycznymi, wszystkie prywatne, z wyjątkiem jednej metody interfejsu publicznego.
- Istnieje jedna zmienna instancji, która musi być współużytkowana przez wszystkie metody.
Oto opcje, które widzę, które są najlepsze ?:
- Moduł z metodami statycznymi („moduł” w języku ruby)
- Zajęcia z metodami statycznymi
- Moduł Mixin do włączenia do struktury danych
- Zrefaktoryzuj część algorytmu, która modyfikuje tę strukturę danych (bardzo małą) i stwórz z niej mixin, który wywołuje statyczne metody modułu algorytmu
Część techniczna
Czy istnieje sposób na utworzenie prywatnej metody modułu ?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
Wydaje się, private
że tam nie ma żadnego efektu , nadal mogę dzwonić Thing.priv
bez problemu.
ruby
private-methods
access-specifier
Daniel Beardsley
źródło
źródło
private
wpływa tylko na metody instancji, nie na metody klas. użyjprivate_class_method
zamiast tego:module Thing; def self.pub; end; private_class_method :pub; end
Odpowiedzi:
Myślę, że najlepszym sposobem (a przede wszystkim sposobem pisania istniejących bibliotek) jest utworzenie w module klasy, która zajmuje się całą logiką, a moduł zapewnia tylko wygodną metodę, np.
źródło
perform
jest to metoda, która ma być tutaj prywatna, metoda prywatna jest metodą prywatną wTranslator
klasie (przykład @ ucron nie ma żadnej, co jest bardzo niefortunne).GTranslate.translate
jest tylko wygodną metodąGTranslate::Translator#perform
, nie ma żadnej realnej korzyści, by to ukryć, jeśli było to w ogóle możliwe.self.translate
deklaruje metodę klasy / modułu.GTranslate::Translator.new.perform(text)
- zawiłe, ale nie prywatne!Jest też coś
Module.private_class_method
, co prawdopodobnie wyraża więcej zamiarów.Dla kodu w pytaniu:
Ruby 2.1 lub nowszy:
źródło
private
?źródło
include Writer
opcji!Możesz użyć metody „dołączonej” do robienia wymyślnych rzeczy, gdy moduł jest wmieszany. Myślę, że to robi to, co chcesz:
źródło
included do |base| [...] end
zamiast defNiestety
private
dotyczy to tylko metod instancji. Ogólnym sposobem uzyskania prywatnych metod „statycznych” w klasie jest wykonanie czegoś takiego:Trzeba przyznać, że nie bawiłem się tym w modułach.
źródło
.foo
prywatną metody klasy: „prywatnym; def self.foo ()”private
iprivate_class_method
są własnościąModule
nieClass
. Ten kod działa nawiasem mówiąc i jest alternatywą dla używaniaprivate_class_method
.Tak wygląda fajny sposób
źródło
O co chodzi z przechowywaniem metod jako lambd w zmiennych / stałych klasach?
Do testu:
UPD: ogromna aktualizacja tego kodu po 6 latach pokazuje czystszy sposób zadeklarowania metody prywatnej
d
Tutaj widzimy, że:
1)
@@L
nie można uzyskać dostępu z zewnątrz, ale jest dostępny prawie z każdego miejsca2)
class << self ; private ; def
skutecznie sprawia, że metoda jestd
niedostępna z zewnątrz i od wewnątrz,self.
ale nie bez niej - to dziwne3)
private ; self.
iprivate ; class << self
nie czynią metod prywatnymi - są dostępne zarówno z I bezself.
źródło
Proc
, podczas gdy metody są typuMethod
.Utwórz moduł lub zajęcia prywatne
Stałe nigdy nie są prywatne. Możliwe jest jednak utworzenie modułu lub klasy bez przypisywania ich do stałej.
Więc alternatywą
:private_class_method
jest utworzenie prywatnego modułu lub klasy i zdefiniowanie w nim publicznych metod.Stosowanie:
Zobacz dokumentację dla Module.new i Class.new .
źródło
.self
definicji metod, uwzględnienie ich w innej klasie i użycie ich jako metod instance_metod klasy włączającej. Czy wiesz, czy jest jakiś sposób, aby to zadziałało?Ta metoda nie zezwala na udostępnianie danych metodom prywatnym, chyba że jawnie przekażesz dane za pomocą parametrów metody.
źródło