質問: 前置き(クラス変数 vs class_attribute) ------------------------------ Railsで`クラス変数`(`@@hoge`)を使うと、RubyMineが > > Using of class variables in Ruby is considered to be a bad code style. > > > と警告を出しました。 ![画像の説明をここに入力](https://i.stack.imgur.com/9dchh.png) 調べてみると * * これはMUST!ActiveSupport の Class#class_attribute を使おう! - Qiita 上記記事などを発見しました。 簡単にまとめると、`クラス変数`では`継承`した場合に`クラス変数`を共有しており自然ではないので共有しない`class_attribute`を使おうということのようです。 クラス変数 vs class_attribute vs cattr_accessor -------------------------------------------- `クラス変数`と`class_attribute`の違いはわかりましたが Coderwall | `cattr_accessor` vs `class_attribute` を読む限り`クラス変数`と`cattr_accessor`の挙動(`親クラス`の`クラス変数`を共有している)で同じように思います。 わざわざ何故`cattr_accessor`が存在するのでしょうか?
回答: Rubyのインスタンス変数`@fuga`はクラスとそのサブクラス以外からはアクセスできませんので、そのインスタンス変数をクラスの外から使えるようにしたい場合、`attr_accessor`などを使ってアクセッサーメソッドを定義するかと思います。 `cattr_accessor`はそのクラス変数版ですね。`@@hoge`と言うクラス変数にはクラスの外からアクセスできないので、(必要であれば)`cattr_accessor`などを使ってアクセッサーメソッドを定義してやることになります。 と言うわけで`cattr_accessor`は、「クラス外からクラス変数にアクセスするために必要なアクセッサーメソッドをお手軽に定義するために存在する」と言うことになります。 ``` cattr_accessor :hoge ``` と書くのは、 ``` def self.hoge @@hoge end def self.hoge=(value) @@hoge = value end ``` なんて書いているのと同じことです。もちろん単に「クラス変数にアクセスするためのメソッドを定義しているだけ」なので、クラス変数を使うべきでない場合にはcattr_accessorで定義したアクセッサーメソッドも使うべきではありません。 で、「なんでbad code styleだと言われているクラス変数に簡単にアクセッサーメソッドを定義できるようにしてあるんだ」と問われると、`cattr_accessor`を作った人に聞かなきゃわからないというのが正直なところですが、「うまく使えば必ずしもbadとは言えないんでないの?」と言う思いが何かしらあるのかもしれません。