Massive View Controller-IOS-ソリューション


16

私はすべての新しいiOS開発者に次の問題があると確信しています。

これは、2つの基本的な一般的な画面の表示方法です。

1)フォーム画面: ここに画像の説明を入力してください

2)テーブルビューコントローラー画面 ここに画像の説明を入力してください

これまでに、2つの異なるソリューションについて読みました。

  1. 最初のソリューション:https://bendyworks.com/single-responsibility-principle-ios/。これは通知に基づいており、View Controllerを(意図)View Modelから完全に分離するため、View Controllerのコードが削減されます。Go-To構造と同様に、コードを壊すという欠点があると思います。次のようになります。 ここに画像の説明を入力してください

  2. 2番目のソリューションは、混雑した同じView Controllerを保持します(ボタンアクションはVC内で実行されるなど)。ただし、TPKeyboardAvoiding、BlocksKitなどのライブラリ、またはそれらのほとんどはカテゴリに基づいたソリューションを使用します。この2番目のソリューションでは、コードは大幅に削減されますが、View Controllerには依然として多くの責任があります。

これらのソリューションについてどう思いますか?どちらが良いですか?より良いものはありますか?


5
時間のために良い答えを出すことはできませんが、これはあなたを正しい方向に向けるべきです。
マイクD 14

私の意図は、多くの新しい開発者が抱えているこの問題を最終的に克服するために、できるだけ多くの良い答えを集めることです。リンクをお寄せいただきありがとうございます。何か新しいものを見つけたら、必ずここに投稿します。
ラヴール14

ここではアンディ・Matuschakによって脂肪のビューコントローラとの戦いについての素晴らしい話だhttps://realm.io/news/andy-matuschak-refactor-mega-controller/
トマシュBAK

回答:


6

MVVMを使用してこの問題を解決できます。

Model-View-ViewModel、または一般に知られているMVVMパターンは、UIデザインパターンです。VMは、VCからUI用のモデルデータを準備するためのすべてのロジックを使用します。

例:
いくつかのフィールドを持つモデルオブジェクトがあり、それらのいくつかをフォーマットし、計算を行い、それらを結合します。

MVCの場合、すべてのロジックはViewControllerにあります。
MVVMでは、すべてをVCからVMに移動します。

VMはUIのすべてのデータを準備し、VCはこのように設定します。

(VCクラス)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

チュートリアルとトピック:


3
これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう。
バートヴァンインゲンシェナウ14

私はバートに同意します。これらのすべての方法の要約を他の誰も投稿しない場合、それらをすべて理解し、テストしたらすぐに作成します。
ラヴール

2
@Ravul更新答え
kaspartus

私はあなたの答えを投票し、このアイデアに感謝します。私は機能的リアクティブプログラミングについて読んでいますが、それは良い考えのようです。この質問への答えは、いくつかの利点、欠点、および問題にアプローチする次の4つの方法の少なくとも1つの概念図を含む列挙であると思います。1)反応性ココア2)KVO 3)デリゲート方法および4)古典的な方法View Controllerの作成。私の前に誰もテストしていなければ、これらのメソッドをすべてテストしたらすぐにそれを書きます。その間に新しい方法を見つけたら、それはさらに良いことです。
ラヴール14

3

以前、大規模なView Controllerでコードを解く必要がありましたが、それが最初にコンテンツをナビゲートする能力を本当に妨げました。私が気づいた重要なことの1つは、View Controllerのサイズだけでは物事を分解するのに十分ではないということです。1つの大きなファイルを持つことは複雑であり、小さなファイルがたくさんあることも複雑です。次に、View Controllerをより小さな部分に分割するためにリファクタリングする正当な理由をいくつか示します。

MVC

View Controllerは、ViewとModelをつなぐ接着剤以上のことをすべきではありません。ネットワーク接続コード、画像操作コードなどがたくさんある場合は、それらをヘルパークラスに分割することを検討してください。

データソースとしてView Controllerを使用する複数のコントロール

View Controllerをデータソースとして使用するコントロールが画面上に多数ある場合は、それらを個別のデータソースオブジェクトに分割し、それらをデータソースにすることを検討してください。または、それらを個別のView Controllerに分割することもできます(View Controllerに他のコントローラに加えてTable Viewがある場合、それを独自のTable View Controllerクラスに分割できます)。

重複コード

異なるView Controllerにまったく同じコードがある場合は、1つの共有場所に配置します。これにより、コードが再利用可能になり、複雑さを管理しやすくなります。

View Controllerの複雑さを最小限に抑えるための追加のアドバイスを次に示します。

プログラマティックではなくストーリーボード

ビュー要素の作成は多くのコードであり、フレームジオメトリコードも多くの作業です。まだ自動レイアウト制約を使用して、できるだけ多くのビュー要素をストーリーボードに配置することを検討していない場合。

不要なコード/コメント

また、不要なコード/コメントも必ず削除してください。多くの場合、新しいView Controllerファイルには、使用していないメソッドが付属しています。そのようなメソッドを使用していない場合はdidReceiveMemoryWarning、それを削除しても安全です。また、View Controllerファイルは非常に大きいため、古いコードやコメントを削除するのが怖い場合があります。それを先送りしないでください!複雑さを増すだけです。

通知

通知に関する質問に答えるには:通知は、すべてで使用するゴールデンハンマーではありません。特定のアクションが1つあるために、複数のView Controllerを同時に更新する必要がある場合、通知が役立つことがわかりました。ただし、通知には注意してください。通知を使いすぎると、通知を追跡しようとするのが非常に困難になります。


2

VIPERと呼ばれる特別なアーキテクチャ(ビュー、インタラクター、プレゼンター、エンティティ、ルーティング)があります。私はあなたが知っておくべきことをここで再開しようとします:

見る

  • それらはダミービューです。
  • UIView、UIViewController、UILabelなどのオブジェクトが含まれます。
  • プレゼンターからのコンテンツを待機します。
  • ユーザーインタラクションを処理し、Presenterレイヤーに渡します。

プレゼンター

  • UIオブジェクトを知りません。
  • ビューレイヤーから入力を取得します
  • ビューロジックを処理します(addメソッドは他の画面を表示します)。

ルーティング

  • ナビゲーションロジックと遷移アニメーションを処理します。
  • UINavigationController、UIWindowなどのオブジェクトを知っています。

だから、あなたがあなたのコードをきれいにするだろうと思うこと:

  • データ検証はPresenterレイヤーに移動します。

  • ナビゲーションはワイヤフレームオブジェクト(ルーティングレイヤー)に移動します。

  • DRYの原則を守ってView Controllerを分割します。

  • 複雑な画面には、2つ以上のビューとプレゼンターがあります。

VIPERアーキテクチャに関する次のリンクが表示されます。http ://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

幸運を祈ります!


1
このアーキテクチャは小規模なアプリケーションで機能しますか?プロジェクトに導入するには、多くのオブジェクトを作成する必要があるようです。
トマス・ベック

ええ、私はそれが従来のMVCよりもオブジェクトですが、価値があることに同意します。今年作成した1つの簡単な例を見ることができますgithub.com/orafaelreis/cascavel Cascavelは、VIPERプロジェクトを初期化するためのベースプロジェクトのようなものです。
orafaelreis

優秀な !VIPERアーキテクチャは、大規模なView Controllerの問題を回避するように設計されているようです。
クリストフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.