Próbuję napisać najbezpieczniejsze singleton w Ruby, że mogę. Jestem nowy w języku, który jest tak elastyczny, że nie mam silnego wrażenia, że moja klasa singletona odniesie sukces w tworzeniu tylko jednej instancji. Jako bonus chciałbym, aby obiekt stał się instancją tylko wtedy, gdy jest naprawdę używany.Jaki jest poprawny sposób zapisu wzorca singleton w Ruby?
Odpowiedz
# require singleton lib
require 'singleton'
class AppConfig
# mixin the singleton module
include Singleton
# do the actual app configuration
def load_config(file)
# do your work here
puts "Application configuration file was loaded from file: #{file}"
end
end
conf1 = AppConfig.instance
conf1.load_config "/home/khelll/conf.yml"
#=>Application configuration file was loaded from file: /home/khelll/conf.yml
conf2 = AppConfig.instance
puts conf1 == conf2
#=>true
# notice the following 2 lines won’t work
AppConfig.new rescue(puts $!)
#=> new method is private
# dup won’t work
conf1.dup rescue(puts $!)
#=>private method `new’ called for AppConfig:Class
#=>can’t dup instance of singleton AppConfig
Co robi rubin, gdy w klasie znajduje się moduł singleton?
- Powoduje, że metoda
new
jest prywatna, więc nie można z niej korzystać. - Dodaje metody klasy o nazwie instancji, który tworzy wystąpienie tylko jedną instancję klasy.
więc użyć modułu Ruby singleton potrzebne są dwie rzeczy:
- wymagają lib
singleton
następnie umieścić go wewnątrz żądanej klasy. - Użyj metody
instance
uzyskać instancję trzeba.
require 'singleton'
class Klass
include Singleton
# ...
end
Zobacz Ruby Standard LibrarySingleton class documention o wyjaśnienia.
Jeśli chcesz utworzyć singleton, po co tworzyć klasę? Po prostu utwórz obiekt i dodaj do niego odpowiednie metody i zmienne instancji.
>> MySingleton = Object.new
=> #<Object:0x100390318>
>> MySingleton.instance_eval do
?> @count = 0
>> def next
>> @count += 1
>> end
>> end
=> nil
>> MySingleton.next
=> 1
>> MySingleton.next
=> 2
>> MySingleton.next
=> 3
bardziej standardowy sposób, że ludzie wdrożenia tego wzoru jest użycie Module
jako singleton obiektu (zamiast bardziej ogólny Object
):
>> module OtherSingleton
>> @index = -1
>> @colors = %w{ red green blue }
>> def self.change
>> @colors[(@index += 1) % @colors.size]
>> end
>> end
=> nil
>> OtherSingleton.change
=> "red"
>> OtherSingleton.change
=> "green"
>> OtherSingleton.change
=> "blue"
>> OtherSingleton.change
=> "red"
Jeśli chciał swoją singleton obiektu do dziedziczenia z jakąś klasę, po prostu uczyń ją instancją tej klasy. Aby odziedziczyć po mixinie, po prostu użyj #extend
. Jeśli chcesz obiekt singleton, ruby czyni go naprawdę łatwym, i w przeciwieństwie do innych języków, nie musi być zdefiniowany w klasie.
Ad-hoc singletons (mój pierwszy przykład) są wszędzie, a pokrycie większości przypadków, z jaką się spotkałem. Podejście modułowe zwykle obejmuje resztę (kiedy chcę czegoś bardziej formalnego).
Kod Rubiego powinien (imho) używać typowania kaczego (przez #respond_to?
) zamiast jawnie sprawdzać klasę obiektu, więc normalnie nie dbam o wyjątkowość klasy moich obiektów singleton, ponieważ to nie jest jej klasa, która sprawia, że wyjątkowy, ale wszystko, co dodałem po.
- 1. Jaki jest najlepszy sposób zapisu do pliku w Ruby?
- 2. Jaki jest poprawny sposób zamknięcia połączenia TCP?
- 3. Jaki jest poprawny sposób inicjowania wskaźnika wc?
- 4. Jaki jest poprawny sposób udokumentowania parametru ** kwargs?
- 5. W jaki sposób singleton jest javax.ejb.Singleton w środowisku klastrowym?
- 6. Jaki jest poprawny sposób użycia pagera w paginacji w Symfony2
- 7. Jaki jest poprawny sposób odczytu z NetworkStream w .NET
- 8. Jaki jest poprawny sposób sprawdzenia istnienia zagnieżdżonego atrybutu w Chef?
- 9. Jaki jest poprawny sposób połączenia połączeń asynchronicznych w javascript?
- 10. Jaki jest poprawny sposób korzystania z bitfields w C?
- 11. Jaki jest poprawny sposób wiązania właściwości taskid w działaniu replikatora?
- 12. Jaki jest poprawny sposób tworzenia tablicy asocjacyjnej w VB.NET?
- 13. Jaki jest poprawny sposób aktualizowania ContentItem w Orchard?
- 14. Jaki jest najbardziej elegancki sposób zapisu tej pętli w Pythonie?
- 15. Jaki jest najprostszy sposób zapisu na stdout w trybie binarnym?
- 16. Jaki jest poprawny sposób na ucieczkę ciąg dla łącza mailto
- 17. Jaki jest poprawny sposób instalowania jdk na Linuksie
- 18. Jaki jest poprawny sposób na dodanie bootstrap do aplikacji symfony?
- 19. Jaki jest "poprawny" sposób przechowywania natywnego wskaźnika wewnątrz obiektu Java?
- 20. Jaki jest poprawny sposób reprezentowania pustych elementów XML?
- 21. Jaki jest poprawny sposób dołączania nagłówka autoryzacji do żądania Ajax?
- 22. Jaki jest poprawny sposób uaktualnienia pakietów APT za pomocą Ansible?
- 23. Jaki jest poprawny sposób wymuszania ograniczeń na wartości klas przypadków?
- 24. Jaki jest poprawny sposób zmiany przestrzeni nazw formularza WinForm?
- 25. Jaki jest poprawny sposób zainstalowania wtyczki Grails z pliku zip?
- 26. Jaki jest poprawny sposób wdrożenia porównania dla klasy bazowej?
- 27. jaki jest poprawny sposób wstawiania etykiety na liście Ionic FAB
- 28. inicjowanie ruby singleton
- 29. Jaki jest poprawny sposób używania maxAge z Express.js?
- 30. Jaki jest poprawny sposób inicjowania tablicy elementów z listą inicjalizatora?
+1 za wskazanie, że pojedyncza nie jest naprawdę potrzebne. Możesz zrealizować intencję bez niewolniczo kopiowania wzorca. –
Ciężko o tym myślałem, ponieważ kwestionuje to samo istnienie modułu Singleton w rdzeniu rubinowym. Potencjalna użyteczność klasy w/Singleton mixin uderza mnie podwójnie: 1) jeśli chcesz mieć dwie metody klasy i instancji oraz 2) jeśli masz skomplikowaną inicjalizację, którą chcesz uruchomić leniwie, bez konieczności stosowania metod modułu, aby jakoś wyzwolić go jawnie po raz pierwszy są dostępne. Czy ktokolwiek inny ma jakieś zalety rzeczywistego modułu Singleton? – gtd