it-swarm-ja.com

MVVMアーキテクチャを使用して依存性注入を実装するためのより良いアプローチは何ですか?

コントローラ内でDispatchQueueを使用し、依存関係として渡す必要があります。これは私がこれまでに試し、2つの解決策を考え出したものです。他の開発者がより良く、一般的に使用しているものを尋ねる必要があります。

protocol DispatchQueuerable: class {
    func perform(withDelay delay: Double, block: @escaping () -> Void)
    func performAsync(block: @escaping () -> Void)
}

最初の解決策:

class DispatchQueuer: DispatchQueuerable {
    private let queue: DispatchQueue
    init(queue: DispatchQueue) {
        self.queue = queue
    }
    func perform(withDelay delay: Double, block: @escaping () -> Void) {
        queue.asyncAfter(deadline: .now() + delay as DispatchTime, execute: block)
    }
    func performAsync(block: @escaping () -> Void) {
        queue.async {
            block()
        }
    }
}

2番目の解決策:

extension DispatchQueue: DispatchQueuerable {
    func perform(withDelay delay: Double, block: @escaping () -> Void) {
        asyncAfter(deadline: .now() + delay as DispatchTime, execute: block)
    }
    func performAsync(block: @escaping () -> Void) {
        async {
            block()
        }
    }
}

私の質問は、コードの密結合を回避し、MVVM Archtectureを適切に使用するためのより良いアプローチとは何ですか?

どうすれば使用できますか?

最初の解決策:

let queuer = DispatchQueuer(queue: DispatchQueue.main)
MyViewController(queuer: queuer)

class MyViewController: UIViewController {
    private let queuer: DispatchQueuer
    init(queuer: DispatchQueuer) {
        self.queuer = queuer
    }
}

2番目の解決策:

let queue = DispatchQueue.main
MyViewController(queue: queue)

class MyViewController: UIViewController {
    private let queue: DispatchQueue
    init(queue: DispatchQueue) {
        self.queue = queue
    }
}

私は最初の解決策が本当に好きで、それを知っていますが、それについてどう思いますか?

実際の質問に入る前に、MyViewControllerクラスの使用方法を調べ始めても、2つのソリューションの違いを見つけるのは簡単ではなかったことをお伝えしたいと思います。次に、非常によく似た名前の2つのクラスを使用していることがわかりました。私の見解では、クラスの名前DispatchQueuerDispatchQueueに非常に近いものです。あなたは間違いなくそれの別の名前を見つける必要があります。

ソリューションの結合についての質問については、状況によって異なります。コンパイル時の依存関係は同じです。それでも、DispatchQueuerableプロトコルへの機能依存性は、最初のソリューションのMyViewControllerclassのユーザーにとってより明白です。これとは反対に、拡張機能を使用する2番目のソリューションでは、プロトコルに隠された依存関係が導入されます(拡張機能のソースコードを配置する場所によって異なります)。それでも、このソリューションはそれを行うためのより迅速な方法であり、経験豊富なSwift開発者はおそらくこのソリューションを好むでしょうが、OO開発者は簡単にあなたに従うことができます最初の解決策。

1
Jan Linxweiler

最も確かに後者を選ぶ。 Swiftの最大の強みの1つは、遡及的モデリングのサポートです。それを利用してください。

Swiftでは、既存のタイプを新しいプロトコルに準拠させることができるため、基本的にラッパーデザインパターンを使用する必要はありません。