2013-01-09 28 views
4

我有一个很长的实例变量列表,用于为我想为其生成代码的类创建实例变量,而不是手动创建。该列表来自现有的SQL数据库。我的意图是先用Smalltalk以纯面向对象的方式完成所有工作,并且随着我学习更多,将数据保存回数据库并直接使用它。如何为Pharo或Squeak中的课程自动生成getter/setter代码?

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

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

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

它更像:

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

然后这将导致一个呼叫到

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

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

回答

3

在佳乐,你有Behavior>>addInstVarName: aString,所以例如,你可以这样做:

String addInstVarName: 'foo' 

佳乐也有重构支持自动生成访问器。你可以直接使用它或看看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

+0

我将如何从顶层做到这一点,以便我可以使类成为调用函数即参数。你如何定义一个将类作为参数的方法?该方法附加了什么对象? – vfclists

+1

@vfclists请看看我的答案的更新;-) – Leo

+0

我发现'Smalltalk at:#ClassName'方法,但你的方法更优雅。关于类附加最自然的方法?可以安全走多远? – vfclists

7

在加载重构工具的OmniBrowser中,选择类并在上下文菜单中重构类>访问器

或者,如果您只想为单个变量创建访问器,请选择重构实例/类变量>访问器,然后选择要访问的变量。

2

在Squeak中,在课堂上打开Browser。如果您在班级列表中右键单击(我永远不会记住按钮颜色)班级名称,您将获得标准上下文菜单 - “浏览完整(b)”,依此类推。选择“more ...”,你会看到“创建inst var访问器”。选择它,你将得到实例变量的基本getter和setter。

相关问题