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 の際に簡単に直せるというのが一番の利点なのかなと思いました。