23752


## 前置き(クラス変数 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)](https://i.stack.imgur.com/9dchh.png)

調べてみると

  * <https://stackoverflow.com/a/10614333/1979953>
  * [これはMUST！ActiveSupport の Class#class_attribute を使おう！ - Qiita](http://qiita.com/cuzic/items/ffd115f1e17458020b1b)

上記記事などを発見しました。  
簡単にまとめると、`クラス変数`では`継承`した場合に`クラス変数`を共有しており自然ではないので共有しない`class_attribute`を使おうということのようです。

## クラス変数 vs class_attribute vs cattr_accessor

`クラス変数`と`class_attribute`の違いはわかりましたが  
[Coderwall | `cattr_accessor` vs
`class_attribute`](https://coderwall.com/p/xhcmbg/cattr_accessor-vs-
class_attribute)  
を読む限り`クラス変数`と`cattr_accessor`の挙動（`親クラス`の`クラス変数`を共有している）で同じように思います。

わざわざ何故`cattr_accessor`が存在するのでしょうか？


CC BY-SA 3.0
2016-04-05T01:54:34.183
23750
2016-04-05T02:39:57.927
2017-05-23T12:38:56.083
-1
9008
question
ruby-on-rails ruby
クラス変数とcattr_accessorの違いは？


Rubyのインスタンス変数`@fuga`はクラスとそのサブクラス以外からはアクセスできませんので、そのインスタンス変数をクラスの外から使えるようにしたい場合、`attr_accessor`などを使ってアクセッサーメソッドを定義するかと思います。

`cattr_accessor`はそのクラス変数版ですね。`@@hoge`と言うクラス変数にはクラスの外からアクセスできないので、(必要であれば)`cattr_accessor`などを使ってアクセッサーメソッドを定義してやることになります。

と言うわけで`cattr_accessor`は、「クラス外からクラス変数にアクセスするために必要なアクセッサーメソッドをお手軽に定義するために存在する」と言うことになります。

[code]

      cattr_accessor :hoge
    
[/code]

と書くのは、

[code]

      def self.hoge
        @@hoge
      end
      def self.hoge=(value)
        @@hoge = value
      end
    
[/code]

なんて書いているのと同じことです。もちろん単に「クラス変数にアクセスするためのメソッドを定義しているだけ」なので、クラス変数を使うべきでない場合にはcattr_accessorで定義したアクセッサーメソッドも使うべきではありません。

で、「なんでbad code
styleだと言われているクラス変数に簡単にアクセッサーメソッドを定義できるようにしてあるんだ」と問われると、`cattr_accessor`を作った人に聞かなきゃわからないというのが正直なところですが、「うまく使えば必ずしもbadとは言えないんでないの?」と言う思いが何かしらあるのかもしれません。


CC BY-SA 3.0
2016-04-05T02:39:57.927
23752
2016-04-05T02:39:57.927
13972
23750
answer