コーディングルールと必要悪

まだ学習を初めて1ヶ月も経たないが、Objective-Cは柔軟性、拡張性に富んだその素晴らしい機能と裏腹に、間違いやすくコーディングによるバグを内包しやすい言語とは思う。(それを上手く使うのもプログラマの仕事である)

    • C言語の語彙でプログラムを書くことができてしまう
    • オブジェクトとメッセージの解決に遅延バインディングを使う
    • オブジェクトのメモリ管理はプログラマの責任に任されている※
    • nilに対するメッセージ送信が例外を伴わない
    • 型をチェックする仕組みが緩い(コンパイルエラーが起きない)

特に衝撃を受けたのは、(メッセージ式を含んだ場合の)コンパイルの緩さである。


ここでは故意にタイポしているが"inits"というメソッドはNSDateFormatterクラスは勿論のこと、そのクラス階層のどこにもに無い。この状態でコンパイルすればJavaC#であれば間違い無くエラーだが、Objective-Cの場合コンパイルは成功する。

しかしこのまま実行するとランタイムで例外が発生するのだ。

"NSInvalidArgumentException" "[NSDateFormatter inits]: unrecognized selector sent to instance〜"が発生している。

このようにコンパイル時にメッセージ式では型の厳密なチェックは行われない。親切なXcodeさんがいないとミスがあることすら判らないのである。


「言語が文化を既定する」ではないが、個人的には言語の仕様に沿ってコーディングする以上のルールは不要だと考えているし、それがプログラミングの道具としての言語の理想だと思っているが、このような言語を使ってプログラムを書く場合、読みやすくミスを起こしにくい一貫したコーディングルールは必要なのだなと思う。

このような場合、いきなりオレオレルールを作るのではなく、まずは先達の方々が作ったルールを参考にするのが常道だろう。
Coding Guidelines for Cocoa: Introduction to Coding Guidelines for Cocoa
Google Objective-Cスタイルガイド 日本語訳 | textdrop

両者とも非常に参考になるが、Googleの規約はどうしてインデントが2桁なのだろう。 これは4桁にしたい所。

※iOS5ではARC(Automatic Reference Counting)が導入されたものの、未だにGCは使えない。これはこれで正しい見識だと思う。