iOSアプリケヌションの䟝存関係を正しく管理するTyphoonの玹介

「十分に分析された魔法は、技術ず芋分けが぀きたせん。」



アヌサヌ・クラヌク

Typhoon Frameworkプロゞェクトの公匏wikiの゚ピグラフ







サむクル「iOSアプリケヌションの䟝存関係を正しく管理する」





はじめに



このシリヌズの蚘事の䞀郚ずしお、私は理論を掘り䞋げず、 䟝存性反転の原理たたは䟝存性泚入のパタヌンを怜蚎したす-読者はすでにZenを孊習する準備ができおいるこずを圓然ず芋なし、実践に盎行したす理論に慣れるためのリンクはポストの最埌。



Typhoon Frameworkは、Objective-CおよびSwiftアプリケヌション向けのDIコンテナの最も有名で人気のある実装です。 プロゞェクトは非垞に若いです-最初のコミットは2012幎の終わりに行われたしたが、すでに倚くのファンを獲埗しおいたす。 䜜成者によるプロゞェクトの積極的なサポヌトそのうち1぀はオムスクに䜏んでいたすは特筆に倀したす-䜜成された問題の倧郚分は10分以内に回答され、数時間埌にチヌム党䜓がディスカッションに参加したす。



台颚が必芁なのはなぜですか 略語で答えたす-IoC。 私はすでに理論に入らないこずを玄束しおいるので、 Martin Fowlerに蚀及するだけです。







Typhoonの䞻な機胜をいく぀か芋おみたしょう。これは、iOS開発者の泚目を集めるのに十分なはずです。





基本的なプロゞェクト統合



Typhoonがクリヌンなアプリケヌションに簡単に統合できるこずを瀺すために、適切な方法でアプリケヌションを構成できるAppDelegateでstartUpConfiguratorオブゞェクトを実装する堎合を考えたす。



@interface RIAppDelegate @property (strong, nonatomic) id <RIStartUpConfigurator> startUpConfigurator; @end
      
      





  1. 独自のサブクラスTyphoonAssembly DIコンテナヌを䜜成したす。



     @interface RIAssembly : TyphoonAssembly - (RIAppDelegate *)appDelegate; @end
          
          





    実際、このメ゜ッドはむンタヌフェむスで宣蚀されおいない堎合がありたすが、教育目的のためにここに残しおおきたす。



  2. RIAssemblyの実装を実装したす。



     @implementation RIAssembly - (RIAppDelegate *)appDelegate { return [TyphoonDefinition withClass:[RIAppDelegate class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(startUpConfigurator) with:[self startUpConfigurator]]; } } - (id <RIStartUpConfigurator>)startUpConfigurator { return [TyphoonDefinition withClass:[RIStartUpConfiguratorBase class]]; } @end
          
          





    コンフィグレヌタにTyphoonDefinitionを返すメ゜ッドでは、远加の泚入は実行されたせんが、今埌これが発生するのを防ぐものは䜕もないこずに泚意しおください。 たずえば、アプリケヌションのkeyWindowを枡しお、 rootViewControllerを蚭定できたす。



  3. 定矩䞊、DIコンテナヌは可胜な限り自動化する必芁がありたす 。TyphoonAssemblyから䜕かを手動で芁求するこずは望たしくありたせん。 最良のオプションは、 Info.plistファむルを䜿甚するこずです。 私たちに必芁なのは、特定のキヌの䞋に、アプリケヌションの起動時にアクティブ化する必芁があるファクトリのクラスの名前を远加するこずです。







    これで蚭定党䜓が完了したす。 最埌に䜕が埗られたか芋おみたしょう。



  4. -applicationDidFinishLaunchingメ゜ッドにブレヌクポむントを蚭定し、アプリケヌションを実行したす。







    コンフィギュレヌタヌは、必芁なクラスを正垞に挿入したした RIAppDelegate自䜓は、定矩したプロトコルに埓っお動䜜するこずを思い出しおください。


ご芧のずおり、Typhoonの基本的な統合には数分しかかかりたせん。 さらに、フレヌムワヌクを長い蚘述のアプリケヌションに埋め蟌むこずができたすが、この堎合、喜びの皋床はコヌド蚭蚈の品質に䟝存したす。



しかし、セットアップ手順に興味がある人は-RamblerプロゞェクトでTyphoonを䜿甚する実際のケヌスを芋おみたしょう。



Rambler。MailでのTyphoonの䜿甚䟋



  1. 特定のプロトコルを実装する単玔なむンスタンスを䜜成するには、䜜成したオブゞェクトのクラスを指定するだけです。



     - (id <RCMStoryboardBuilder>)storyboardBuilder { return [TyphoonDefinition withClass:[RCMStoryboardBuilderBase class]]; }
          
          





  2. RCMAuthorizationPopoverBuilderBaseにはstoryboardBuilderオブゞェクトが必芁です。このオブゞェクトは䜜成方法を既に孊習しおいたす。 䟝存関係グラフに挿入するには、適切なメ゜ッド[self storyboardBuilder]を呌び出すだけです。 したがっお、クラスのむンスタンスを䜜成するだけでなく、そのすべおの䟝存関係もむンストヌルしたした。



     - (id <RCMPopoverBuilder>)authorizationPopoverBuilder { return [TyphoonDefinition withClass:[RCMAuthorizationPopoverBuilderBase class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(storyboardBuilder) with:[self storyboardBuilder]]; }]; }
          
          





  3. RCMNetworkLoggerBaseクラスのオブゞェクトをシングルトンにしたい-オブゞェクトのラむフサむクルの蚭定を担圓するTyphoonDefinitionの scopeプロパティがこれに圹立ちたす。



     - (id <RCMLogger>)networkLogger { return [TyphoonDefinition withClass:[RCMNetworkLoggerBase class] configuration:^(TyphoonDefinition *definition) { definition.scope = TyphoonScopeSingleton; }]; }
          
          





  4. TyphoonがInitializer Injectionを実装する方法を芋おみたしょう。 動䜜するには、蚭定サヌビスには2぀の必須の䟝存関係が必芁です。ネットワヌク芁求を凊理できるnetworkClientず 、さたざたなナヌザヌ資栌情報を栌玍するcredentialsStorageです。 TyphoonDefinitionの-useInitializerメ゜ッドは、特定の初期化セレクタヌず、パラメヌタヌが初期化子に埋め蟌たれおいるブロックを受け入れたす。



     - (id <RCMSettingsService>)settingsService { return [TyphoonDefinition withClass:[RCMSettingsServiceBase class] configuration:^(TyphoonDefinition *definition) { [definition useInitializer:@selector(initWithClient:sessionStorage:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:[self mailXMLRPCClient]]; [initializer injectParameterWith:[self credentialsStorage]]; }]; }]; }
          
          





  5. 次に、メ゜ッドむンゞェクションの実装を調べおみたしょう。 ゚ラヌサヌビスは、受信したNSErrorをすべおの眲名枈みハンドラヌに送信できたす。 未凊理の゚ラヌがすべおログに蚘録されるようにするには、サヌビスを䜜成した盎埌に暙準ハンドラヌに眲名したす。



     - (id <RCMErrorService>)errorService { return [TyphoonDefinition withClass:[RCMErrorServiceBase class] configuration:^(TyphoonDefinition *definition) { [definition injectMethod:@selector(addErrorHandler:) parameters:^(TyphoonMethod *method) { [method injectParameterWith:[self defaultErrorHandler]]; }]; }]; }
          
          





  6. アプリケヌションのすべおのViewControllersには、3぀の䟝存関係が必芁です。゚ラヌ凊理サヌビス、受信したすべおのNSErrorオブゞェクトが通過する、いく぀かの䞀般的な゚ラヌコヌドを適切に凊理できる基本゚ラヌハンドラ、および基本ルヌタヌです。 すべおのコントロヌラヌでこのコヌドの重耇を避けるために、これら3぀の䟝存関係をベヌスのTyphoonDefinitionに泚入したした 。 他のメ゜ッドで䜿甚するには、単に芪プロパティを蚭定したす。



     - (UIViewController *)baseViewController { return [TyphoonDefinition withClass:[UIViewController class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(errorService) with:[self.serviceComponents errorService]]; [definition injectProperty:@selector(errorHandler) with:[self baseControllerErrorHandler]]; [definition injectProperty:@selector(router) with:[self baseRouter]]; }]; } - (UIViewController *)userNameTableViewController { return [TyphoonDefinition withClass:[RCMMessageCompositionViewController class] configuration:^(TyphoonDefinition *definition) { definition.parent = [self baseViewController]; [definition injectProperty:@selector(router) with:[self settingsRouter]]; }]; }
          
          





    Typhoonを䜿甚するず、TyphoonDefinitionsの継承のはるかに耇雑なチェヌンを構築できるこずに泚意しおください。



  7. APIのURLをハヌドコヌディングする代わりに、構成plistファむルに保存したす。 この状況で、Typhoonは以䞋を支揎したす-必芁なファむルをアップロヌドし、そのフィヌルドをネむティブオブゞェクトこの堎合はNSURL に倉換し、 蚭定フィヌルドにアクセスするための䟿利な構文TyphoonConfigKEYを提䟛したす。



     - (id)configurer { return [TyphoonDefinition configDefinitionWithName:RCMConfigFileName]; } - (id<RCMRPCClient>)idXMLRPCClient{ return [TyphoonDefinition withClass:[RCMRPCClientBase class] configuration:^(TyphoonDefinition *definition) { [definition useInitializer:@selector(initWithBaseURL:) parameters:^(TyphoonMethod *initializer) { [initializer injectParameterWith:TyphoonConfig(RCMAuthorizationURLKey)]; }]; }]; }
          
          







神話



Typhoon Frameworkに衚面的にのみ興味を持っおいる人の䞭には、事実䞊基瀎がないいく぀かの神話がありたす。



  1. 高い゚ントリヌしきい倀

    実際、゜ヌスコヌド、ドキュメント、サンプルプロゞェクトちなみに既に3぀ありたすを掘り䞋げるず、Typhoonの基本原則を理解し、プロゞェクトで䜿甚を開始できたす。 深く掘り䞋げたくない堎合は、䟋を䜿わずに、フレヌムワヌクをコヌドに遅滞なく統合できたす。



  2. デバッグぞの匷い圱響

    実際、私たちのコヌドずTyphoonの間には実際の連絡先はそれほど倚くありたせん。これらの分岐点では、開発者は既に有益な䟋倖を持っおいたす。



  3. Typhoonがサポヌトを停止した堎合、プロゞェクトから陀倖しない

    台颚は、私たちが実際にどこでも盎接察話しないため、良いです-したがっお、それを拒吊するこずは困難ですが、それでも可胜です-自分のレベルの工堎ずそれをコヌドず統合するためのメカニズムを手動で䜜成しおください。



  4. しかし...スりィズルもありたす

    Objective-Cはそのランタむムで有名であり、そのようなフレヌムワヌクでその機胜を䜿甚しないこずは少なくずも愚かです。 さらに、このコンポヌネントを「ブラックボックス」ずしお䜿甚したす。これは、同じ1200のスタヌがすべおのレヌキをすでに螏んでいるずいう事実に䟝存しおいたす。



  5. 自転車を曞くこずができるのになぜTyphoonが必芁なのですか

    Typhoon Frameworkは、画面間を移動するずきにオブゞェクトのグラフを䜜成し、䟝存関係を枡すコヌドの量ず耇雑さを倧幅に削枛したす。 さらに、セルフサヌビスのサヌビスロケヌタヌの䞍利な点なく、集䞭管理された䟝存関係管理を提䟛したす。 読者は誰でも簡単なファクトリヌを䜜成できるず思いたすが、プロゞェクトが発展するに぀れお、このアプロヌチの制限に盎面し続けるこずになりたす-そしお、長い間考え出しおデバッグしたものを実装するか、プロゞェクトの機胜ずパフォヌマンスを犠牲にする必芁がありたす。


おわりに



圓初、私はRambler.iOSでのスピヌチを完党に翻蚳しお印刷する぀もりでしたが、2、3のセクションを曞いた埌、1぀の蚘事には資料が倚すぎるこずに気付きたした。 したがっお、次のシリヌズでは



サむクル「iOSアプリケヌションの䟝存関係を正しく管理する」





䟿利なリンク






All Articles