Swift流行ってますが、個人的には、逆にだからこそObjective-C再考モードです。
Objective-Cを触ってると、よく以下のような文がでてきます。
初めてだと戸惑います。「変だな」と思いましたね。
[self.view endEditing:YES];
これ、JavaScriptなどで書くと
this.view.endEditing = true;
あるいは
this.view.setEndEditing(true);
こんなところでしょうか。
これ、ただ見にくいだけという訳ではないだろうと思ったんです。
プログラミング言語の「やりにくい」ってところには大体理由があって、ただ暗記しただけなら要らないだろって思っちゃいがちですよね。分からないなりにちょっと哲学的に考えた方が面白いです。CのポインタとかJSのクロージャとか。これもそういった類の概念です。
この違いですが、Objective-Cのメッセージでは、より「オブジェクトにメッセージを伝える感じ」を出したいという発想からきているようです。
さらにこじつけると、Objective-Cの[ ]はセリフの「」だと言えます。(←)
つまり先ほどの例だと自分自身のviewに、独り言で「endEditing:YES!!」と言葉で言っているような感じになります。 変態ですね。
そして先ほどのJSの例を極端に言うと、
「自分自身のviewのendEditingという変数にtrueを代入する。」
「自分自身のviewのsetEndEditing関数にtrueをぶち込んで実行」
こういう風に味気なくなりがちな部分を解消する意味合いをObjective-Cのメッセージングでは感じ取れます。(肯定的に言うと)
###実はObjective-Cの方が可読性が高い(!?)
英語は左から読むと分かりやすい言語って言われます。
Objective-Cも同様に
「左から読んだ時に、[ ← が出てきたらオブジェクトに何らかのメッセージを送っているように読む」
それに対してJSなど
「左から読んで、 . ←があったらプロパティなのかメソッドなのか意識する」
こういう意味ではObjective-Cの方が可読性が高いと言えますね。
まぁ、そこまでして形式が違うのは逆に不便では?と思うこともありますが、可読性を見るとObjective-Cの方が高いとも言えます。実際慣れたら高いかも。
###面白い書き方
ここでObjective-Cのメッセージを便利に活用しているコードがありましたので引用させていただきます。
「ラベル」と「メッセージ」が活き活きしている例です。
第一引数と関数名をミックスして、第二引数と統一させてます。
- (void)setWidth:(int)argWidth
height:(int)argHeight
depth:(int)argDepth;
//↓メソッドの実行例
[test setWidth:5 height:6 depth:7];
Javaが味気なく見えますね。(同じ内容のコード)
public void setSize(int w, int h, int d) {
// ....
}
// メソッドの実行
test.setSize(5, 6, 7);
###一般的に言われていること
Objective-Cのメッセージはいわゆる「メソッド」ではないため、該当するメソッドがなくても警告だけが出てエラーが出ないという話がありました。
でも試してみたけどエラーで出来なかったyo...
ここは今どうなんでしょう・・・
これはあんまり考えないほうが良さそうです。だって存在しないメソッドを呼びたくないじゃないですか?w
ちなみに、UnityのSendMessage()はエラー出ないですね。
###ここで「デリゲート」を考えてみよう
メッセージを考えてみると、よく分かりにくかった「デリゲート (delegate = 委任、派遣)」も概念的に納得いく部分があります。
誰かからメッセージが来たとして、その部分は何かに委託していたらそこにお願いするっていうことです。
確定申告の時に、税務署から連絡(メッセージ)が来たらその部分は税理士に委託(デリゲート)すれば良いんですね。