次のアプリにずっおVIPERが悪い遞択である理由







この投皿は、蚘事の無料翻蚳です。 なぜViperは、 セルゲむ・ペトロフによる次のアプリケヌションにずっお悪い遞択なのか







過去1幎間、誰もがVIPERに぀いお曞きたした。 このアヌキテクチャは、本圓に開発者に刺激を䞎えたす。 しかし、実際には、ほずんどの蚘事はかなり偏っおいたす。 圌らはこのネガティブな偎面に぀いおは黙っお、この建築パタヌンの急募配を瀺すだけです。 しかし、圌は他の人よりも劣らない問題を抱えおいたす。 そしお、この蚘事では、VIPERが圌らが蚀うほど良くない理由ず、それがあなたのアプリケヌションのほずんどに適さない理由を説明しようずしたす。







アヌキテクチャの比范に関するいく぀かの蚘事では、通垞、VIPERは他のMVCアヌキテクチャずはたったく異なるず䞻匵しおいたす。 しかし、実際には、VIPERは通垞のMVCであり、コントロヌラヌはむンタラクタヌずプレれンタヌの2぀の郚分に分かれおいたす。 ビュヌはそのたたで、モデルぱンティティに名前が倉曎されたした。 ルヌタヌには特別な泚意が必芁です。はい、他のアヌキテクチャでは略語でこの郚分に蚀及しおいたせんが、暗黙的に pushViewController



を呌び出すず、単玔なルヌタヌを䜜成したすたたはより明癜です䟋ずしおFlowCoordinators。







VIPERが提䟛する「グッズ」に぀いお話したしょう この本を参照したす 。 目暙2を芋おみたしょう。これは、SRP共有責任の原則を指したす。 それは倱瀌に聞こえたすが、これを利点ず芋なすにはどのような皮類の゚キセントリックが必芁ですか あなたは問題を解決するための報酬を受け取りたす。流行の蚀葉を䞀臎させるためではありたせん。 はい、TDD、BDD、単䜓テスト、レルムたたはSQLite、䟝存性泚入、その他倚くのこずを匕き続き䜿甚したすが、これらはすべお䜿甚目的だけでなく、クラむアントの問題を解決するためにも䜿甚したす。







テスト。



これは別の興味深い偎面であり、非垞に重芁なタスクです。 良い面ずしおは、倚くの人がテストに぀いお話しおいるので、テストに関する別の蚘事を曞くこずができたすが、実際にアプリケヌションをテストする人は少なく、正しい人も少ないです。







䞻な理由の1぀は、良い䟋がないこずです。 assert 2 + 2 == 4



単䜓テストの䜜成方法に関する蚘事はかなりありたすが、実際の䟋はありたせんただし、 Artsyはアプリケヌションをオヌプン゜ヌスのたたにしおおり、プロゞェクトを確認する必芁がありたす。







VIPERは、すべおのロゞックを責任を共有する倚くの小さなクラスに分けるこずを提案しおいたす。 これによりテストが容易になりたすが、垞にそうではありたせん。 はい、単玔なクラスの単䜓テストを曞くのは簡単ですが、これらのテストのほずんどは䜕もテストしたせん。 たずえば、ほずんどのプレれンタヌメ゜ッドを芋おみたしょう。これらは、ビュヌず他のコンポヌネントずの間のプロキシにすぎたせん。 このプロキシのテストを䜜成できたす。これにより、コヌドのテストカバレッゞが向䞊したすが、これらのテストは圹に立ちたせん。 たた、副䜜甚がありたす。コヌドを倉曎するたびに、これらの圹に立たないテストを曎新する必芁がありたす。







テストの正しいアプロヌチには、むンタラクタヌずプレれンタヌの即時テストが含たれる必芁がありたす。これらの2぀の郚分は互いに密接に関連しおいるためです。 さらに、ロゞックを2぀のクラスに分割するため、単䞀のクラスよりも倚くのテストが必芁です。 これは単玔な組み合わせです。クラスA



は4぀の可胜な状態があり、クラスB



6぀の可胜な状態があり、それらの組み合わせには24の可胜な状態があり、それらをテストする必芁がありたす。







テストを簡玠化する適切なアプロヌチは、耇雑なコヌドを倚数のクラスに分割するのではなく、コヌドを枅朔にするこずです。







奇劙なこずに、ビュヌのテストは、ビゞネスロゞックの䞀郚をテストするよりも簡単です。 ビュヌは特定のプロパティのコレクションであり、これらのプロパティの倖芳を継承したす。 FBSnapshotTestCaseを䜿甚しお、ステヌタスず倖芳を比范できたす。 このこずは、カスタムトランゞションのような特別なケヌスをただ凊理したせんが、どれくらいの頻床で䜿甚したすか







蚭蚈のオヌバヌ゚ンゞニアリング。



VIPERは、元ゞャビストがiOSの䞖界に䟵入したずきに起こるこずです。 -n0damage、 redditに関するコメント

正盎なずころ、誰かがこれを芋お、「はい、これらの远加のクラスずプロトコルは本圓に私のアプリケヌションで䜕が起こっおいるかに぀いおの私の理解を向䞊させたす」ず蚀うこずができたす。







簡単なタスクを想像しおください。サヌバヌから曎新を開始するボタンがあり、サヌバヌから受信したデヌタを衚瀺するビュヌがありたす。 この倉曎の圱響を受けるクラス/プロトコルの数を掚枬したすか はい、少なくずも3぀のクラスず4぀のプロトコルは、このような単玔な機胜を実装するために倉曎されたす。 Springがいく぀かの抜象化で始たり、 AbstractSingletonProxyFactoryBean



で終わった方法を芚えおいたすか 私はい぀も、コヌド内に「 シングルトヌンのみを䜜成するプロキシファクトリ甚の䟿利なプロキシファクトリスヌパヌクラス 」を倢芋おいたした。







冗長コンポヌネント









冗長コヌドは、私が考えおいたほど無害ではありたせん。その必芁性に぀いお誀ったシグナルを䞎えたす。







前述のように、プレれンタヌは通垞、ビュヌからむンタラクタヌ このようなもの に呌び出しを枡すだけの非垞に愚かなクラスです。 はい、時には耇雑なロゞックが含たれるこずがありたすが、基本的には単なる冗長コンポヌネントです。







「DIに優しい」プロトコルの数









いコヌドは認識しやすく、コストも簡単に芋積もるこずができたす。抜象化が正しくない堎合はそうではありたせん。







この略語には䞀般的な混乱がありたす。VIPERはSOLID原則を実装しおいたす。DIは「 泚入 」ではなく「䟝存性反転 」です。 䟝存性泚入は、「制埡の反転」パタヌンの特殊なケヌスであり、もちろん接続されおいたすが、䟝存性の反転ずは異なりたす。







䟝存性反転ずは、異なるレベルのモゞュヌルを抜象化するこずにより、それらを分離するこずです。 たずえば、UIモゞュヌルはネットワヌクモゞュヌルに盎接䟝存しないようにしおください。 制埡の反転は別です。 これは、モゞュヌル通垞は倉曎できないラむブラリからが䜕かを別のモゞュヌルに委任するずきです。通垞は、最初のモゞュヌルに䟝存関係ずしお提䟛されたす。 はい、 UITableView



デヌタ゜ヌスを実装するずきは、IoC原則を䜿甚したす。 さたざたな高レベルのものに同様の名前を䜿甚するず、混乱の原因になりたす。







VIPERに戻る。 同じモゞュヌル内のクラス間には倚くのプロトコル少なくずも5぀がありたす。 そしお、それらのすべおが必芁ずいうわけではありたせん。 プレれンタヌずむンタラクタヌは、異なるレむダヌのモゞュヌルではありたせん。 IoCの原則を適甚するこずは理にかなっおいるかもしれたせんが、自問しおください。1぀のビュヌに察しお少なくずも2人のプレれンタヌを獲埗する頻床はどれくらいですか あなたのほずんどが「決しお」ず答えないだろうず確信しおいたす。 それでは、なぜ私たちが決しお䜿甚しないこの䞀連のプロトコルを䜜成する必芁があるのでしょうか







さらに、これらのプロトコルのため、IDEでコヌドを簡単にナビゲヌトするこずはできたせん。 結局のずころ、 cmd+click



は、それを実装するのではなく、プロトコルに投げ蟌みたす。







パフォヌマンスの問題



これは重芁なポむントですが、倚くは単玔にそれに぀いお心配しないか、単に貧匱なアヌキテクチャの圱響を過小評䟡しおいたす。







Typhoonフレヌムワヌクobjective-cの䞖界では䟝存性泚入で非垞に人気がありたすに぀いおは説明したせん。 もちろん、特に自動展開を䜿甚する堎合は、パフォヌマンスにある皋床の圱響がありたすが、VIPERはその䜿甚を必芁ずしたせん。 代わりに、ランタむムずアプリケヌションの起動、およびVIPERが文字通りどこでもアプリケヌションを遅くする方法に぀いお説明したす。







アプリケヌションの起動時間。 このトピックに぀いおはほずんど説明したせんが、重芁です。 結局、アプリケヌションの起動が非垞に遅い堎合、ナヌザヌはそれを䜿甚したせん。 前回のWWDCで、圌らはアプリケヌションの起動時間の最適化に぀いお話しおいたした 。 アプリケヌションの開始時間は、その䞭のクラスの数に䟝存したす。 100個のクラスがある堎合-これは正垞な状態であり、遅延はごくわずかです。 ただし、アプリケヌションに100のクラスしかない堎合、この耇雑なアヌキテクチャが本圓に必芁ですか しかし、たずえばFacebookアプリケヌション 18Kクラス で䜜業しおいる堎合など、アプリケヌションが巚倧な堎合、違いは顕著になりたす玄1秒。 はい、アプリケヌションのコヌルドスタヌトは、すべおのクラスメタデヌタをロヌドするのに1秒しかかかりたせん。







ランタむムの課題。 ここではすべおがより耇雑で、䞻にSwiftコンパむラヌにのみ適甚されたすObjective-Cランタむムにはより倚くの機胜があり、コンパむラヌは最適化を安党に実行できないため。 メ゜ッドを呌び出したずきに「内郚で」䜕が起こるかに぀いお話したしょう2番目はSwiftにずっお垞に正しいずは限らないため、「メッセヌゞを送信する」ではなく「呌び出す」ず蚀いたす。 Swiftには3぀のタむプの呌び出し高速から䜎速ぞがありたす静的、呌び出しテヌブル、およびメッセヌゞの送信。 埌者はObjective-Cで䜿甚される唯䞀のものであり、Objective-Cコヌドずの互換性が必芁な堎合、たたはメ゜ッドがdynamic



ず宣蚀されおいる堎合にSwiftで䜿甚されたす。 もちろん、ランタむムのこの郚分は高床に最適化され、すべおのプラットフォヌムのアセンブラヌで蚘述されたす。 しかし、コンパむル時に正確に䜕が呌び出されるかをコンパむラヌに知らせるこずにより、このオヌバヌヘッドを回避できるずしたらどうでしょうか これはたさに、Swiftコンパむラヌが静的テヌブルず呌び出しテヌブルで行うこずです。 静的呌び出しは高速ですが、コンパむラは100型保蚌なしではそれらを䜿甚できたせん。 そしお、倉数の型がプロトコルの堎合、コンパむラはテヌブル呌び出しを䜿甚するこずを匷制されたす。 これは遅すぎるこずはありたせんが、1ミリ秒があり、1ミリ秒がありたす。今では、クリヌンなSwiftコヌドで達成できるものず比范しお、合蚈実行時間が1秒以䞊増加しおいたす。 この項目は、プロトコルに関する以前の項目に関連しおいたすが、コンパむラを䜿甚しお、䜿甚されおいないプロトコルの数に関する懞念を倧隒ぎから切り離した方が良いず思いたす。







抜象化の匱い分離



これを行うための明確な方法は1぀、できれば1぀だけにする必芁がありたす。

VIPERコミュニティで最も人気のある質問の1぀「Xはどこに持っおいくべきですか」 䞀方では、物事を正しく行う方法に぀いお倚くのルヌルがあり、他方では、倚くの決定が他人の意芋に基づいおいるこずがわかりたす。 これらは、 NSFetchedResultsController



たたはUIWebView



を䜿甚しおCoreData



を凊理するなど、耇雑な堎合がありたす。 しかし、 UIAlertController



を䜿甚するなどの䞀般的なケヌスでさえも議論の察象です。 芋おみたしょう。 ここでは、ルヌタヌがアラヌトず察話したすが、 ここではビュヌを瀺しおいたす。 この単玔なアラヌトは、クロヌズ以倖のアクションを䌎わないアラヌトの特殊なケヌスであるず答えるこずができたす。







特別な堎合は、芏則を砎るのに十分ではありたせん。

その通りですが、なぜここにそのようなアラヌトを䜜成する 工堎があるのですか その結果、 UIAlertController



さえ混乱しおいUIAlertController



。 これ欲しい







コヌド生成



可読性が重芁です。

これはどのようにアヌキテクチャ䞊の問題になりたすか 手動で蚘述するのではなく、テンプレヌトからクラスの束を生成するだけです。 ここで問題は䜕ですか 問題は、ほずんどの堎合、コヌドを曞いおいるのではなくコヌドを読んでいるずいうこずです。 このようにしお、ほずんどの時間、コヌドず混合した定型コヌドを読み取りたす。 いいですか そうは思いたせん







おわりに



私の目暙は、あなたをVIPERの䜿甚を思いずどたらせるこずではありたせん。 恩恵を受けるだけのアプリケヌションがあるかもしれたせん。 ただし、アプリケヌションの開発を開始する前に、次の2぀の質問を自問する必芁がありたす。







  1. このアプリのラむフサむクルは長くなりたすか







  2. 芁件は十分に安定しおいたすか そうしないず、小さな倉曎を加えた堎合でも、無限のリファクタリングが発生したす。







  3. アプリを本圓にテストしおいたすか 自分に正盎になっおください。


3぀の質問すべおに「はい」ず答えた堎合にのみ、VIPER がアプリケヌションに適しおいたす。







そしお最埌に、最埌あなたはあなた自身の決定をしなければなりたせん。 「Use X、X is cool」ず蚀うMediumたたはHabrの男を盲目的に信頌するだけではありたせん。 この男も間違っおいる可胜性がありたす。








All Articles