2011-12-09 4 views
18

私はまだCocoaとObjective-C(< 1年)の新機能です。 My Appには50以上のクラスが追加されていますが、ViewControllerの一部には700行以上のコードが混在しています。多くのコードを持つViewControllerがあればいいですか?

私の質問です: "大" ViewControllerを持っているのはいいですか?または分数にコードを分割するパターンはありますか?たくさんのコードがデリゲートメソッドを実装しています。なぜそれをどうやって削除するのか分かりません。

私はプラグママークで構造化することができます。

ありがとうございます。

EDIT(2013年12月):この件に関するobjc.ioのgreat article from Chris Eidhofがあります。彼はまたマコンン2013 /フランクフルトでその話題について話しました。 UITableViewプロトコルを分離することは素晴らしいパターンです。

EDIT2 NSScreencastには2つのビデオがあり、ViewController(エピソード#102と#103)のリファクタリングの概念を説明しています。

+1

+1グレート質問です。気になる人がいることを知っていることは良いことです。 – tonklon

+0

すべての回答ありがとう - 非常に感謝!しかし、「正しい」答えを選ぶことはほとんど不可能です。自分自身にとっては、VCからモデルコードを分離するのに十分なほど厳格ではないことがわかっていれば分かります。しかし、カテゴリの概念も学びます。 – brainray

答えて

6

私が見た大規模なView Controllerの最も一般的な原因の1つは、MVCアーキテクチャの分離モデルとコントローラの欠如です。つまり、ビューコントローラでデータを処理していますか?

もしそうなら、VCからモデルコンポーネントを取り出して別のクラスに入れます。これはあなたの思考をより良いデザインに向かわせるでしょう。 UIViewの内のすべての変更と内に含まれるUI要素の

  • 取り扱い:ビューコントローラにおいて参考

    、。

  • すべてのアニメーション、トランジション、およびCALayer操作。モデルで

  • などのソートを含むデータ、すべての処理、変換、保管、
2

機能に応じてカテゴリを使用してコードを配布できます。参照してくださいhttp://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

+0

これはコードの可読性を向上させる可能性がありますが、再利用性は向上せず、懸念を分けるのに役立ちません。 VCを自然に別々のカテゴリに分けることができれば、それを別のクラスに分割してみませんか? – tonklon

+0

コードをカテゴリに分割する全体のポイントは、メソッドがクラスタイプの一部になるためです。異なるクラスに分割することは、まったく別の概念です。コードが非常に大きい場合は、カテゴリに分割する方がよいでしょう。 –

+0

はい私は知っている、あなたのポイントを得る。そして、私はカテゴリに分割し、それをそのまま残しておくほうが良いということに同意します。しかし、最善の方法は、別々のクラスを作成することです。各クラスは、その作業を行うために必要なプロパティを取得します。コードを複数のカテゴリに分割すると、1つの大きなクラスにつながり、複数の責任を負うことになります。それは[MAGIC PUSHBUTTON](http://en.wikipedia.org/wiki/Magic_pushbutton)または[GOD OBJECT](http://en.wikipedia.org/wiki/God_object) – tonklon

4

IMHO、700行は(まだ)iOSコードのために巨大ではありません、私は見ているとはるかに悪化しました。もちろん、すべてのVCがこのように大きい場合、問題があります。

あなたは間違いなく#pragma markを使用し、悪用する必要があります。非常にはXcodeで有効です。

次に、1つのファイルにコードが多すぎる場合は、より適切なクラスやカテゴリに機能を抽出できます。

プロジェクトの定期的なタスク(つまり、Webサービスへの接続、XML/JSONの解析、SQLliteとのやりとり、ログなど)を長期間に渡って管理することは、クラスにとって非常に有益です。再帰的なiOSプログラミングを行っているなら、そのような有用なコードの「共通の」ライブラリを作成することができます。

カテゴリを作成すると、特にUIViewControllerにカテゴリを作成すると、たくさんの場所を取る定型記号コードを減らすことができます。あなたは、アプリの共通のベースUIViewControllerを作成することができます(おそらくそうかもしれません)。これは、コードの集中部分で、回転、多分ロギング、ナビゲーションなどのようなものを処理します。

+0

につながります。私は1300行を持っていますVCのようなものであり、ほとんどの行がカスタムアニメーションなどであるために悪いことではありません。私はそれがどのようなメソッドと依存関係にあるかによって異なります。 –

3

あなたのViewControllerが実際に何をしているのかを確認するようにしてください。

いくつかの懸念事項を分けることができる場合は、それらを自分のクラスに移動することができます。 viewControllersメソッドで使用されるプロパティとivarsを確認します。 ivars/propertiesの共通のサブセットを使用する関数のサブセットを見つけることができれば、それらは一緒になって自分自身のクラスになる可能性が非常に高いです。コントローラーはそのような新しいクラスを所有し、これに作業を委任します。

ViewControllerが何らかの状態を管理している場合、 2つ以上のメソッドで同じswitch文またはif-chainを見つけると、STATEパターンはVCをより読みやすくします。しかし基本的には、VCの責任を軽減するのに役立つパターンを使用することができます。

IMHO ViewControllerは、モデルをビューに接続した場所です。モデルの変更をビューに伝播させ、ビューとのユーザーのやりとりを処理することが唯一のものです。計算、ネットワーク転送、解析、検証などの他のすべての責任は、VCが使用するさまざまなクラスで発生します。

ロバートC.マーティンの書籍「クリーンコード」が好きかもしれません。彼は、可読性と再利用性を高めるためにどのようにコードを構成できるかを詳しく調べています。

0

NSObjectクラスを使用して、View Controller機能の一部を管理することをお勧めします。主な理由コードがより明確でデバッグが容易です

+2

手入れが行き届いていますか?私はあなたがここで何を示唆しているか分かりません。 – jv42

関連する問題