感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

【デザインパターン】シングルトン(Singleton)のサンプル。

スポンサーリンク

シングルトンって何?

シングルトン(Singleton)とは、「唯一を保証する」ものだ。
Singletonの単語の意味は。「一枚札」「1つずつ起こるもの」という意味だ。

あるクラスのあるインスタンスが1つだけあって、数多くの他のコードがそのインスタンスにアクセスする必要があるときに、そのオブジェクトの1つのメソッドを他へと持ちまわるのは間抜けだ。
そういうときこそ、シングルトンを使うべしとGoFは勧める。

・・・と、書籍の言葉どおり紹介しても腹に落ちないから、もう少し説明を試みる。
Singletonパターンは、要は生成するオブジェクトの数を1つに制限するためのパターンである。
GoFでの定義は、

あるクラスに対して、インスタンスが1つしか存在しないことを保証し、それにアクセスするためのグローバルな方法を提供する。

となっている。

開発者が「newを無闇に使わない」などというルールを守るのではなく、仕様として保証するのがSingletonだ。

RubyでSingletonの例

class Logger
  attr_accessor :level
  ERROR = 1
  WARNING = 2
  INFO = 3

  def initialize
    @log = File.open("log.txt","w")
    @level = WARNING
  end

  def error(msg)
    @log.puts(msg)
    @log.flush
  end

  def warning(msg)
    @log.puts(msg) if @level >= WARNING
    @log.flush
  end

  def info(msg)
    @log.puts(msg) if @level >= INFO
    @log.flush
  end

  #シングルトン用のインスタンス
  @@instance = Logger.new
  #「それにアクセスするためのグローバルな方法を提供する」
  def self.instance
    return @@instance
  end

  #Loggerのnewメソッドをプライベートにする
  #「インスタンスが1つしか存在しないことを保証」するため
  private_class_method :new

end

#private method `new' called for Logger:Class (NoMethodError)というエラーが出る
#logger = Logger.new
logger = Logger.instance
logger.level = Logger::ERROR
logger.info('ロガーのテスト!(INFO)')
logger.warning('ロガーのテスト!(WARNING)')
logger.error('ロガーのテスト!(ERROR)')

結果、log.txtに

ロガーのテスト!(ERROR)

と出力される。

ものすごく参考にした本

Rubyによるデザインパターン

Rubyによるデザインパターン


RubyGoFを解説している唯一の本(自分が買った当時)だと思う。
GoFのパターンをRubyのサンプルで解説してくれる良書。
いつも読み回している。

感謝のプログラミング

今回で感謝のプログラミングは【620時間目】
10000時間まで、あと【9380時間】