Как получатель/сеттер может закодировать быть произведенным автоматически для класса в Pharo или Squeak?

У меня есть длинный список переменных экземпляра, чтобы создать для класса, для которого я хочу произвести код, вместо того, чтобы сделать это вручную. Список прибывает из существующей базы данных SQL. Мое намерение состоит в том, чтобы сделать все это чистым объектно-ориентированным способом с Smalltalk сначала, и поскольку я узнаю больше, сохраняю данные назад к базе данных и работе от нее непосредственно.

Есть ли способ передать список имен к методу, который произведет их и добавит их к определению класса?

На самом деле есть ли способ добавить или изменить определения классов динамично в Smalltalk? Я подозреваю, там должен и я хотеть знать подход методов наиболее успешной практики.

Обновление: То, что я имею в виду, больше похоже на прохождение списка переменных экземпляра к методу, который создаст их автоматически.

Это больше похоже:

addVariablesиAccessors имя класса: MyClass variablesList: ('aaaa', 'bbbb', 'cccc')

который тогда приведет к требованию к

имя класса AddVariables: MyClass variableList: ('aaaa' 'bbbb' cccc')

и

generateAccessors имя класса: MyClass variableList: ('aaaa' 'bbbb' cccc')

5
добавлено отредактировано
Просмотры: 2
nl ja de

3 ответы

In OmniBrowser with the refactoring tools loaded you select the class and in the context menu Refactor class > Accessors.

Alternatively, if you only want to create an accessor for a single variable, select Refactor instance/class variable > Accessor, and select the variable you want to access.

8
добавлено

In Squeak, you have Behavior>>addInstVarName: aString, so for instance, you could do something like:

String addInstVarName: 'foo' 

Squeak also has refactoring support to generate accessors automatically. You can either use it directly or have a look at AbstractInstanceVariableRefactoring>>createAccessors to get some inspiration on how to implement your own ;-)

Другой вполне hacky, но не так необычное решение должен был бы просто произвести переменные экземпляра, но вместо того, чтобы добавить accessors, вы переписываете doesNotUnderstand: , который называют, когда неопределенного отборщика посылают в ваши объекты. Там, вы могли проверить, назвали ли вам переменную экземпляра согласно сообщению, и возвращение/изменяет его, если оно имеет место. Иначе вы просто <�кодируете> супер doesNotUnderstand: aMessage .


Относительно вашего комментария: Классы - объекты, также, таким образом, вы не должны делать ничего специального, чтобы использовать их в качестве параметров. На котором классе вы добавляете, что он полностью ваше дело и действительно не имеет значения. Таким образом, метод, чтобы добавить переменные экземпляра мог быть похожим на это:

addVariablesNamed: aCollection on: aClass

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

и вы могли назвать его как это:

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

You can find examples on how to generate accessor methods in the class CreateAccessorsForVariableRefactoring

4
добавлено
Как я сделал бы это от верхнего уровня так, чтобы я мог сделать класс параметром к функции запроса т.е. как вы определяете метод, который посещает урок в качестве параметра? К какому объекту метод приложен?
добавлено автор vfclists, источник
Я обнаружил Smalltalk в: #ClassName подход, но ваш метод более изящен. Относительно класса, чтобы приложить метод, для которого был бы самым естественным? Как высоко иерархия безопасно пойти?
добавлено автор vfclists, источник
@vfclists, пожалуйста, смотрите на обновление моего ответа;-)
добавлено автор Leo, источник
Вы могли добавить его, чтобы ClassDescription сам, тогда вы wouldn' t даже должны передать класс как параметр (потому что сам класс тогда). Вы могли звонить ClassX addVariablesNamed: aCollection в этом случае
добавлено автор Leo, источник

В Писке, открытом Браузер на классе. Если вы "щелкаете правой кнопкой мыши" (я никогда не могу помнить цвета кнопки), имя класса в списке учащихся, который вы получите, стандартное контекстное меню - "рассматривают полный (b)", и так далее. Выберите "более...", и вы будете видеть, "создают inst вар accessors". Выберите это, и вы получите основных получателей и сеттеров для переменных экземпляра.

2
добавлено