モバむルアプリケヌションのアヌキテクチャ蚭蚈パヌト2

システムのすべおの゚ネルギヌを必芁な方向に向けるには、このシステムをルヌルに制限する必芁がありたす。


こんにちは、Habr モバむルアプリケヌションのアヌキテクチャ蚭蚈に関する䞀連の蚘事を続けたす。 catの䞋で、UIレむダヌの蚭蚈に぀いお説明したす。 ようこそ

進化するさたざたな皮類の生物は、自らの生存を確保するために解決する必芁がある基本的な課題に盎面したした。

環境から゚ネルギヌを吞収する必芁がありたすか -解決策光合成。
遺䌝子の倚様性を確保する必芁がありたすか -決定性別区分。
身䜓が耇雑になればなるほど、より高床な課題を解決しなければなりたせんでした。

時間が経ちたした。 生存問題の優先床が著しく䜎䞋し、個䜓の資源が郚分的に未䜿甚である皮が出珟したした。
進化は新しいベクトルを取り入れたした。 食物であるか、捕食者からの保護か、倩候からの保護かなど、自然の問題の倧郚分は䜕らかの圢で解決され、さらに発展する堎所はどこにもないように芋えたしたが、ファンタゞヌがここで圹割を果たしたした。

さらなる進化はもはや生存を確保するずいう目暙を远求したせんでしたが、新しいタスクの゜ヌスは意識であり、「文化」や「科孊」などの開発ベクトルを生み出したした。 実際、教育ず育成は、個人の生存を保蚌する盎接的な芁因ではなく、森林に䜏んでいる間にそれらなしで行うこずは非垞に可胜です。

教育ず育成は自然が蚭定した自然な目暙ではなく、人間自身によっお生たれたものです。

皮のさらなる発展は、この皮が自らのために発明した目暙によっお保蚌されおいたす。

そしお、これらの目暙はそれぞれ制限事項です。

図曞通では倧声で話せたせん。 テヌブルを䞞atみするこずはできたせん。 たくさんの蚓緎が必芁ですギタヌを曞いお、描いお、印刷しお、挔奏したす-なんの困難もなく、これは自分に察する暎力です。

開発するために、人は自分が発明した枠組みに身を眮く。

゜フトりェアシステムを進化のピヌクにしたいですか
補品を動的に成長させたいですか
-リゞッドフレヌムず拡匵ベクトルを䜿甚しおプロゞェクトを定矩したす。

プログラミング文化では、゚ンゞニアは自分が望む方法で曞くのではなく、ルヌルに準拠した方法で曞くのです。

Ps
もちろん、3局の建築蚭蚈であろうず、刃物を保持する文化であろうず、ルヌルは人々によっお発明されたものであり、最終手段ずしお客芳的ではありたせん。

䜕も真実ではありたせん。
すべお蚱可されおいたす。


䜕蚀っおるの


皮の分離

䞻にモバむルアプリケヌション以䞋、MPず呌びたすのサヌビスレむダヌずトランスポヌトレむダヌのアヌキテクチャ蚭蚈に焊点を圓おた前回の蚘事では、UIレベルの蚭蚈の過皋でどのような前提条件に埓うべきかに぀いおのヒントが䞎えられたした。

以䞋は理論的な考慮事項ず実際的な結論であり、おそらくあなたの䜜業を簡玠化し、開発されたプロゞェクトに䞀定量の構造を远加したす。

NB高品質の補品でナヌザヌむンタヌフェむスを構築するむデオロギヌはアプリケヌションプラットフォヌムに厳密に結び付けられおおり、゜リュヌションを遞択する際にある皮の「クロスプラットフォヌム」を達成するこずは率盎に蚀っお愚かなこずです。


Navigation DrawerがUITabBarず同じ機胜を実行できる堎合でも、それをそのたた䜿甚しお、元々異なるように蚭蚈されたシステムを同等にするこずはできたせん。

珟圚の蚘事では、䞻にiOSプラットフォヌムに適甚可胜な゜リュヌションに焊点を圓おおいたす。

ビルドUI


玠晎らしいストヌリヌを語り続ける

前回、いわゆるナヌザヌストヌリヌになりたした。これにより、プロゞェクトを論理的な郚分に分割しお、゜ヌスコヌドを簡単に維持できるようになるず考えられたす。

あなたのアプリケヌションのデザむンが狂ったオタクによっお描かれたのではなく、「UX」の抂念に粟通し、モバむルデバむスの画面のチェヌンにすべおのコントロヌルを䟿利か぀有機的にフィットさせるこずができる倚かれ少なかれ適切なアヌティストによっお描かれたず仮定したす。



銀行業務アプリケヌションの䟋を䜿甚しお、むンタヌフェヌスは次のような兞型的なストヌリヌに分割されたす。アプリケヌションを衚す耇数のスラむドで構成される「挚拶」。 ナヌザヌ名、パスワヌド、電子メヌルなどのフィヌルドを持぀「認可」。 最埌に、メむン画面は、いく぀かの論理的な郚分で構成されおいたす「ホヌ​​ム」お金に぀いお、「支払いず送金」、「ATMず支店のあるカヌド」など。

各ストヌリヌには、ナヌザヌが特定のアクションを実行できるいく぀かの画面たたは「ペヌゞ」が含たれおいたす。
「支払いず送金」支払いのリストに移動したす。 「モバむルコミュニケヌション」セクションに移動したす。 挔算子を遞択したす。 電話番号ず補充金額を入力し、お金の゜ヌスを遞択しおください-あなたのクレゞットカヌド; 支払いたす。

サヌビスレベルには、UIに必芁なデヌタを提䟛し、バック゚ンドで掻甚できるすべおの必芁なツヌルがありたす。

゚ンティティぞの分離には、埓来のMVCではなく、MVPの倉曎を䜿甚するこずをお勧めしたす。これにより、より抜象的なコントロヌラヌを䜜成し、デヌタモデルに関連付けられたコヌドをこのデヌタの盎接「消費者」であるクラスに分散できたす。

ナヌザヌストヌリヌごずに、3぀の䞻芁な皮類の゚ンティティを区別できたす。 これらは、 View 、 ViewController 、およびHelperです。

ViewController-むンタヌフェヌスの個々の論理ナニットのコントロヌラヌずしお機胜するクラス。 原則ずしお、アプリケヌションペヌゞは論理ナニットずしお機胜したすが、より耇雑なレむアりトでは、ペヌゞ䞊の子コントロヌラヌを遞択しおマザヌクラスをオフロヌドするず䟿利です。

ビュヌは、ストヌリヌボヌドで盎接衚されるクラスですUIView、UITableViewCell、UILabel、UIButtonなどの継承。

ヘルパヌ -個別の職務たたは委任された職務を実行するナヌティリティクラス。 これらには、文字列、UITableViewDataSourceおよびUITableViewDelegateプロトコルに準拠するクラスなどをフォヌマットするためのナヌティリティが含たれたす。

詳现に぀いお話したしょう。

ViewController


競合他瀟から孊ぶ

䞀般的に、iOS開発者はAndroid゜フトりェアを䜜成する同僚から倚くを孊ぶ必芁がありたす。

埌者は、叀兞的なJava゚ンゞニアに固有のすべおの剛性ずアヌキテクチャをある皋床継承しおいるため、実際にクヌルなAndroidアプリケヌションのアヌキテクチャ蚭蚈は、クヌルなiOSアプリケヌションのアヌキテクチャ蚭蚈よりもはるかに調和しおいるように芋えたす。

Androidの同僚が最初に導入した制限は、コントロヌラヌアクティビティ間で耇雑なオブゞェクトを転送できないこずでした。このため、これらのオブゞェクトのシリアル化を保蚌するこずがさらに必芁です。

はい、今では誰もがすでにフラグメントを䜿甚しおおり、このストヌリヌ党䜓が忘华に沈んでいたすが、元のメッセヌゞは正しかったです。各コントロヌラヌは可胜な限り分離する必芁がありたす。



コントロヌラ間で゚ンティティ党䜓を枡さないでください-それらの識別子を枡したす。 各コントロヌラヌがサヌビスレベル自䜓をノックし、そこからこの゚ンティティヌの詳现情報をその識別子を介しお受信したす。これにより、呜什型プログラミングに固有の最小限の副䜜甚をアプリケヌションに提䟛できたす。

そしおもちろん、Android開発者が孊ぶべき2番目の制限-SDKで「Adapter」をテヌブルデリゲヌトずしお䜿甚したす-これはプロトコルではなく、別個のクラスなので、View ControllerやUITableViewDelegate / UITableViewDataSourceなどをマヌゞしたす-単に䞍可胜。

NBクリアテキスト。 UITableViewControllerはSOLIDの原則に盎接違反しおいるため、このクラスを発明したAppleの゚ンゞニアは重倧なミスを犯したした。


衚瀺する


抜象化し、スタむルに分割する

䞊蚘でMVPの䜿甚に぀いお既に説明したしたが、次にその理由を説明したす。
そのため、セルにデヌタを入力するための2぀のフラグメントがありたす。

MVC
RMREntity * entity = [self entityForIndexPathindexPath];
cell.title = entity.name;
cell.subtitle = entity.shortDescription;

MVP
RMREntity * entity = [self entityForIndexPathindexPath];
[cell fillWithEntityentity];

2番目のアプロヌチでは、UIの構造から抜象化しお、コントロヌラヌのすべおのロゞックずヘルパヌデヌタを凊理枈みのデヌタ型RMREntityに集䞭させたす。

したがっお、–fillWithEntityむンタヌフェむスの背埌で、ダヌスのRMRTableViewCell子孫クラスを非衚瀺にできたす。各子クラスは、独自の方法で゚ンティティをレンダリングできたす。 同時に、各UITableViewに察しお同じ UITableViewDataSourceを䜿甚するため、定型コヌドの蚘述を倧幅に節玄できたす。

合蚈
たず、忘れないでくださいビュヌはSDKクラスからだけでなく、盞互からも継承できたす。

「アプリケヌションのアヌキテクチャ蚭蚈では、アプリケヌションの皮類に぀いお説明する必芁がありたす。 図曞通の蚭蚈図を芋るず、それが図曞通であるこずを正確に理解できたす。読曞宀ず本棚がありたす”

アプリケヌションにMessageデヌタ型がありたすか その䞋に抜象MessageCellセルを䜜成し、そこから他のセルを継承したす コヌドの各クラスは、その機胜を決定論的に満たす必芁があり、ロゞックを含めるこずはできたせん。

二番目 。 UXに粟通しおいるデザむナヌに぀いお蚀及したこずを芚えおいたすか

優れたデザむナヌは、優れたプログラマヌに少し䌌おいたす。
圌は、いずれかのニヌズに適応できる兞型的なテンプレヌトのセットを持っおいたす。
優れたデザむナヌは、たずカラヌパレットを䜜成し、次にそれを䞀貫しおプロゞェクトのレンダリングに適甚したす。

色に加えお、優れたデザむナヌは各プロゞェクトの「スタむルシヌト」を垞に持っおいたす。

タむトルHelvetica Bold、36pt。
字幕Helvetica Medium、24ポむント。
金額Helvetica Light、18ポむント、ラむトブルヌ。
などなど。

適切な開発者ずしお、このスタむルシヌトをコヌドに盎接転送するこずを劚げるものはありたせん。

たずえば、初期化時に、フォントスタむルを返すファクトリメ゜ッド-fontStyleを照䌚し、このスタむルを適甚する抜象Labelクラスを䜜成できたす。

盞続人は、順番に、単に必芁な執筆スタむルを返したす。 したがっお、HeaderLabel、SubheaderLabel、MoneyAmountLabel ...のクラスが手元にありたす。 これらは、䜜成されたレむアりトに適甚可胜なInterface Builder内の「クラス」フィヌルドに単玔に眮き換えるこずができたす。

ヘルパヌ


テスト蚭蚈

コントロヌラヌがしおはならないこずに぀いおはすでに述べおいたす。
だから誰がすべきですか -回答ナヌティリティ。

芚えお守るべき最も重芁なこずは、単玔なルヌルです。功利䞻矩のクラスは情報を運んではなりたせん。 それらはパブリックプロパティを持っおはならず、関数スタむルで蚘述しおいるように、すべおのロゞックは最小限のvoidメ゜ッドで「パススルヌ」する必芁がありたす。メ゜ッドは垞に䜕かを返す必芁がありたす。

ナヌティリティのこの「状態の欠劂」により、アプリケヌションロゞックの異なるレむダヌでアプリケヌションレむダヌを䜿甚するこずは非垞に安党ですが、コントロヌラヌ、衚珟、ビゞネスロゞックなどのために個別のアシスタントを䜜成するのを怠らないでください。

ナヌティリティクラスたたはヘプラヌは、テスト゚ンティティの圹割の最初の候補です。

日付のフォヌマット、配列の䞊べ替え、他の画像からの画像の䜜成-これらはすべお、「配列、動䜜、アサヌト」のシヌケンスに簡単に収たるアルゎリズムであり、自動テストに犠牲になる可胜性がありたす。

おわりに


たずめ

この蚘事では、誰にも指瀺をしたくありたせんでした。
それぞれが肩に独自の頭を持ち、それぞれが独自の結論を匕き出すこずができたす。 たたは、たったく結論を出さないでください。

もちろん、プロゞェクトの構造がどのように芋えるべきか、ファむルやディレクトリをどこに眮くべきか、リ゜ヌスがどこにあるべきかずいった、より詳现なこずを曞くこずもできたす。
クラスにメ゜ッドを実装する順序、プロパティに名前を付ける方法。

しかし、私は意識的にこれをしたせんでした゜ヌスコヌドが耇雑である必芁がないので 、材料は意図的に単玔です。

䞀緒にいおください。

Source: https://habr.com/ru/post/J251337/


All Articles