class ThermometerClass {
var temperature: Double = 0.0
func registerTemperature(_ temperature: Double) {
self.temperature = temperature
}
}
let thermometerClass = ThermometerClass()
thermometerClass.temperature = 56.0
thermometerClass.registerTemperature(56.0)
我可以使用点符号直接访问温度,并且还可以使用该函数与这两者有什么区别。
类成员temperature
的设计不正确。它缺少封装。
由于您没有设置器,因此直接访问会更改变量,而没有其他影响。您必须知道该类的内部,以确保这不会导致不一致的状态。而且您不能指望该更改会触发任何特殊行为。
通过功能registerTemperature()
的访问旨在独立于类的内部而改变温度。因此,无论内部细节如何,它都将兑现承诺。此外,如果温度计有一天会出现某种特殊行为(例如,以用户首选的度量单位更新显示,或者如果温度超过某个阈值,则发出警报)。
因此,通过函数进行访问是更安全的方法,因为它将保护您免受该类将来的发展。
可以说,班级的设计可以改进。可以将变量设为私有,以强制正确使用registerTemperature()
。或变量可以获取一个setter,以便在更改其值时执行setter,以确保保留此类更改的承诺。当然,在后一种情况下,您将出于干燥目的更新registerTemperature()
。
正如您所写的,没有非常重要的区别。但是您编写的代码不是正常或有用的事情。更典型的是这样的:
class ThermometerClass {
private var temperature: Double = 0.0
func registerTemperature(_ temperature: Double) {
self.temperature = temperature
}
}
现在temperature
为private
,并且您的第一种访问方式是非法的:
let thermometerClass = ThermometerClass()
// thermometerClass.temperature = 56.0 // can't happen
thermometerClass.registerTemperature(56.0)
因此,我们已经使用accessor方法来提供用于设置private属性的受控路径。因此,我们可以“在途中”做其他事情,或者简单地使用此体系结构向更广阔的世界隐藏此属性的存在。