powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Генерация методов для свойств.
6 сообщений из 6, страница 1 из 1
Генерация методов для свойств.
    #35403820
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как реализовать генерацию методов для предопределенных свойств по типу системных propertynameDoSmth()?

Пробовал делать следующим образом:
Наследовался от какого-либо DataType класса (например %String), добавлял туда свой метод с генерацией необходимого кода в зависимости от различных параметров. Далее в нужном классе добавлял свойство по типу своего DataType и компилял. В итоге в программу добавляется нужный мне метод propertynameDoSmth(), но только он не работает должным образом, т.к. компилятор перед моим кодом добавляет следующую строчку:
Код: plaintext
New %val Set %val=..propertyname Kill %this
Соответственно после убиения переменной %this все падает.

Что делать в таком случае и как добиться правильной генерации метода?
...
Рейтинг: 0 / 0
Генерация методов для свойств.
    #35403921
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы делал с PropertyClass, например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Class User.DemoPropertyUsage Extends %Persistent [ PropertyClass = User.DemoProperties ]
{

Property B As %String;

}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Class User.DemoProperties [ Abstract ]
{

Method demo() {
	q %val
}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
USER>s p=##class(User.DemoPropertyUsage).%New()
 
USER>s p.B= 2 
 
USER>w p.Bdemo()
 2 

Хотя, тут получается один и тот же метод для всех свойств, но можно в DemoProperties добавить какой-нибудь параметр и различать по нему методы.
--------
Cache for Windows (x86-32) 2008.1 (Build 401U) Tue Feb 26 2008 11:46:52 EST
...
Рейтинг: 0 / 0
Генерация методов для свойств.
    #35405875
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой подход уже пробовался, результат тот же - компилятор добавляет в начало метода ранее упомянутую строчку и убивает переменную %this. В таком случае ни чего более, чем значение этого свойства в переменной %val я узнать не могу, а это не айс. Хочется достучаться до свойств. В Идеале - если не переопределены методы Get/Set для этого свойства, то сгенерировать для них свой код, который малость отличатся от системного... Вся проблема в генерации компилятором упомянутой строчки.

Может кто подсказать решение или хотя бы подсказать направление поиска/работы?
...
Рейтинг: 0 / 0
Генерация методов для свойств.
    #35406745
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Not ProcedureBlock пробовали?

Было бы неплохо выложить небольшой примерчик Вашего типа данных и пример его использования.

PS: Насчёт использования PropertyClass .
...
Рейтинг: 0 / 0
Генерация методов для свойств.
    #35407844
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Not ProcedureBlock тоже пробовал - результат такой же.

Вот небольшой тестовый пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Class TEST.TestObject Extends %RegisteredObject
{

Property prefix As %String;

Property value As %String;

Property name As %String;

Property fullValue As TEST.Property(PROPNAME="value");

Property fullName As TEST.Property(PROPNAME="name");

}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
IncludeGenerator %occInclude
Class TEST.Property [ ClassType = datatype ]
{

Parameter PROPNAME As STRING;

Method GetValue() As %CacheString [ CodeMode = generator ]
{
	s %code= 0 
	If %mode="method" QUIT $$$OK
	If $$$comMemberKeyGet(%class,$$$cCLASSproperty,%property,$$$cPROPcalculated) QUIT $$$OK
	if $$$comMemberKeyDefined(%class,$$$cCLASSproperty,"prefix",$$$cPROPorigin) {
		if (%parameter("PROPNAME")'="")&&$$$comMemberKeyDefined(%class,$$$cCLASSproperty,%parameter("PROPNAME"),$$$cPROPorigin) {
			$$$GENERATE("	q i%prefix_i%"_%parameter("PROPNAME"))
		} else {
			$$$GENERATE("	q i%prefix")
		}
	} else {
		$$$GENERATE("	q """"")
	}
	q $$$OK
}

}

После компиляции получаем программу TEST.TestObject.1.int :
Код: plaintext
1.
2.
3.
4.
5.
6.
zfullNameGetValue(%this) public {
	New %val Set %val=$zobjval(,/*fullName*/1, 0 , 3 , 1 ) Kill %this
	q $zobjval(,/*prefix*/4, 0 , 3 , 4 )_$zobjval(,/*name*/3, 0 , 3 , 3 ) }
zfullValueGetValue(%this) public {
	New %val Set %val=$zobjval(,/*fullValue*/2, 0 , 3 , 2 ) Kill %this
	q $zobjval(,/*prefix*/4, 0 , 3 , 4 )_$zobjval(,/*value*/5, 0 , 3 , 5 ) }

Как видно, компилятор добавляет свою строчку, где убивается %this.
Далее в терминале пробуем:
Код: plaintext
1.
2.
3.
4.
5.
s test=##class(TEST.TestObject).%New()
s test.prefix="prefix"
s test.name="name"
s test.value="value"
w test.fullValueGetValue()

В итоге получаем ошибку, которая появляется из-за отсутсвия %this:
Код: plaintext
1.
2.
3.
q $zobjval(,/*prefix*/4,0,3,4)_$zobjval(,/*value*/5,0,3,5) }
 ^
<NO CURRENT OBJECT>zfullValueGetValue+2^TEST.TestObject.1

Есили попробовать выполнить ту же строчку до убития %this, то результат будет нормальным.

В общем, основная проблема возникает из-за генерации компилятором дополнительной строчки. Как его заставить не делать этого?
...
Рейтинг: 0 / 0
Генерация методов для свойств.
    #35409496
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
IncludeGenerator %occInclude

Class TEST.Property [ ClassType = datatype ]
{

Parameter PROPNAME As STRING;

Method GetValue() [ CodeMode = generator, NoContext ]
{
	s %code= 0 
	If %mode="method" QUIT $$$OK
	If $$$comMemberKeyGet(%class,$$$cCLASSproperty,%property,$$$cPROPcalculated) QUIT $$$OK
	
	if $$$comMemberKeyDefined(%class,$$$cCLASSproperty,"prefix",$$$cPROPorigin) {
		Set %codemode=$$$cMETHCODEMODEEXPRESSION
		
		
		if (%parameter("PROPNAME")'="")&&$$$comMemberKeyDefined(%class,$$$cCLASSproperty,%parameter("PROPNAME"),$$$cPROPorigin) {
			Set %code="i%prefix_i%"_%parameter("PROPNAME")
		} else {
			Set %code="i%prefix"
		}
	}
}

}
У меня
Код: plaintext
w test.fullValueGetValue()
выдаёт "prefixvalue"
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Генерация методов для свойств.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]