○○くんのそういうところあんまり好きじゃないな〜

自身の精神安定のために、たまに戯れ言を吐きます。
気を悪くする人がいたらごめんなさい。

Objective-Cの嫌いなところが3つあります。

1. それメソッドコールだから!

Objective-Cでは、メソッドコールのことをメッセージ送信といいます。私はあまり好きじゃないです。いや、むしろ嫌いです。これはSmalltalkからの伝統なんだと思いますが、それを引きずったObjective-Cの責任ということにしています。

wikiより】

Smalltalkにおいて、メッセージ、セレクター、メソッドはそれぞれ別物である。 C++系統の言語の様にオブジェクトに対しメッセージを送るという事は単なるメソッド呼び出しの比喩ではない。

いや、それメソッドコールだから!*1
SmalltalkObjective-Cしかやらないならその呼び方でもいいでしょう。しかし私はそれ以前にC++Javaを学んでいますし、その他の言語も使うことがあるのです。単に「メッセージ送信」と言われた場合、JMSのようなものを連想してしまいます。だから私はいつも、Objective-Cのメッセージ送信を表現するときに、(他の多くの言語でいうところのメソッドコール)という注釈を、毎回毎回書かなければならないのです。ああ面倒くさい。こういう風に新しい概念を持ち込むことは悪いことではないのでしょうが、用語の数が増えると、それだけ覚えなければならないことが増えてしまいますよね。いや、覚えること自体はまだいいんですけど、人との会話が通じにくくなることの方が問題です。こういう些細なことだって学習コストに影響するんじゃないかと思うのです。


2. 長い!

名前付きパラメータは分かりやすいという人が多いでしょうが、私は好きじゃありません。とにかく長くなるのが嫌なのです。

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

これでさえ、たった2個の引数ですよ?
この定義を見て長すぎると思わない人がいるのでしょうか。
英語圏の人々にとっては、「まるで英語の文章をそのまま書いているかのようでわかりやすい」そうです。私にとっては、母国語ではない文字の羅列が、他のプログラミング言語よりも増しているというだけで、それはいかにも苦痛です。

3. 入れ子入れ子

NSMutableArray* foo = [[[NSMutableArray alloc] init] autorelease];

これはまぁ、Cのスーパーセットであるからして、C構文との区別の上できっと仕方なかったのでしょうね。好みの問題なのでしょうが、私はこういうLisp形式の入れ子にした「メソッドコール!」よりも、C++形式のメソッドチェーンの方が好きです。Lispはその思想が「すべてのものがリストである」のだからして、まあ、納得いかんこともないです。

Javaくんかっこいい!

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();

実際のところは、このコードを考えたJoshua Blochがかっこいいというべき。


ああ、すっきりした。
それにしても嫌いなところがわずか3つしか出てこないなんて、自分では意外でした。私はC++の嫌いなところなら10個は挙げられますよ。でもそれは決してこういう場では書けません。世の中で一番敵に回しちゃいけないのがC++プログラマです。奴らを相手にすることの面倒臭さときたら

ああ、もう
やめておこう。

*1:あえて言うまでもないことでしょうが、厳密にはwikiの記述は正しいです。Smalltalkでは(Objective-Cでも)、メッセージに対してレシーバーがメソッドを持たない場合の挙動を制御することができるそうです。しかし、あえて、私はそれでも、メッセージ送信はメソッドコールと同義であると言いたい。