我正在为我的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)")
}
}
答案 0 :(得分:2)
我想真正的答案是:如果你知道自己在做什么,而且你已经很好地处理了如何安全地做到这一点,那么肯定。
但是,既然你问:我的答案是否定的。
如果你在任何地方使用它,你在这里显示的静态变量是单例模式。 singleton pattern通常感觉是正确的事情,但是当你开始添加线程并且想要使用不同的数据提供者时,事情开始变得越来越麻烦,越来越复杂和丑陋。 最好只使用dependency injection factory pattern使用对象实例化一次。
这样做的代码真的不多。当您想要注入它时(编译时或运行时),选择就变成了,而Swift使这一切变得非常简单。如果您想要使用示例进行编辑,请告诉我们。这样做的代码要多一些,但是从大多数情况来看,它会为你节省很多心痛。做一些关于单身人士利弊的研究。大多数人认为在大多数情况下这是一个坏主意。
我要添加a book中的一段,我强烈建议:
主要问题可能是由全球国家引起的,例如,单身人士或静态成员的使用 在你的被测单位。不仅Singletons增加了软件单元之间的耦合。他们还经常拥有一个绕过单位测试独立性的全球国家。例如,如果某个全局状态是成功测试的前提条件,但是之前的测试已经突变了该全局状态,则会导致严重的问题。 特别是在传统系统中,这些系统常常充斥着单身人士,这就引出了一个问题:如何摆脱所有那些讨厌的依赖关系,让我的代码更易于测试?嗯,这是我讨论的一个重要问题......
这本书还引用了对标志性书籍Design Patterns的作者的采访,其中作者基本上说他们不介意放弃单身模式,因为它从未正确使用过。
一本关于抽象设计模式的标志性和有影响力的书的作者开玩笑(我认为这是一个笑话)关于从他们新书修订版本中删除单身设计模式......
也许真正的答案总是没有。