ios - 我应该使用依赖注入(inject)而不是类函数吗?

标签 ios swift

我正在阅读 https://www.raywenderlich.com/ 的博客文章关于健康包的整合。为了与 HealthKitStore 进行通信,他们使用了一个带有 class func 的类,例如 f.e.

class HealthKitSetupAssistant {
    class func authorizeHealthKit(completion: @escaping (Bool, Error?) -> Swift.Void) {
        // authorizing code
        // HKHealthStore().requestAuthorization(){}
    }
}

现在在 ViewController 中他们使用它,他们只是调用

HealthKitSetupAssistant.authorizeHealthKit { // completion handling }

我想知道这是否是最好的方法。毕竟他们与 HealthKitStore 的通信是通过 class funcs 调用的。我在许多博客中读到我应该使用 dependency injection 而不是 static functions。关于 class funcs 的观点是否不同?因此,通过 Dependency injection,我将创建我的 HealthKitSetupAssistant 类的一个实例,并将该实例传递给我需要使用它的类/函数。

我不确定我是否应该遵循这些示例并使用 class funcs(因为它感觉更清晰和容易),或者我是否仍然应该使用 依赖注入(inject)

此外,他们每次使用 HealthKitStore 时都会创建一个新实例。只创建一次实例并在我需要的任何地方使用该实例不是更好吗?

最佳答案

由你决定 - 出于教程的目的,作者可能希望让示例尽可能简单,以便读者专注于手头的内容,就像许多教程将网络代码放在 View Controller 。不推荐这样做,但这样做是为了使代码对读者尽可能简单

一般来说,静态函数和依赖注入(inject)之间的选择取决于你希望函数做什么。当过程永远不会改变并且不受外部因素的影响时,静态函数可以很好地工作,并且具有从任何地方调用的便利性。它还会告诉用户该过程不受外部因素的影响(或者至少不应受外部因素的影响),了解这一点很有用。

静态函数在这里工作得很好,因为这个函数每次都会做完全相同的事情(在这种情况下,验证权限,向用户请求权限,处理响应等),并且能够方便地从应用程序的任何地方调用。

也就是说,依赖注入(inject)可以提供更大的灵 active ,因为它减少了类之间的依赖性,并且可以允许更多不同的行为。

以这种情况为例,假设您正在开发您的 View Controller ,并且您正在测试您的状态。在您的 View Controller 中,您有这样的功能:

HealthKitSetupAssistant.authorizeHealthKit { authorized, error in
    if authorized {
        self.showAccessGrantedDialog()
    } else {
        self.showAccessDeniedDialog()
    } else if let responseError = error {
        self.showErrorMessage(error)
    }
}

在测试您的 UI 如何响应时,不断地重置和重新授予权限以查看您的应用程序如何处理不同情况可能会非常乏味,而且也可能非常耗时。

使用依赖注入(inject),您可以创建一个名为 HealthKitSetupAssistant 的协议(protocol),如下所示:

protocol HealthKitSetupAssistant {
   func authorizeHealthKit(completion: @escaping (Bool, Error?) -> Void)
}

然后为不同的行为创建不同的实例。你可以有一个 AccessGrantedAssistant,看起来像这样:

class AccessGrantedAssistant: HealthKitSetupAssistant {
    func authorizeHealthKit(completion: @escaping (Bool, Error?) -> Void) {
        //instantly authorizes
        completion(true)
    }
}

然后为 AccessDeniedAssistant 和 ErrorOccurredAssistant 创建不同的案例,这将允许您立即检查您的 UI 对每个案例的 react ,而无需一遍又一遍地完成整个设置过程。

这还允许您自动执行 UI 测试,从而保证您的 View 代码可以正确处理每种情况。

类函数不一定是“好”或“坏”,它们只是另一种工具,您不应该总是对它们使用依赖注入(inject)。它始终取决于功能的意图。对于教程/示例,它工作正常。但随着复杂性的增加,依赖注入(inject)可能是首选。

关于ios - 我应该使用依赖注入(inject)而不是类函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56273123/

相关文章:

ios - 在 iOS 中为推送通知发送报告

ios - 从API加载图像

ios - 调用 reloadRowsAtIndexPaths 方法时动态单元格高度导致反弹效果

json - 将 JSON 数据从 HTTP 请求传递到 Swift 3 中的另一个 View Controller

ios - 如何在调用 AlamoFire 的 POST 函数时使用完成处理程序?

ios - 如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?

arrays - 将多个值附加到结构中的数组?

iphone - iOS App 的系统设置是否可以通过 Enterprise Distribution 配置?

ios - react 原生 : run-ios has stopped working (ReferenceError)

ios - 计算器 : Getting runtime app crash when "Enter" button is pressed