Чтобы избежать гниения ссылок, ниже публикуется сообщение в блоге Криса Ванстрата, на которое ссылается user83510 (с его разрешения). Тем не менее, ничто не сравнится с оригиналом, поэтому используйте его ссылку, пока она продолжает работать.
→ singletons 18 ноября 2008 Есть вещи, которых я просто не понимаю. Дэвид Боуи, например. Или Южное полушарие. Но ничто так не поражает меня, как синглтон Руби. Потому что на самом деле это совершенно не нужно.
Вот что они хотят, чтобы вы делали со своим кодом:
require 'net/http'
# first you setup your singleton
class Cheat
include Singleton
def initialize
@host = 'http://cheat.errtheblog.com/'
@http = Net::HTTP.start(URI.parse(@host).host)
end
def sheet(name)
@http.get("/s/#{name}").body
end
end
# then you use it
Cheat.instance.sheet 'migrations'
Cheat.instance.sheet 'yahoo_ceo'
Но это безумие. Бороться с властью.
require 'net/http'
# here's how we roll
module Cheat
extend self
def host
@host ||= 'http://cheat.errtheblog.com/'
end
def http
@http ||= Net::HTTP.start(URI.parse(host).host)
end
def sheet(name)
http.get("/s/#{name}").body
end
end
# then you use it
Cheat.sheet 'migrations'
Cheat.sheet 'singletons'
А почему бы и нет? API более лаконичен, код легче тестировать, имитировать и создавать заглушки, и его все еще очень просто преобразовать в подходящий класс, если возникнет такая необходимость.
((авторское право должно быть десять Крис Ванстрат))