Class method と Instance method について

アプリを作っていて、画面ごとに(というか ViewController ごとに)source が分かれるのですが、あ、この method 前の画面でも使ったなぁということがあります。今回遭遇したのは、field に数字を入力したら自動的にカンマをつける、データを保存するときは、カンマを取ってから保存するというような method が必要になりました。どちらの ViewController にも同じ method を定義してももちろんよいのですが、MyUtilities のようなClass を新設し、そこに書いたほうが将来の保守性はよい訳です。

というわけで、Class を新設して method を定義していったのですが、そういえば、Instance method と Class method があったなと。定義する時、頭が - なら Instance method で、+ なら Class method になります。この違いですが、O'reilly の本などを読んでも今ひとつピンとこないのですが、Class method の方が code を書く時に便利です。Instance method では次のようになります。

MyUtilities* hoge = [[MyUtilities alloc] init];

[hoge someMethod:variables];

これを Class method として定義してある場合は、インスタンスを生成する必要がないので、一行で書けてしまうと。

[MyUtilities someMethod:variables];

それで、Class method は一体何の役に立つのだ?ということなんですが、refactoring の時が一番メリットを感じます。例えば、同じ class 内に method を定義していて、この method を別の class に定義したとすると、code は次のように変更することになります。

変更前:[self someMethod:variables];

変更後:[SomeClass someMethod:variables];

つまり、self の部分だけ変えればよいのです。これが、instance method だった場合は、かなり面倒なことになります。

SomeClass* hoge = [[SomeClass alloc] init];

[hoge someMethod:variables];

一行では到底書けません。

実は、Class method の方が、定義する時にめんどくさいこともあったりするのですが、クラスのインスタンスを生成しなくてもよいのでコードを減らすことができる、あるいは refactoring の際に簡単に直せるというのが一番の利点なのかなと思いました。