Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?
@hp0me

Objective-Cのメッセージが「変」な理由

More than 5 years have passed since last update.

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 = 委任、派遣)」も概念的に納得いく部分があります。

誰かからメッセージが来たとして、その部分は何かに委託していたらそこにお願いするっていうことです。

確定申告の時に、税務署から連絡(メッセージ)が来たらその部分は税理士に委託(デリゲート)すれば良いんですね。

10
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hp0me
スマートフォンゲームがメインですが、最近は雑食になってきました。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
10
Help us understand the problem. What is going on with this article?