ひどいアヌキテクチャのGitHubで1.2Kスタヌを獲埗したした。 どうやっお

かなり普通の、しかし明らかになる物語を共有したい。 プロゞェクトのアむデアは3か月前に登堎し、1か月で実装され、今では2か月間、プロゞェクトはGitHubのトップに定期的にハングアップし、あらゆる皮類の専門ニュヌスリ゜ヌスに入り、蚘事「4月のトップ5ラむブラリ」のダむゞェストに登りたした。



あなたは私が自慢しおいるず思うかもしれたせんが、いいえ。 この背景は、より深い䞍協和音に必芁です。 建築に぀いお話したいです。 はい、私は知っおいたす、「 可胜な限り 」ず「 圌が自分自身に蚱可するもの 」。 しかし、パタヌンに぀いおではなく、パタヌンの䜿甚方法に぀いおお話したす。 これらは私が探しおいお愛した蚘事です。 Swiftの新しいバヌゞョンがリリヌスされたずきの゚ラヌよりも、シングルトンずファクトリヌの䟋が倚くありたす。たた、 ラむブラリヌを䟋ずしお䜿甚した䞀般的なアプロヌチに぀いお説明したす。



ダむビングの前に指瀺を読んでください。



私は、途方もないレベルのiOの開発者だずは蚀いたせんので、蚀われたこずすべおに批刀的になるようお願いしたす。 私よりも経隓豊富な人がいるず確信しおいたす。 しかし、倱われた魂にずっお、昚日配列を゜ヌトするためには、客芳的であるこずは良いこずです。 やっおみたす。



ハッチをいじめ 没入



このプロゞェクトは、暩限を䜿甚しお䜜業を簡玠化したす。 さらに、同じ通知を受信するために倉換が増加したす。 矎しいダむアログボックスが嫌いな人は誰ですか



プロゞェクトの基本芁件





残りはうたくやろうずしたしたたずえば、ビゞネスロゞックを倉曎する機胜は優先事項ではありたせんでしたが、考慮されたした



それでは話したしょう。 これは䞀般的に䟿利なこずです。 プロゞェクトをシンプルにするためには、シンプルなむンタヌフェヌスを持ち、プログラマヌに内郚の実装をロヌドしないようにする必芁がありたす。 この点で、私はAppodealからのアプロヌチに觊発されたした。 䞀般に、゚ントリポむントは1぀必芁です。 ぀たり オブゞェクトに2぀の暩限を蚭定し、芁求したした。 簡単に聞こえるはずです



すぐに巊の悪魔 肩にささやく「シングルトン...」。 そしお、最初の日は玠晎らしい゜リュヌションに思えたので、AppDelegateで構成し、コントロヌラヌを必芁な堎所に衚瀺したした。



しかし、さらに問題がありたした





䞀般に、パタヌンにはプラスよりもマむナスが倚くありたした。 ここでは、プロゞェクトを䜿甚するためのオプションに基づいおいるずいう事実に泚意を喚起したいず思いたす。 Singletonの䜿甚は正圓であるず確信しおいたすが、他の状況でもそうです。



タヌニングポむントで、私の芋解は、既知のAndroid開発者Aleksey Skutarenkoによっお確認されたした。圌はこのパタヌンを「疑わしい」ず呌びたした。 このパタヌンが嫌いなのか、それずも私のニヌズに最適に適甚できないのかは䞍明です。 しかし、20枚の叀玙を捚おお新しいものを手に入れるずいう決断が䞋されたした。 実際、マヌカヌも終了したした。



それから反察から行くこずにした。 プロゞェクトの䜿甚方法を教えおください。 私はこれを明確に衚しおいたす



class ViewController: UIViewController { var permissionAssistant = SPRequestPermissionAssistant.modules.dialog.interactive.create(with: [.Camera, .PhotoLibrary, .Notification]) override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(true) self.permissionAssistant.present(on: self) } }
      
      





゜リュヌションは自然に生たれたした。メむンクラスが必芁であり、PermissionAssistantず呌びたす。 そしお、ロゞックをキヌブロックに分割し、䟿宜䞊、それらをワヌドマネヌゞャヌず組み合わせたす。 そしお、それは論理的に、異なるタスク-したがっお、異なるクラスがそれらを担圓したす。





それでは、機胜郚分を決定したしょう。 明らかに、それらの1぀が蚱可の芁求ずそれらに関する情報の取埗を担圓したす。 PermissionsManagerず呌びたす。 芖芚的な郚分も含たれおいるため、PresenterManagerを远加したすViperの呜名芏則を所有したす。発芋者で十分な堎合がありたす。





プレれンタヌは、コントロヌラヌのプレれンテヌション、その構成、䞀般的にUIの責任を負いたすもちろん、そうする堎合。 ずころで、将来の柔軟性を高めるために、すべおの郚分がプロトコルによっお隠されおいるずいう事実に泚目したす。



柔軟性



はい たぶん最高の蚀葉ではありたせんが、本質を反映しおいたす。 朜氎艊を修理しおいるず想像しおください。ネゞマりントは29むンチの16シヌトスレッド発明されたばかりです。 毎回新しい朜氎艊を䜜成する必芁はありたせん。既知の芁件を持぀ネゞを䜜成しお固定すれば十分です。 䜜り、留めたす。



私はall話の達人ではありたせん。たずえばコヌドを芋おみたしょう。 PermissionsManagerを調べお、プロトコルず実装によっお隠されおいたす。 最初に、マネヌゞャヌの機胜を定矩したす。 2぀の方法で十分です。





機胜を奜みに合わせお拡匵できたすが、それで十分です。 そしお、プロトコル



 protocol PermissionManagerInterface { func requestPermission(_ type: PermissionType) func isAllowedPermission(_ type: PermissionType) }
      
      





私たちの堎合、これらはボヌトのプロペラの芁件です。



次に、プロトコルを実装したす。 実際のオブゞェクトネゞを取埗したす。 固定したす。 しかし、メむンクラスのアシスタント朜氎艊は、どの特定の実装どの金属から、䜕日泚入され、どのくらいの䜜業コストがかかるかを知りたせん。 メむンクラスは、2぀の関数しかないこずを知っおいたす。 実装を倉曎したい堎合-くださいビゞュアルパヌツずDataSourceのカスタマむズに特に圹立ちたす。 今から圌に぀いお話したす。



明らかに、芖芚的な郚分は単なるプレれンタヌよりもはるかに耇雑です。 良いこずには、モゞュヌルに分割する必芁がありたす。 実際には、コントロヌラヌずデヌタ゜ヌスの2぀の郚分に分けたす。



プレれンタヌはコントロヌラヌを保持し、ゞェスチャヌ、画面、およびコントロヌラヌが行うその他のこずを凊理したす。 もちろん、問題はコントロヌラヌがアクションをどのように報告するかです。 特に奜奇心ones盛な人は、「ARCは1時間ですべおを地獄に砎壊するこずはないだろうか」ずいう疑問を抱くでしょう。



最初の質問-デリゲヌトですべおが明確な堎合、2番目は1週間私の仕事を止めた問題です。 しかし、理解するために、オブゞェクト間のリンクでスキヌムを補足したした匷いリンクず匱いリンクに぀いお誰もが知っおいるこずを望みたす。質問はありたせん。



問題は明らかです願っおいたす-コントロヌラヌはAssistantオブゞェクトもちろん、プレれンタヌですが、アシスタントを保持しおいるので、リンクをドロップしたすのみを保持したす。 問題がただ明確でない堎合、私は説明したす



Assistantオブゞェクトがスコヌプ倖に出お、それに応じおARCの倖偎に投げられたず想像しおください。 コントロヌラが提瀺されなかった堎合、オブゞェクト党䜓が死にたす。 これは正しい動䜜です。 しかし、コントロヌラヌが提瀺された堎合...



その埌、スタックの重量を枬定したす。したがっお、オブゞェクトの倖郚にリンクがありたす。 しかし、アシスタントが芖線を離れるず、死んでしたいたす。 簡単な䟋でデモンストレヌションできたす。



 if true { let permissionAssistant = SPRequestPermissionAssistant.modules.dialog.interactive.create(with: [.Camera, .PhotoLibrary, .Notification]) permissionAssistant.present(on: self) }
      
      





コントロヌラヌは生きおいるが、すべおの環境クラスが死ぬ状況になりたす。 そしお、叞䌚者を務めたプレれンタヌでさえ。



悲しい



-私は考えお、たくさんのパタヌンを深く掘り䞋げ、パタヌンに぀いお読んでおそらく私はいく぀かを芋逃した、䞀般的にこの䞖界から萜ちたした。 氎泳に没頭。



問題に関する䌚話が䜕回あったか、圌は船員を埓業員の耳にさえ䞊げたした。 すべおが満堎䞀臎で繰り返されたした-「 なんおひどい建築でしょうか 」、「 著者ぞ-毒 」、「 コントロヌラヌはすべおを保持する必芁がありたす 」。 はい、コントロヌラヌを䞭倮に配眮したす。 しかし、問題は、コントロヌラヌがアシスタントを保持しおおり、初期化䞭にすぐに衚瀺されなかった堎合、オブゞェクト党䜓が死ぬこずです。 䞀般に、接続を切り替えるこずができなかったため、...



コントロヌラヌをメむンオブゞェクトずしお䜜成しおください コントロヌラヌ内でロゞックを䜜成するには-たあ、いいえ。



決定はそれ自䜓でお茶を飲みながら行われ、少し掞察力がありたした



「どうしお」



アシスタントをコントロヌラヌコントロヌラヌずしお初期化するだけです-以䞊です 芪が生きおいる間、アシスタントも生きおいたす。 たた、すべおの察話コントロヌラヌはモヌダルであるため、゜リュヌションは完党に機胜したした。 この決定は私にずっお最適であるように芋えたしたが、内郚のペダントリヌは悲しいものでした。 さあ、続けたしょう。 粟神が向䞊し、再びスピヌドが䞊がりたした



ここで、UIずPermissionManagerを分離するずよいでしょう。 ここではすべおが簡単です。次のようなPermissionInterfaceプロトコルを䜜成したす。



 protocol PermissionInterface { func isAuthorized() -> Bool func request(withComlectionHandler complectionHandler: @escaping ()->()?) }
      
      





そしお、新しいpermishinロケヌション、通知、カメラなどごずに実装したす。 そしお、PermissionManagerで必芁なPermissionクラスを䜜成し、必芁な機胜を匕き出したす。



スキヌムを曎新したす。



今、党䜓像を芋るこずができたす。 ご芧のずおり、レンガを亀換できたす。 個人的には倧䞈倫だず思う。 ブロックが䜎いほど、曞き換える必芁が少なくなりたす。 新しいコントロヌラヌを実装するには、そのむンタヌフェヌスを実装し、珟圚のシステムに実装する必芁がありたすビゞネスはどのように。 テキストず色を倉曎したいですか DataSourceプロトコルを実装したす。 特に、PresenterManagerを耇数持぀ずいうアむデアが気に入っおいたす。 ここで、ダむアログボックスず別の画面に-䞊郚にポップアップバナヌが必芁です開発䞭



ポップタむム



星の数はコヌドの品質ず匱い盞関関係があるこずを完党に理解しおいたす。明らかにテキストがそれに぀いおではないこずを願っおいたす。



プロゞェクトの進行䞭に、倚くのヒントを埗お、特定のパタヌン/アむデアが機胜しない理由を自分自身で議論するのに倚くの時間を費やしたした。 そしおそれは良いこずです 、私は倚くの仕事をしたした。



私は自分自身に助蚀を䞎える䜙裕のある開発者ずは考えおいたせん。 しかし、少し話をしたしょう。プロゞェクトに぀いお考え始めたずき、私の芪友であるGennady名前を倉曎したすは、シングルスクリヌンアプリケヌションに取り組んでいたした。 圌はVIPERでそれをしたしたが、なぜそれを䜿甚したのか、そしおなぜそれを䜿甚したのかを本圓に理解しおいたせんでした。 私の議論に



-「 問題を手攟しなさい、なぜあなたは超単玔なアプリケヌションで重いパタヌンが必芁なのか 」



圌は頑固でした。 数ヶ月が経ち、私は小さなプロゞェクトを実珟し、アパヌトを掃陀し、倧きなものを買い、顧客に仕事を匕き枡し、春が来おいる様子を芋たした。 Gennadyはアプリケヌションの䜜成を続けおいたす...



パタヌンはすべおの病気の䞞薬ではありたせん。 プロ意識の指暙ずしお、たたは「 教祖もそうする 」 ために䜿甚しないでください。 MVCから「非゚プロフスクMVC」を䜜成しおも、手は也きたせん。 これが必芁であるこずに気付いたら、パタヌンを䜿甚しおください。 それらを䜿甚しお䜜業を容易にしたす。 「 このパタヌンはクヌルなプロゞェクトで䜿甚されたす」ずいう議論は 、目暙ずはたったく無関係であり、このアプロヌチがあなたの人生を単玔化する可胜性は䜎いでしょう。



私は、パタヌンを攟棄し、コントロヌラヌにすべおを曞き、䞀般的にはVIPERから磁気銃で撃぀こずを勧めたせん。 䜿甚したすが、意図的です アヌキテクチャず実隓に特定の芁件を蚭定したす-タスクをより良く解決するものを芋぀けたす。 VIPERは完璧であるが、 プレれンタヌがあなたにずっお䞍必芁に思えるなら、捚おおください。 非叀兞的ではありたすが、最良の結果をもたらすのは、アヌキテクチャに関する経隓的な䜜業です。



私のパタヌンが䜕ず呌ばれおいるのかわかりたせんコンポヌト-しかし、私は圌が圌に割り圓おられたタスクをどのように解決するかに満足したした。 そのような結果は、パタヌンの䜿甚をもたらすはずです。



「 専門家でさえ絵コンテを䜿甚したす 」未知の著者。



すべおの成功したビルドず正統のCTR



1幎のUPD

珟圚、このプロゞェクトは 2K個以䞊の星を収集しおおり、曎新するこずが決定されたした。







新しいデザむンを芋぀けるこずに関するビデオず、プロゞェクトでラむブラリを䜿甚する方法に関する小さなチュヌトリアルを芋るこずをお勧めしたす。






All Articles