如何为Pharo或Squeak中的类自动生成getter/setter代码?

vfc*_*sts 5 code-generation smalltalk pharo getter-setter

我有一个很长的实例变量列表要为我想要生成代码的类创建,而不是手工完成.该列表来自现有的SQL数据库.我的目的是首先使用Smalltalk以纯面向对象的方式完成所有操作,并且随着我了解更多,将数据保存回数据库并直接从中进行工作.

有没有办法将名称列表传递给将生成它们的方法并将它们添加到类定义中?

实际上有一种在Smalltalk中动态添加或修改类定义的方法吗?我怀疑必须有,我想知道最佳实践方法.

更新:我想到的更像是将实例变量列表传递给将自动创建它们的方法.

它更像是:

addVariablesAndAccessors className: MyClass variablesList: ('aaaa', 'bbbb', 'cccc')

然后会调用

AddVariables className: MyClass variableList: ('aaaa' 'bbbb' cccc')

generateAccessors className: MyClass variableList: ('aaaa' 'bbbb' cccc')

Luk*_*gli 8

在OmniBrowser中加载了重构工具,您可以在上下文菜单Refactor class> Accessors中选择.

或者,如果您只想为单个变量创建一个访问器,请选择Refactor instance/class variable> Accessor,然后选择要访问的变量.


Leo*_*Leo 4

在 Squeak 中,你有Behavior>>addInstVarName: aString,所以举例来说,你可以这样做:

String addInstVarName: 'foo' 
Run Code Online (Sandbox Code Playgroud)

Squeak 还支持自动生成访问器的重构。您可以直接使用它,也可以查看一下AbstractInstanceVariableRefactoring>>createAccessors以获取有关如何实现您自己的灵感;-)

另一个相当老套但并不罕见的解决方案是只生成实例变量,但不添加访问器,而是覆盖doesNotUnderstand:,当未定义的选择器发送到对象时,它会被调用。在那里,您可以检查是否有根据消息命名的实例变量,如果是,则返回/更改它。否则你就这么做super doesNotUnderstand: aMessage


关于您的评论:类也是对象,因此您无需执行任何特殊操作即可将它们用作参数。添加到哪个类完全取决于您,并不重要。因此添加实例变量的方法可能如下所示:

addVariablesNamed: aCollection on: aClass

    aCollection do: [:each | aClass addInstVarName: each]
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

yourObject addVariablesNamed: #('foo' 'bar' 'baz') on: ClassX
Run Code Online (Sandbox Code Playgroud)

您可以在类中找到有关如何生成访问器方法的示例CreateAccessorsForVariableRefactoring