Załóżmy, że klasa musi załadować bibliotekę zewnętrzną, która zajmuje trochę czasu, a zatem powinna zostać wczytana tylko raz. Dwoma naturalnymi rozwiązaniami byłoby użycie wzoru singleton lub monostatu. Czy jest jakieś korzyści dla któregoś z tych rozwiązań w tym konkretnym kontekście w Ruby?Singleton kontra Monostate Pattern in Ruby
Na przykład:
# Using a Singleton class
require 'singleton'
class Parser
include Singleton
def initialize
@parser = load_external_library
end
def parse(sentence)
@parser.parse(sentence)
end
end
# Then calling using...
Parser.instance.parse(sentence)
Versus:
# Using a Monostate class
class Parser
def self.parse(sentence)
@@parser ||= load_external_library
@@parser.parse(sentence)
end
end
# Then calling using...
Parser.parse(sentence)
Ponieważ druga składnia jest znacznie czystsze, czy są jakieś zalety korzystania z Singleton w Ruby?
Metoda 'require' ładuje bibliotekę i zapobiega jej ładowaniu więcej niż jeden raz. – steenslag
Odnosiłem się konkretnie do biblioteki nie-Ruby, której nie można obsłużyć po prostu wymaganiem, chociaż twoja sugestia wskazywałaby na trzeci sposób osiągnięcia tego samego: 'Parser klasy; @@ parser = load_external_library; def self.parse (zdanie); @@ parser.parse (zdanie); koniec; end' ... następnie w innym pliku 'require 'parser''. Wydaje się to podobne do monostatu, ale kod użytkownika jest teraz odpowiedzialny za żądanie tylko raz, co może być [trudniejsze niż oczekiwano] (http://ghouston.blogspot.com/2007/05/ruby-require-idiom.html). jakieś pomysły? – user2398029