ソフトウェア開発メモ

日々のソフトウェア設計、実装で考えている、気づいた事を書いています。それが真実か否かは保証しません。悪しからず。

UIKit クラス階層について雑感

はじめに

Cocoaはオブジェクトコンポジションの考え方を大胆に導入した世界初のフレームワーク*1だけ有って、他のプラットホームよりもクラス階層は浅い。標準フレームワークにおいて5階層を超える状況は私が知る限りない。

で、急に話は飛ぶけど、アップルのプログラマ−がいったい全体どんな考えで継承しているか、一番階層が深そうなUIKitのクラス階層について調べてみた。

NSParagraphStyle→NSMutableParagrahStlye

典型的なMutable系継承。このタイプの継承についていつも疑問に思うけど、インタフェース継承にしてidみたいな書き方は抵抗が有るのかな。それとも差分部分をうまくテンプレートメソッドで作り込んでいるからかな?

UIBarItem→UIBarButtonItem、UITabBarItem

UIBarItemとして一括して扱う利用シーンなんて有るのだろうか?

UIDynamicBehavior→UIAttachmentBehavior他

典型的な抽象クラスから具象クラスの継承。異論はない。

UIGestureRecognizer→UIPanGestureRecognizer→UIScreenEdgePanGestureRecognizer

UIGestureRecognizerは抽象クラスなんで、そこから具象クラスが派生されるのは分かる。ただ、UIPanGestureRecognizerからUIScreenEdgePanGestureRecognizerへの継承が分からない。実装の共有だけが目的?

UIResponder→UIView→UIControl→UIButton他

イベント反応を行うクラスから、ビューのクラス、アクションにイベントと表示を変更するコントロールクラスとうまく概念の拡張ができている。これを始めて設計した人はとてもセンスが有ると思う。脱帽物です。

 UIResponder→UIView→UIScrollView→UICollectionView, UITableView, UITextView

UICollectionView,UITableView,UITextViewをUIScrollViewから継承する理由が分からない。 UIViewから派生して、具象クラス内でUIScrollViewのデレゲートを実装してやる方法で実現できると思うけど。 クライアントから指定されたデレゲートはデコレートしてやれば普通に呼べるし。。。と書いて、UIScrollViewのインタフェースを使いためにこういう階層にしたのかと薄々気づいた。

UIResponder →UIViewController→UINavagationController→UIImagePickerController、UIVideoEditorController

UIImagePickerController、UIVideoEditorControllerってUINavagationControllerの存在を隠せなかったのかな。インタフェースを使う理由は見つからないし、MPMediaPickerControllerはUIViewControllerから派生しているな。

まとめ

綺麗な階層だけど、実装を共有したいだけの所々に苦し紛れの継承をしているような気がする。アップルのプログラマ−といえども常に完璧な解決ができる分けがない。とはいっても、凡人な我々が安易な継承階層を作り込んでは行けないとう事で締めます。

*1:同じくコンポジションを導入したSmalltalkは先発だけあって以外と階層が深かったりする