5

我有一长串实例变量要为要为其生成代码的类创建,而不是手动执行。该列表来自现有的 SQL 数据库。我的目的是首先使用 Smalltalk 以纯面向对象的方式完成这一切,当我了解更多时,将数据保存回数据库并直接使用它。

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

事实上,有没有办法在 Smalltalk 中动态添加或修改类定义?我怀疑必须并且我想知道最佳实践方法。

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

它更像是:

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

这将导致调用

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

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

4

3 回答 3

9

在加载了重构工具的 OmniBrowser 中,您选择类并在上下文菜单Refactor class > Accessors中。

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

于 2013-01-09T12:15:40.590 回答
4

在 Squeak 中,您有Behavior>>addInstVarName: aString,例如,您可以执行以下操作:

String addInstVarName: 'foo' 

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

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


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

addVariablesNamed: aCollection on: aClass

    aCollection do: [:each | aClass addInstVarName: each]

你可以这样称呼它:

yourObject addVariablesNamed: #('foo' 'bar' 'baz') on: ClassX

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

于 2013-01-09T11:24:45.177 回答
3

在 Squeak 中,Browser在类上打开一个。如果您“右键单击”(我永远记不起按钮颜色)类列表中的类名,您将获得标准的上下文菜单 - “浏览完整 (b)”,等等。选择“更多...”,您将看到“创建 inst var 访问器”。选择它,您将获得实例变量的基本 getter 和 setter。

于 2013-01-09T12:28:09.330 回答