現在このようなクラスがあります。

```

    class Hoge
      attr_accessor :fuga, :piyo
    
      def initialize
        data_create
      end
    
      def data_create
        data = 色々な処理{...}
    
        # インスタンス変数に代入
        @fuga = data[:a]
        @piyo = data[:b]
      end
    end
    
    # 使う時
    hoge = Hoge.new
    hoge.hufa
    hoge.piyo
    
```

`Hoge#datacreate`は実際には`http`経由で情報を取得してきたり、変換処理を行ったりしていて多少時間がかかってしまうものです。  
そのため、インスタンスを生成する度にオーバーヘッドのコストがかかってしまいます。

Hogeクラスを使う時に必ず`@fuga`や`@piyo`を使うわけではないので、初めて参照されたタイミングでデータを作るようにすればいいと思いつきました。

具体的には以下のようなコードです。

```

    class Hoge
      @fuga = nil
      @piyo = nil
    
      def fuga
        data_create if @fuga.nil?
    
        @fuga
      end
    
      def piyo
        data_create if @piyo.nil?
    
        @piyo
      end
    
    
      def data_create
        data = 色々な処理{...}
    
        # インスタンス変数に代入
        @fuga = data[:a]
        @piyo = data[:b]
      end
    end
    
    
    # 使う時
    hoge = Hoge.new
    hoge.hufa
    hoge.piyo
    
```

まだプログラミングの経験が浅いため、このやり方が良い方法である自信がありません。  
気をつけたほうがいい部分などがあれば、教えていただけないでしょうか。

みなさんの「自分だったらこうする」というアイディアなどもドンドンお聞かせください。

また、rubyらしく工夫できる書き方などもあれば教えて下さい。  
よろしくお願いします。
CC BY-SA 3.0
2016-06-18T16:38:28.513
26836
2016-06-18T17:01:24.023
2016-06-18T16:48:04.107
9149
9149
question
ruby-on-rails ruby
rubyで生成に時間のかかるattrの実装の仕方
`data`がどのような情報なのかわからないので見当違いになっているかもしれませんが、  
私ならこんな感じに書きます。

```

    class Hoge
      def fuga
        data[:a]
      end
    
      def piyo
        data[:b]
      end
    
      def data
        @data ||= 色々な処理{...}
      end
    end
    
```

メソッド`data`が参照された時にインスタンス変数の`@data`が`nil`であれば`色々な処理`が実行され、既に値が入っていれば`@data`がそのまま返されるのですぐに返ってきます。
CC BY-SA 3.0
2016-06-18T17:01:24.023
26838
2016-06-18T17:01:24.023
3271
26836
answer