Swift - 什么是全局变量更好的替代品?
Swift - What is a better alternative to Global Variables?
上下文
你好,
我喜欢使用全局变量来调用管理器或服务来处理某些代码。
但是我的代码分析器 (SonarQube) 中出现了代码异味。
问题
形式A和形式B有很大区别吗?或者我根本不应该使用任何一个?
我更喜欢形式 A,但我想避免/抑制/解决代码异味。
表格 A
一些例子,我更喜欢的是:
app.logout()
cameraManager.doSomething()
userDefaults.set(.example, true)
analytics.logEvent(.clicked_button)
popupManager.showPopup(message: "Hello world!")
以上可以通过以下方式实现:
var app = Global()
class Global {
}
表格 B
另一种选择是:
class Global {
private init() {}
public static let app = Global()
}
用法将更改为 Global.app.logout()
代码味道
我部分同意这些观点,但表格 B 不是同样重要吗?
如果是这样,是否有比我上面显示的更好的方法?
我很想听听您的见解!
您面临的问题是全局变量本身通常被认为是一种代码味道。
本质上,您是在说“我喜欢 <code smell>
,但我的代码分析器将其标记为代码异味。”
您是否考虑过让您的经理对象成为单身人士?考虑一下 Apple 用于 UserDefaults
之类的模式(一个 class var standard
,returns 共享 UserDefaults
对象。)
编辑:
重读你的问题,我想这就是你在表单 B 中的建议。这使得静态变量成为 class 的 class 变量,并将对象变成单例。这与全局不太一样。
上下文
你好,
我喜欢使用全局变量来调用管理器或服务来处理某些代码。
但是我的代码分析器 (SonarQube) 中出现了代码异味。
问题
形式A和形式B有很大区别吗?或者我根本不应该使用任何一个? 我更喜欢形式 A,但我想避免/抑制/解决代码异味。
表格 A
一些例子,我更喜欢的是:
app.logout()
cameraManager.doSomething()
userDefaults.set(.example, true)
analytics.logEvent(.clicked_button)
popupManager.showPopup(message: "Hello world!")
以上可以通过以下方式实现:
var app = Global()
class Global {
}
表格 B
另一种选择是:
class Global {
private init() {}
public static let app = Global()
}
用法将更改为 Global.app.logout()
代码味道
我部分同意这些观点,但表格 B 不是同样重要吗? 如果是这样,是否有比我上面显示的更好的方法?
我很想听听您的见解!
您面临的问题是全局变量本身通常被认为是一种代码味道。
本质上,您是在说“我喜欢 <code smell>
,但我的代码分析器将其标记为代码异味。”
您是否考虑过让您的经理对象成为单身人士?考虑一下 Apple 用于 UserDefaults
之类的模式(一个 class var standard
,returns 共享 UserDefaults
对象。)
编辑:
重读你的问题,我想这就是你在表单 B 中的建议。这使得静态变量成为 class 的 class 变量,并将对象变成单例。这与全局不太一样。