怒りのプログラミング

こんなポンコツがプログラマとして生活していることに驚きを禁じえません。 *ご指摘等あればお気軽にコメントください

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も割りと略さない主義だよね。Javaも好き。

@property, @synthesize

なぜJavaでは採用されなかったのかな?C#にはある。

Xcodeのテスティングフレームワークのとっつきやすさ

なんのプラグインeclipseの話。Xcodeにはそもそもプラグインがあるのか?)もライブラリも追加せず、プロジェクトを作るといきなりテストが書けるのが良いと思う。ありがたい。すぐサボるので、ユニットテストを積極的に書いていきたい。


また今度追記しよう。コードもメモっておきたい。

あと、テストについては色々思うことがあるなあ。いろんな人の意見を吸収しながら自分なりの考えを持っておきたい。

編集:

2/5 メソッドオーバーロードについて追加。書こうと思って忘れてました。 2/23 ジェネリクスのところを編集。