You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Smalltalk/Pharo中,直接访问实例变量还是用self?哪种更规范?

Smalltalk/Pharo中Counter类increment方法的规范写法解析

嘿,这个问题问到点子上了!在Smalltalk(以及Pharo、Squeak这类衍生方言)的编程规范里,方式一的写法是更符合社区最佳实践的,原因主要集中在面向对象的核心原则和代码可维护性上:

  • 坚守封装性原则
    Smalltalk是面向对象思想的标杆,封装是其核心特性之一。实例变量count属于对象内部的状态,直接通过count := count + 1操作(方式二)相当于把内部状态暴露给了外部(哪怕是同一个类的方法)。而通过访问器方法self count(取值)和self count:(赋值)来操作,能把状态的访问逻辑统一收口:如果后续需要给count的修改加额外逻辑——比如范围校验、状态变更通知、日志记录——只需要修改访问器方法,所有调用这些方法的代码都会自动生效,不用逐个修改直接操作实例变量的地方。

  • 提升继承灵活性
    假设后续需要创建Counter的子类(比如LimitedCounter,限制count的最大值),用方式一的写法,子类只需要重写count:方法来添加限制逻辑,原有的increment方法完全不用改动就能继承使用子类的规则。但如果用方式二直接操作实例变量,子类想要修改increment的行为,就必须重写整个increment方法,这既冗余又违反了“对扩展开放、对修改关闭”的开闭原则。

  • 保持代码一致性
    Smalltalk社区长期以来都遵循“通过访问器访问实例变量”的惯例,统一的风格能让其他开发者更快理解你的代码,也避免了不同方法中状态操作方式不一致带来的维护混乱。

举个实际的例子,要是后来需要给count的修改加日志,用方式一的话只需要修改访问器方法:

count: aNumber
    Transcript show: 'Count updated from ', count asString, ' to ', aNumber asString; cr.
    count := aNumber

所有调用self count:的方法(包括increment)都会自动带上日志功能,而方式二的话,每个直接写count := ...的地方都要手动加日志代码,效率极低还容易遗漏。

内容的提问来源于stack exchange,提问作者On The Net Again

火山引擎 最新活动