まず、Visual / Real Basicでプログラミングを開始し、次にJavaに移行したので、ドット構文にかなり慣れています。しかし、ようやくObjective-Cに移行して角かっこに慣れ、Objective-C 2.0とそのドット構文の導入を見て、本当に気に入らないことに気づきました。(他の言語の場合は問題ありません。それが彼らの転がり方だからです)。
Objective-Cにはドット構文の3つの主要な牛肉があります。
ビーフ#1:エラーが発生する理由が不明確になります。たとえば、次の行がある場合:
something.frame.origin.x = 42;
次に、something
はオブジェクトであり、オブジェクトの構造体を式の左辺値として使用できないため、コンパイラエラーが発生します。しかし、私が持っている場合:
something.frame.origin.x = 42;
something
はNSRectメンバーを持つ構造体自体であり、左辺値として使用できるため、これは問題なくコンパイルされます。
このコードを採用する場合、何であるかを理解するために時間を費やす必要がありsomething
ます。構造体ですか?オブジェクトですか?ただし、角かっこ構文を使用すると、はるかに明確になります。
[something setFrame:newFrame];
この場合、がsomething
オブジェクトであるかどうかにかかわらず、あいまいさはまったくありません。あいまいさの導入は私の牛肉#1です。
Beef#2: Cでは、ドット構文は、メソッドを呼び出すのではなく、構造体のメンバーにアクセスするために使用されます。プログラマーは、オブジェクトのメソッドsetFoo:
とfoo
メソッドをオーバーライドできますが、それでもsomething.foo
。を介してそれらにアクセスできます。私の考えでは、ドット構文を使用した式を見ると、それらはivarへの単純な割り当てであると期待しています。 これは常に当てはまるわけではありません。 配列とテーブルビューを仲介するコントローラーオブジェクトについて考えてみます。を呼び出すとmyController.contentArray = newArray;
、古い配列が新しい配列に置き換えられると思います。ただし、元のプログラマーはsetContentArray:
、配列を設定するだけでなく、テーブルビューを再ロードするようにオーバーライドした可能性があります。ラインから、その振る舞いの兆候はありません。私が見たら[myController setContentArray:newArray];
、そして私は「ああ、メソッド。私はそれが何をしているのかを確実に知るために、このメソッドの定義を見に行く必要がある」と思うでしょう。
ですから、私のビーフ#2の要約は、カスタムコードでドット構文の意味をオーバーライドできるということだと思います。
牛肉#3:見た目が悪いと思います。Objective-Cプログラマーとして、私は完全に括弧で囲むことに慣れているので、美しい括弧の行や行を読んで見て、突然foo.name = newName; foo.size = newSize;
などで壊されるのは少し気が散ります。ドット構文(C構造体)が必要なものがあることに気づきましたが、それを使用するのはそれだけです。
もちろん、自分でコードを書いている場合は、使い慣れたものを使用してください。しかし、オープンソースを計画しているコードを書いている場合、または永久に維持することを期待していないものを書いている場合は、ブラケット構文を使用することを強くお勧めします。もちろん、これは私の意見です。
ドット構文に対する最近のブログ投稿:http://weblog.bignerdranch.com/?p = 83
上記の投稿への反論:http://eschatologist.net/blog/?p = 226(ドット構文を支持する元の記事:http://eschatologist.net/blog/?p = 160)