iOSのScapegoatたたはMVC

過去数幎にわたっお、私は倚くのプロゞェクト、開発者、およびiOSコミュニティで起こっおいるすべおではないにしおも倚くの原因でModel-ViewControllerアヌキテクチャを非難する蚘事に出䌚いたした。



今日、私はいく぀かの代替的な芋解ずアプロヌチに加え、MVCずプロゞェクト管理党般を再考するのに圹立぀テクニックに泚目したす。 興味のある方-猫ぞようこそ。



MVCずは䜕かから始めたしょう。 ドキュメントからこの矎しい図を芋たした



ï¿Œ 画像



理論的には、すべおが非垞に矎しいです。図のように、ビュヌはナヌザヌのアクションをコントロヌラヌに枡し、ナヌザヌは必芁に応じおモデルを曎新したす。曎新が完了した埌、モデルはコントロヌラヌに通知し、ビュヌを曎新したす。 すべおがシンプルで、すべおが機胜したす。 このアプロヌチを䜿甚しお、倧芏暡なアプリケヌションを含む数十、数十のアプリケヌションを䜜成したしたが、iOS、MacOSだけでなく、Webアプリケヌション、Windowsアプリケヌションなど、このアプロヌチをほが40幎間䜿甚しおきた倚くのものを意味したす。 それらの倚くは珟圚このアプロヌチを䜿甚しおおり、同時に問題は発生しおいたせん。 MVCの䞻な利点は、特にiOSでの䜿いやすさです。 UIKitフレヌムワヌクのUIViewControllerずその子孫は、「すぐに䜿える」倚くの機胜ず機胜を提䟛したす。 小芏暡なアプリケヌションを䜜成するには、プログラミングスキルは実質的に必芁ありたせん。2日間のYouTube講矩で十分であり、開始できたす。 問題は、倧芏暡なプロゞェクトで䜜業する必芁があるずきに始たりたす。 パタヌンずしおのMVCのスケヌリングはあたりよくないずいう倚くの蚌拠があり、これがMassive View Controllerず呌ばれる問題に぀ながりたす。



問題の原因



私の意芋では、この問題の理由は次の2぀です。



1. MVCは、䜜成する必芁がある゚ンティティずクラス、および䜜成しおいない゚ンティティずクラスに぀いお明確な指瀺を実際に提䟛したせん。 特にiOSで。 UIKit MVCは最初はUIViewControllerのみを提䟛したすが、基本的にはそれだけです。 ビュヌは存圚するが、最初は宣蚀されおいない、぀たり ビュヌの個別のむンスタンスを䜜成するこずなく、UIViewControllerアプリケヌションのみがその機胜を実行したす。 モデルず同じこず。 モデルの構造ずアヌキテクチャ、およびコントロヌラヌずの盞互䜜甚は、開発者の良心ず想像力に完党に䟝存しおいたす。 これは、実際には2番目の理由に぀ながりたす。



2.ドメむン領域の䞍十分な理解、開発者が必芁な゚ンティティを割り圓おるこずができないため、UIViewController内の䟝存関係ず機胜の蓄積。 ぀たり 開発者が新しい機胜を远加するず、新しい゚ンティティを䜜成しお既存のアヌキテクチャをリファクタリングする代わりに、ViewControllerに新しい機胜が远加されたす。



぀たり この問題は、アヌキテクチャず䞍泚意/怠慢/怠iness /無知/経隓䞍足䞋線開発者の欠陥によっお等しく発生するず蚀いたいです。



最初の問題の解決策



MVC問題の最初の郚分を郚分的たたは完党に解決するMVVM、MVP、VIP、VIPER、FluxFacebook、RibletsUberのViper、Clean-Swiftなどのアプロヌチは、ここ数幎で非垞に人気がありたす。 それらの倚くは、開発者にクラスずそのクラスを䜜成する必芁がある理由に぀いお明確な指瀺を䞎えたす。 たた、チヌムが同じプロゞェクトに携わる10人以䞊の開発者で構成される堎合は特に、チヌム䜜業がはるかに容易になりたすたずえば、Uberで150人、JustEats 20人以䞊、Facebookを怜蚎するのも怖いですが、間違いなく10人以䞊です。 これは、コントロヌラヌコヌドをカバヌするだけの倚数の孀立したオブゞェクトの䜜成を意味するずいう事実によるものです。これにより、チヌム内で倧きな損倱なく䜜業を分散できたす。



2番目の問題はただ残っおいたす。 ビュヌモデルずプレれンタヌクラスでVIPずMVVMを䜿甚し、解析ずマッピングからデヌタベヌスク゚リずHTTPリク゚ストの圢成たで、耇数の操䜜を含む1500行以䞊のコヌドを含む倚くのプロゞェクトに出䌚いたした。 開発者の経隓䞍足たたはアプリケヌションアヌキテクチャ党䜓の理解䞍足の問題は、単にアヌキテクチャパタヌンを倉曎するだけでは解決できたせん。 私の芳点からは、単に「デフォルト」で倧芏暡で耇雑なプロゞェクトをサポヌト/䜜成できる「黄金の匟䞞」はありたせん。 いずれにせよ、これには劎力、単䜓テスト、適切な蚈画、および時間が必芁です。



2番目の問題を郚分的に回避する方法に関するヒントがある郚分



1. ViewControllerを促進する



たず第䞀に、良いこずに、アプリケヌション内のどのオブゞェクトも耇数の機胜を担圓するべきではありたせん単䞀責任。 倚くの開発者にずっお、これは明らかですが、それにもかかわらず、圌らのコヌドはそのような単玔な仮定に準拠しおいるずは蚀えたせん。 倚くの堎合、UIViewControllerが他の党員ず同じオブゞェクトであるこず、およびモデルずビュヌをバむンドするずいう1぀の責任のみが必芁であるこずは明らかではありたせん。 ぀たり ビュヌを適切なモデル状態に維持し、この状態を倉曎する必芁がある堎合にモデルに通知したす。 私の芳点からするず、この定矩を超えるものはすべおコントロヌラヌに属しおいたせん。 アニメヌション、レむアりト、構成ビュヌ、レンダリングの倉曎、解析、マッピング、httpリク゚スト、デヌタベヌスク゚リ、さたざたなレベルのオペレヌティングシステムサヌビスなど、すべおのガベヌゞ-これらはすべおコントロヌラヌに属しおいたせん。 これらはどれも䜜成せず、コントロヌラヌ内で呌び出す必芁がありたす。 個々のポむントの1぀はナビゲヌションです。 ViewControllerに耇数の出口点がある堎合は、ナビゲヌションずナビゲヌションコントロヌルに぀いお怜蚎する必芁がありたす。 コントロヌラヌコヌド党䜓に5〜10個の出口点が散圚しおいるViewControllerに頻繁に出䌚わなければなりたせんでした。 ナビゲヌションの䜜成から個別の拡匵機胜ぞのナビゲヌション、セグ゚のみによるナビゲヌションの管理、個別のルヌタヌ゚ンティティの䜜成、UINavigationControllerからの継承など、これを線成する方法は倚数ありたす。 しかし、それも行う必芁がありたす。 そしおテストしたす。 芚えおおくべき䞻なこずは、ViewControllerは行のすべおではなく、必芁なこずを実行する必芁があるずいうこずです。 MVVM、VIPERで䜿甚される゚ンティティに぀いおも同じこずが蚀えたすリストはもう少し本物です。 圌らがしなければならないこずは、圌らがしなければならないこずだけ、それがView-Modelなら、そしおビュヌのデヌタ衚珟のみ、それが゚ンティティなら、そしおデヌタの保存ず倉換などです責任の䟋はarbitrary意的であり、著者はこれらのステヌトメントの完党な真実を装っおいたせん。 既存のクラスに新しいメ゜ッドたたはプロパティを远加する前に、それが本圓にこのクラスにあるべきかどうかを垞に考えおください。



2. モデル



iOSで頻繁に芋られる゚ラヌの1぀は、モデルレベルの分離がないこずです。 私の芳点から、そしお実際にアプリケヌションを成功させた埌、モデルを別々のフレヌムワヌクに配眮するこずが最善です。 ドメむンを取り出すこずができたす。 たずえば、フヌドデリバリヌアプリケヌションがある堎合は、別のフレヌムワヌクに入れるこずができたす。たずえば、レストランずそれに関連するすべおレストラン、メニュヌ、堎所などで怜玢、料理、配達゚リアなどです。 チケットを賌入するためのアプリケヌションがある堎合、ダヌスのfarmework'ovを遞択できたすチケット、予玄、賌入、履歎などを怜玢したす。 各フレヌムワヌクは、個別の単䜓テストセットでカバヌできたす。 これはできたせんが、それでもコントロヌラヌずの盞互䜜甚から完党に分離されたモデルを䜜成しようずしたす。



3. 倧芏暡な「UI」ViewController



巚倧なストヌリヌボヌドに䜕床も出䌚っおおりたた戻っおきたす、巚倧なUIViewControllersも同様です。 巚倧なのはコヌドの量ではありたせんがこれも、UI芁玠の数の点では。 すべおの開発者が巚倧な山積みのViewControllerを芋たずきに自問すべきだず思う質問は、次のように聞こえたす。

ᅩ

画像



これはWordの空のドキュメントのスクリヌンショットであり、1぀のViewControllerであるずは思えたせんが、倚くのiOS開発者は1画面-1 ViewControllerパラダむムに埓いたす。



別のViewControllerでナヌザヌの論理操䜜たたは機胜を実行する画面䞊のいく぀かの芁玠を遞択したす。 䟋はこの画面です。



画像



衚の各セルは個別のVCです。 䜜成者のアバタヌ、䜜成者、および時間のタむトルは、個別のViewControllerです。 コンテンツずリンクも別個のViewControllerです。



いいね-コメント-共有-これらのコンポヌネントはすべお別個のViewControllerです。



4. たくさんのUIコヌド



膚倧なUIコヌドは、さたざたなコンポヌネントの肥満にも぀ながりたす。 ゜リュヌションは、ViewController内のカスタマむズではなく、UIコンポヌネントのデフォルトの継承である堎合がありたす。 たたは、UIを説明する拡匵機胜を远加できたす。



5. 倧芏暡なストヌリヌボヌド。



倚くの堎合、プロゞェクトで倧芏暡なStoryboardファむルに出䌚いたした。 さたざたな詳现レベルの20〜50個のViewControllerがストヌリヌボヌドに远加されたす。 最初はすべおがスムヌズか぀䟿利に行われ、ナビゲヌション党䜓がそこにあり、蚭定もそこにありたすが、芁件が倉曎されたり新しい開発者が接続するずすぐに、それは完党な地獄になりたす。 1぀の解決策は、Xcode UI Builderをそのたた䜿甚しないこずです。 コヌドからレむアりト党䜓を䜜成したす。



さたざたなラむブラリを䜿甚しお、制玄Parus、Masonryなどの蚘述を簡玠化するか、ハヌドコア甚にCGFrameを䜿甚しお、すべおの方向ず蚱可に぀いおすべおを自分で蚘述したす。 Storyboardを本圓に䜿甚したい堎合は、プロゞェクトをいく぀かに分割する方法を怜蚎しおください。 理想的には、ストヌリヌボヌドには1぀の責任、たたは1぀のナヌスケヌスが必芁です。 ぀たり たずえば、タクシヌのアプリケヌションがある堎合、個々のストヌリヌボヌドは、タクシヌの呌び出し、タクシヌの远跡、支払い、䞀般情報などになりたす。 ぀たり 倚かれ少なかれ独立した機胜。 ストヌリヌボヌドリファレンスを䜿甚するず、これは非垞に䟿利であり、最小限のコヌド蚘述が必芁です。 理想的には、ストヌリヌボヌドには3〜4個以䞊の個別の画面を含めないでください。 ストヌリヌボヌドが倧きくなるほど、それをサポヌトするためにより倚くの劎力が必芁になり、最初に理解するのがより難しくなり、ロヌドするのに非垞に時間がかかり、開発チヌムで䜜業するのがより難しくなりたす。



結論



この投皿で蚀いたかったこずは、MVCがiOS開発者の倚くの問題を非難する傟向があるこずに気づいたこずです。そしお、倚くの堎合䞊蚘の䟋で芋られるように、これらの料金はiOSに特に限定されたせん 倚くの堎合、それは開発者自身の責任であり、さらに、これらの開発者は他のアヌキテクチャに切り替えるずきに同じたたは同様の問題を経隓するこずがよくありたす。 倧芏暡なVCは、MVCがスケヌリングできないからではなく、開発者が制限を正しくスケヌリングしたくない/蚱可しないために、90のケヌスで発生したす。



VIPER、MVVMおよびその他は、特に開発チヌムで䜜業しおいる堎合にこれを支揎できたすが、すべおの問題に察する䞇胜薬ではありたせん。 この蚘事では、私自身がプロゞェクトでVIPER / MVVMを䜿甚しおいるにもかかわらず、MVCが非難されず、悪魔の擁護者ずしお行動する状況の䞀郚を匕甚しようずしたした。 良いコヌドを曞いおください。 すべおビヌバヌ。



All Articles