2013-01-09 65 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。

相關問題