私は、iPhone と iPad の 2 つの根本的に異なるビューを持つ長期保守コード ベースを継承しました。これにより、1,000 行以上のコードに膨れ上がった 1 つの大きな UIViewController クラスが作成されました。これは、ISIPAD ステートメント、プライベート変数、プロパティ、iBOutlets/Actions のマッシュアップであり、たとえば、ある実装では UITableView を使用し、別の実装ではまったく異なるものを使用します。
さらに悪いことに、現在のソフトウェア パターンはサブクラス化に依存しています。
現在、次のようになっています。
ParentVC (both iphone/ipad God class also has xib(xib~ipad) + iboutlets/actions)
| | |
ChildA ChildB ChildC
私が最初に考えたのは、ParentVC を iPhone/iPad 固有のクラスに分割することでした。
ParentVCBase
| |
ParentVC_iPad(xib~ipad) ParentVC_iPhone(xib)
| |
ChildA/B/C_iPad ChildA/B/C_iPhone
ファクトリ呼び出しを介して正しい Child サブクラスを吐き出します。
私が遭遇した問題は、各子がいくつかの ParentVC メソッド呼び出しをオーバーライドし、デバイス固有ではない独自の機能固有のメソッドを実装することです (元のサブクラス化の主な目的はビュー レイアウトを共有することでした)。このデザイン パターンは、ChildA_iPhone と ChildB_iPad のコードを複製した場合にのみ機能します。あるアンチパターンを別のアンチパターンと交換したので、それは避けたいと思います。
私はここで少し途方に暮れています。実行時に Child クラス (objc/runtime.h) を作成し、必要な Child メソッドを参照 Child クラスからスウィズルすることをほぼ検討しましたが、それは現在よりも混乱しているようには見えません。簡単にクリーンアップするために、ParentVC ヘッダー (IBOUTlets、プロパティなどの大きなリストを含む) を保持し、デバイス固有のメソッドをカテゴリに配置して、実際のリファクタリングが必要になる日まで少なくとも機能を分離することも検討しました。
ある時点でこれに対処しなければならなかったiOSアーキテクトがいるかどうか、または彼らがどのように対処するかは興味深い.