将数据库连接用作静态是一种好习惯吗?

时间:2018-06-03 14:10:05

标签: ios swift sqlite.swift

我正在为我的iOS应用程序使用 SQLite.swift 框架。我有DatabaseService类,我在其中创建数据库连接并执行所有CURD操作。我正在实例化这个类并在每个控制器上创建一个连接,但最近我将数据库变量更改为static并为所有控制器创建一次连接。我不确定这是不是一个好习惯。我是这样做的:

static var db: Connection?

init() {
    if DatabaseService.db != nil {
        return
    }
    let path = NSSearchPathForDirectoriesInDomains(
        .documentDirectory, .userDomainMask, true
        ).first!
    do {
        let fileManager = FileManager()
        try fileManager.copyfileToUserDocumentDirectory(forResource: "db", ofType: "sqlite3")

        // Empty database will be created if file does not exist
        DatabaseService.db = try? Connection("\(path)/db.sqlite3")

        print("Connection successful")
    } catch let error {
        print("Unable to connect with the database. \(error)")
    }
}

1 个答案:

答案 0 :(得分:2)

我想真正的答案是:如果你知道自己在做什么,而且你已经很好地处理了如何安全地做到这一点,那么肯定。

但是,既然你问:我的答案是否定的。

如果你在任何地方使用它,你在这里显示的静态变量是单例模式。 singleton pattern通常感觉是正确的事情,但是当你开始添加线程并且想要使用不同的数据提供者时,事情开始变得越来越麻烦,越来越复杂和丑陋。 最好只使用dependency injection factory pattern使用对象实例化一次。

这样做的代码真的不多。当您想要注入它时(编译时或运行时),选择就变成了,而Swift使这一切变得非常简单。如果您想要使用示例进行编辑,请告诉我们。这样做的代码要多一些,但是从大多数情况来看,它会为你节省很多心痛。做一些关于单身人士利弊的研究。大多数人认为在大多数情况下这是一个坏主意。

我要添加a book中的一段,我强烈建议:

  

主要问题可能是由全球国家引起的,例如,单身人士或静态成员的使用   在你的被测单位。不仅Singletons增加了软件单元之间的耦合。他们还经常拥有一个绕过单位测试独立性的全球国家。例如,如果某个全局状态是成功测试的前提条件,但是之前的测试已经突变了该全局状态,则会导致严重的问题。   特别是在传统系统中,这些系统常常充斥着单身人士,这就引出了一个问题:如何摆脱所有那些讨厌的依赖关系,让我的代码更易于测试?嗯,这是我讨论的一个重要问题......

这本书还引用了对标志性书籍Design Patterns的作者的采访,其中作者基本上说他们不介意放弃单身模式,因为它从未正确使用过。

一本关于抽象设计模式的标志性和有影响力的书的作者开玩笑(我认为这是一个笑话)关于从他们新书修订版本中删除单身设计模式......

也许真正的答案总是没有。