私は最近、昼間のお仕事ではObjective-Cをよく使っているが、この言語、さすがに元々の年代が古いというかあちこち微妙な部分があってイラっ☆とくることがよくある。とはいえ、Objective-Cに関してはまだまだ素人なので、熟練者からみればとんちんかんなことを言ってるかもしれないが、ツッコミを期待して書いてみる。
- nil に対するメッセージ送信が例外にならない
この仕様って、Objective-C以外でほとんど見かけたことがないのだけど、メリットに比べてデメリットが大き過ぎると思う。オブジェクトのメソッドチェインでこの仕様がたまに便利なことはあるけど、ほとんどの場合、バグが発現するタイミングが遅くなるだけに終わるというのが経験則。この辺、熟練のObjective-Cerはどう考えてるのか一度知りたいところ。
- メモリ安全ではない
ARCが入ってある程度マシになったものの、何故2012年の今、極端にリソースが制約されている環境でもないのに、メモリ安全ではないのか、とよく思う。出自とC言語とのcompatibilityを考えると仕方ないのかもしれないが、メモリ安全じゃない部分は明示的に切り分ける仕組みが欲しかった…
- メッセージ送信の構文が使いにくい
Objective-CはCにSmalltalkの構文を足して2で割らなかった言語、という冗談を先日言っていたのだが、はっきり言ってObjective-Cのメッセージ送信の構文は使いにくい。特に、メッセージ送信をチェインしようとすると、[]
の嵐になるのが読みにくい…。
[[recv method1] method2]
- Blocksの文法とObjective-Cの構文の相性が悪い(ように見える)
iOS4でBlocksが導入され、無名関数(のようなもの)が書けるようになったわけだが、Blocksの型の文法がCの関数ポインタ宣言の悪しき文法を思いっきり継承してるのと、メッセージ送信のコードが[]
の中に閉じ込められるせいで、Blocksを活用しても、微妙にすっきりしない。
[recv method:^() { }]; // 本当は // recv method:^() { // }; // のように書きたいが無理
- メソッド名の標準的な命名規約が長過ぎる
- その他色々
この辺が何故そうなったか、について、歴史的事情から理解できる点はあるのだけど、古い世代の言語を無理に拡張しても、色々綻びが出てるなあというのが正直な感想。