构造函数中get与set工作机制:Thermostat类setter温度转换疑问
问题解答
这个设计的核心原因是遵守题目约束+遵循单一数据源的封装原则,具体可以拆成3点:
- 构造函数的入参规则要求:题目明确规定构造函数要接收华氏温度作为入参,所以类的内部存储默认就选了华氏温度作为基准值,保证初始化逻辑和后续读写逻辑的基准统一,不会出现初始化和后续赋值的基准不一致问题。
- 避免多数据源同步bug:整个类只维护
fahrenheit这一个原始存储值,不管是getter返回摄氏温度,还是setter接收摄氏温度,都只围绕这一个基准值做转换。不需要额外新增celsius属性存摄氏温度,自然也不会出现两个属性修改不同步导致的数值错误问题。 - 封装内部实现细节:getter/setter的作用就是隔离内部实现和外部接口,你对外只需要用摄氏温度读写就行,内部用什么单位存储完全不需要对外暴露。哪怕你现在不需要输出华氏温度,后续如果要扩展返回华氏温度的接口,直接读已经存好的属性就行,不需要额外做转换。
如果你想内部直接存摄氏温度也完全可行,只需要调整构造函数的初始化逻辑即可,示例如下:
class Thermostat { constructor(fahrenheit) { // 初始化时先把传入的华氏转成摄氏存储 this.celsius = (5 / 9) * (fahrenheit - 32); } get temperature() { return this.celsius; } set temperature(celsius) { this.celsius = celsius; } }
这种实现只是内部存储基准和样例代码不同,对外的使用效果完全一致,只是不符合样例的设计选择而已。
内容的提问来源于stack exchange,提问作者Đức Seven
相关产品推荐
相关产品推荐

