直接(使用点符号)还是通过函数访问类变量?

问题描述 投票:0回答:2
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)

我可以使用点符号直接访问温度,并且还可以使用该函数与这两者有什么区别。

swift variable-declaration
2个回答
1
投票

类成员temperature的设计不正确。它缺少封装。

由于您没有设置器,因此直接访问会更改变量,而没有其他影响。您必须知道该类的内部,以确保这不会导致不一致的状态。而且您不能指望该更改会触发任何特殊行为。

通过功能registerTemperature()的访问旨在独立于类的内部而改变温度。因此,无论内部细节如何,它都将兑现承诺。此外,如果温度计有一天会出现某种特殊行为(例如,以用户首选的度量单位更新显示,或者如果温度超过某个阈值,则发出警报)。

因此,通过函数进行访问是更安全的方法,因为它将保护您免受该类将来的发展。

可以说,班级的设计可以改进。可以将变量设为私有,以强制正确使用registerTemperature()。或变量可以获取一个setter,以便在更改其值时执行setter,以确保保留此类更改的承诺。当然,在后一种情况下,您将出于干燥目的更新registerTemperature()


0
投票

正如您所写的,没有非常重要的区别。但是您编写的代码不是正常或有用的事情。更典型的是这样的:

class ThermometerClass {
    private var temperature: Double = 0.0

    func registerTemperature(_ temperature: Double) {
        self.temperature = temperature
    }
}

现在temperatureprivate,并且您的第一种访问方式是非法的:

let thermometerClass = ThermometerClass()

// thermometerClass.temperature = 56.0 // can't happen

thermometerClass.registerTemperature(56.0)

因此,我们已经使用accessor方法来提供用于设置private属性的受控路径。因此,我们可以“在途中”做其他事情,或者简单地使用此体系结构向更广阔的世界隐藏此属性的存在。

© www.soinside.com 2019 - 2024. All rights reserved.