タイトルが示すように、UIViewController と UITableViewCell の間で同じロジックを共有し、サーバーに情報を送信し、計算を行います。
時間の経過とともにレプリケートされたコードが大きくなるという問題がありますが、クラスが異なるオブジェクトであり、各関数がインスタンス変数を呼び出すため、これを因数分解する方法がわかりません。
毎回同じコードを 2 回変更する必要がないように、コードを再因数分解する良い方法はどれですか?
タイトルが示すように、UIViewController と UITableViewCell の間で同じロジックを共有し、サーバーに情報を送信し、計算を行います。
時間の経過とともにレプリケートされたコードが大きくなるという問題がありますが、クラスが異なるオブジェクトであり、各関数がインスタンス変数を呼び出すため、これを因数分解する方法がわかりません。
毎回同じコードを 2 回変更する必要がないように、コードを再因数分解する良い方法はどれですか?
重複したコードをリファクタリングする最も簡単な方法は、共通部分からメソッドを作成することです。重要な問題は、それをどこに置くかです。オブジェクトが関連している場合、共通のコードをそれらの共通の祖先に入れることができます。それらが関連していない場合は、クラス メソッドのみを使用してヘルパー クラスを作成するか、メソッドの本体を使用して C スタイルの独立した関数を定義することを検討してください。
オブジェクトが無関係で、それらのインスタンス変数を使用する必要がある場合、共通のオブジェクトを抽出する機会があるかもしれません。複製されたコードに必要なすべての共通インスタンス変数を、これらの変数を使用するコードとともに、新しい共通オブジェクトに移動します。共通部分を抽出した元のクラスにも変数が必要な場合は、必要に応じてゲッターとセッターを追加します。抽出されたクラスの ivar を作成し、そのプロパティをインスタンス変数の代わりに使用します。
ほとんどの場合、ロジックをUITableViewCell
から inclusiveに移動することをお勧めしUIViewController
ます。セルは、データの表示のみを担当する必要があります。
サーバーとの対話用に別のクラスを作成する必要があります。多くの作業が必要な場合は、サーバーからのデータを処理するための別のクラスを作成することもできます。
Apple が iOS 開発に推奨しているmodel-view-controllerデザイン パターンによると、ビュー(UITableViewCell など) は、サーバーへの要求や結果の処理などを行うべきではありません。むしろ、コントローラーはこれらのことを行い、ビューに必要な情報 (モデルなど) を提供する必要があります。
たとえば、や などのServer
メソッドを持つクラスがあるconnect
としsendData
ます。サーバーから情報を受信するときのような方法で、付随ServerDelegate
するプロトコルを持つことができます。server:didReceiveData:
次に、View Controller はServer
オブジェクトをインスタンス化し、それ自体をデリゲートとして設定し、デリゲート メソッドで必要な計算を実行できます。セルに提供する情報が得られたら、その情報をどこかに保存し、呼び出し[tableView reloadRowsAtIndexPaths:...]
てセルを更新します。