Javaと比べたときのObjective-Cの感想
今はMac OS Xのアプリを作っています。
Objective-Cを勉強し始めて2ヶ月ほど経ちました。ここまでの理解のところで、Androidアプリの開発で使っていたJavaと比べて受けた印象を書いておきます。勘違いしているところがあるかもしれないけど、今後理解が進むとうれしい。
気に入らないところ
抽象クラスがない
@protocolを使って、Javaのinterface相当なものができるけど、Javaのabstract相当の機能はない。 クラスの継承はできるけど、スーパークラスのメソッドの実装の強制ができない。
Javaの例外相当の機能が(実質的に)ない
NSExceptionクラスがJavaのException相当、かと思ったけど、JavaのExceptionとObjective-CのNSExceptionは使い方が違う。
ファイルの入出力の失敗、通信の失敗、とかにはNSException(@try-@catch-@finally)を使ってはいけない。
じゃあどう書くのかっていうとNSErrorクラスになるみたいだけど、NSErrorのポインタを用意して、エラーが発生する可能性があるメソッドに渡して、メソッドが返すNSErrorのインスタンスでエラーを確認、って流れがなんか面倒。言語で例外を扱う機構が無いと、なんだか記述が統一されなくて気持ち悪い気がする。
じゃあじゃあ、もうgoto文でいいのかな、とも思っちゃう。これどうすべきなんだろう。みんなきっちりNSErrorで処理してんのかな。
ジェネリクスがない
やっぱり怖いよね、これは。ジェネリクスが無い頃のJavaを知らないけど、絶対あったほうがいいよなあ…
と言っていたが、会社の先輩と話したところJavaが型に厳格なのに対し、Objective-Cは動的な型づけだからジェネリクスという考え方が要らない(たしか。細かい話は覚えてないです)という話だった。まあ、ジェネリクスって型をパラメータで扱えるようにして、型を決定するタイミングを遅らせることで型でガチガチだったクラスやメソッドがもうちょっと柔軟に書けるよ、という話だと思ってるので、最初からルーズなObjective-Cにはそもそも関係ない概念ということ?Objective-Cの型システム(というか、それを利用するCocoaフレームワーク)についてもっと勉強しないと理解できない話だと思った。もっと勉強しよう。
namespaceがない
これは正しいよね?そもそもJavaもnamespaceではなくてパッケージだけど、Objective-Cにはそれすらない。だからNS...のような命名規則が要るんだよね?
メソッドのオーバーロードがない
ラベル名が違うと異なるメソッドとして扱えますが、第一引数にはラベル名が付けられないので無理です。
nilにメッセージ送信するとnilが返ってくる
気に入っているところ
メソッドの命名規則
無駄に長くなるという意見をよく見かけるけど、僕は英単語が略されていると気持ち悪いので、なるべく略さず書く、という流儀はうれしい。
と思ったけどJavaも割りと略さない主義だよね。Javaも好き。
@property, @synthesize
Xcodeのテスティングフレームワークのとっつきやすさ
なんのプラグイン(eclipseの話。Xcodeにはそもそもプラグインがあるのか?)もライブラリも追加せず、プロジェクトを作るといきなりテストが書けるのが良いと思う。ありがたい。すぐサボるので、ユニットテストを積極的に書いていきたい。
また今度追記しよう。コードもメモっておきたい。
あと、テストについては色々思うことがあるなあ。いろんな人の意見を吸収しながら自分なりの考えを持っておきたい。
編集: