きりかノート 3冊め

おあそびプログラミング

Cocoa のオブジェクト間の関連、NSNotificationCenter を使ってはいけないケースほか

NetNewsWire の作者、 Brent Simmons のinessential.com の Thoughts about large Cocoa projects というエントリに注目。彼(なの?)の経験に照らして、Cocoa プログラミングの注意点を挙げている。

  • 通知(notification)はコードを追いづらくなるよ
  • Key-Value Observing は環境設定に限定すべし
  • バインディングは簡単なときに。複雑になったらデータソース/デリゲートに
  • #pragma mark を使おう
  • プロジェクトのソースは階層化しない

などなど。

このエントリ自体も興味深いのだれけれど、ここから派生していろいろなノウハウが飛び交っている。(誰か整理プリーズ!)

なかでも In Defense of Observers がオブジェクトの関連という観点に焦点を当てた話を展開していて面白い。NSNotificationCenter と delegate を対比して、NSNotificationCenter は「Observer パターンではないのだ!」とした上で、 Observer パターンとしての delegate の解説をしている。

自分も昔のコードを振り返ってみると、本来は通知を使うべきではないところに通知を適用してしまって、あとで直しづらいものができあがったような記憶がある。delegate ってフレームワークならともかく、アプリケーション内で閉じているときにオブジェクトを delegate のためにもうひとつ用意しなければならないってことに抵抗あるのだよね。

他の人のコードになるけれど、最近 XmlToolBar のコードを見ていて「あれっ?」と思うところがあったのだ。XmlToolbar ではツールバー上のボタンを押すと通知が発行される。「これってばふつー firstResponder へのアクションでしょ!」と言いたくなってしまう。ツールバーの操作対象として期待されるのって

  • アプリケーション
  • アクティブウィンドウ
  • アクティブウィンドウ上の選択オブジェクト

くらいで、これなら Target-Action で記述されるべきものだと思うのだ。