2

タイトルが示すように、UIViewController と UITableViewCell の間で同じロジックを共有し、サーバーに情報を送信し、計算を行います。

時間の経過とともにレプリケートされたコードが大きくなるという問題がありますが、クラスが異なるオブジェクトであり、各関数がインスタンス変数を呼び出すため、これを因数分解する方法がわかりません。

毎回同じコードを 2 回変更する必要がないように、コードを再因数分解する良い方法はどれですか?

4

3 に答える 3

3

重複したコードをリファクタリングする最も簡単な方法は、共通部分からメソッドを作成することです。重要な問題は、それをどこに置くかです。オブジェクトが関連している場合、共通のコードをそれらの共通の祖先に入れることができます。それらが関連していない場合は、クラス メソッドのみを使用してヘルパー クラスを作成するか、メソッドの本体を使用して C スタイルの独立した関数を定義することを検討してください。

オブジェクトが無関係で、それらのインスタンス変数を使用する必要がある場合、共通のオブジェクトを抽出する機会があるかもしれません。複製されたコードに必要なすべての共通インスタンス変数を、これらの変数を使用するコードとともに、新しい共通オブジェクトに移動します。共通部分を抽出した元のクラスにも変数が必要な場合は、必要に応じてゲッターとセッターを追加します。抽出されたクラスの ivar を作成し、そのプロパティをインスタンス変数の代わりに使用します。

于 2012-07-17T21:29:44.750 に答える
0

ほとんどの場合、ロジックをUITableViewCellから inclusiveに移動することをお勧めしUIViewControllerます。セルは、データの表示のみを担当する必要があります。

于 2012-07-17T22:57:26.840 に答える
0

サーバーとの対話用に別のクラスを作成する必要があります。多くの作業が必要な場合は、サーバーからのデータを処理するための別のクラスを作成することもできます。

Apple が iOS 開発に推奨しているmodel-view-controllerデザイン パターンによると、ビュー(UITableViewCell など) は、サーバーへの要求や結果の処理などを行うべきではありません。むしろ、コントローラーはこれらのことを行い、ビューに必要な情報 (モデルなど) を提供する必要があります。

たとえば、や などのServerメソッドを持つクラスがあるconnectとしsendDataます。サーバーから情報を受信するときのような方法で、付随ServerDelegateするプロトコルを持つことができます。server:didReceiveData:次に、View Controller はServerオブジェクトをインスタンス化し、それ自体をデリゲートとして設定し、デリゲート メソッドで必要な計算を実行できます。セルに提供する情報が得られたら、その情報をどこかに保存し、呼び出し[tableView reloadRowsAtIndexPaths:...]てセルを更新します。

于 2012-07-17T21:59:25.977 に答える