web-dev-qa-db-ja.com

どちらがより効率的です。複数の目的のためのUITableViewControllerのサブクラスまたはそれぞれの目的のための複数のサブクラス?

2つのビュー(たとえば、テーブルビュー)があり、それらに異なることを実行してもらいたいとします。それぞれが異なるデータをロードしますが、たとえばセルがタップされたときに何が起こるかを除いて、ほとんどのパーで動作は似ています。 1つはエントリのリスト、もう1つはユーザーのリスト、もう1つはコメントのリストなどを示します。ロジックを区別するためのフラグ変数を使用して、UITableViewControlerの1つのサブクラスを記述したり、ビューコントローラーごとに個別のサブクラスを記述したりできます。

私は何が最善かを理解しようとしています。小さいブロックの方がデバッグしやすいことなどは知っています。しかし、繰り返しになりますが、同じクラスの定型文を複数持つことは、一種の繰り返しコードです。ここで良いアプローチは何でしょうか?

2
TheeBen

ここでは、オープンクローズの原則をガイドにする必要があります。 「フラグ変数」を持つ単一のUITableViewControllerサブクラスがあり、それがクラス内のあらゆる場所でチェックされるのは、設計上の選択としては非常に貧弱です。アプリに新しいテーブルビューコントローラーを追加するたびに、MonsterTableViewControllerクラスを掘り下げて、違いを処理するためにさらに別のフラグと一連のswitch/ifチェックを追加する必要があります。あなたのクラスは、そのように「拡張のために開かれ、変更のために閉じられている」わけではありません。

たとえば、セルがタップされたときに3〜4の異なる動作があるが、残りのコードはすべて同じであることがわかった場合は、を表すデリゲートまたはクロージャをViewControllerに提供します。 )Strategy(àlatheStrategy pattern)アイテムがタップされたときに使用され、構築時に、またはストーリーボードを使用して構築している場合は、前のセグエの準備でそれを提供します。

ストラテジークラスをジェネリックにして、データソースに使用されるオブジェクトの配列を保持させることもできます。次に、cellForRowAtIndexPathとdidSelectの両方にクロージャを提供します。または、より伝統的なルートに進み、戦略クラスをプロトコルにして、いくつかの実装を行うこともできます。

これは、UITableViewDatasourceとUITableViewDelegateがすでに処理されている方法を非常に彷彿とさせることに注意してください。多くの人がやることになるのは、これらのプロトコルの両方を実装するクラスがたくさんあることです。これらのクラスの1つのインスタンスをUITableViewControllerに渡して、詳細を処理します。

1
Daniel T.

ビューコントローラごとに個別のクラスを用意し、特定のクラスで再利用される共通コードの汎用クラス(またはそれ以上)を用意する必要があります。できるだけ多くのコードの繰り返しを避けてください。

注:これは、ios、objective-c、SwiftまたはUITableViewControllerに特別なことではありません-OO設計の一般原則です。

2
Doc Brown