Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Я правильно понимаю, что при наследовании в расчетном свойстве имя класса можно узнать только так: Код: plaintext что-то использование %%CLASSNAME не помогает - в нем всегда имя суперкласса... Неужто нет более простого пути? Замысел в том, чтобы в предке определить свойство так: Код: plaintext 1. 2. 3. И еще тогда вопрос. Как "правильнее" обозвать метод - "GetIsAny" или "IsAnyGet"? Какие-то же должны быть соображения в пользу одного или другого варианта (вроде бы второй как бы конфликтует с темой геттера, но компилится без ошибок и работает, на первый взгляд, нормально). Тем более, что Каше не даст в наследнике определить это свойство, как не расчетное (хранимое, например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 11:09 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
По-прежнему прячете методы в параметр свойства... Но виноват и могу предложить такой способ: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Короче нуждается в доработке К тому же я столкнулся с ошибкой при получении {%%CLASSNAME}. В некоторых случаях, что-то происходит, и SQL так и возвращает "%CLASSNAME". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 14:25 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefint, %%CLASSNAME подставляется в момент компиляции и у всех унаследованных классов будет один вроде как.... если только не переписать метод для потомков, НО 1. select капитан from баржа и 2. select капитан from плавсредство в случае, если "капитан" - расчитывается например, для баржи на основании информации об отпусках - "Вася в отпуске, значит капитан - Петя" а для плавсредства там пустышка лежит ("У плавсредства не всегда есть капитан, например, у баржи есть, а у плотика - нету, потому рассчитывать конкретных капитанов поручено потомкам, среди которых и "баржа") Так вот - 2-й запрос вернет пусто для всех записей - в т.ч. и для барж. Задачка в том, чтобы при расчете свойства капитан в "плавсредстве" вызвать не пустой его метод, а выяснить для начала, что наше плавсредство - конкретно "баржа" и использовать метод расчета оттуда. Понятно, что есть соответствующий паттерн. Но Каше его не выполняет физически - он при работе через объект отработает верно, а при работе через скл "забудет" о наследовании... Всего-то дел, обойти ситуацию... Не увидел отличий в наших предложениях... Да, "всего лишь имя последнего класса"... т.е. класса, к которому реально относится мой экземпляр и метод которого нужно заставить вызвать нерадивого предка, который норовит вызвать свой метод... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 16:07 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Ну так и обойдите, зачем так упираться в рассчитываемые свойства. В родителе Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. В потомках Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 16:42 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
"всего-лишь имя последнего класса" - это я к тому, что могут быть проблемы с именами пакетов kolesov Не увидел отличий в наших предложениях Хм, определение имени класса не относится к функции класса предметной области и должно быть вынесено в отдельный класс (программу) и т.д. Но это я опять, о своем... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 16:49 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefint, Но ведь с классами-то как раз нет проблем - там все при наследовании схватывается хорошо. Определение имени класса действительно будет не здесь... Оно будет (и уже есть ;) на самом верху наследования - у того класса, от которого я наследую все хранимые классы своей системы... Реальный код выглядит так: Код: plaintext 1. 2. Код: plaintext 1. 2. А излишнее поклонение идолу, с названием "Домэин Моудел", кстати, часто превращает код в совершенно нечитаемый набор "постоянных вызовов неизвестно чего неизвестно откуда" ;) Я склонен с сомнением относиться к фразе про то, что в методе должно быть 5-10 строк... Нужно взвешивать еще и читабельность кода... пусть она даже будет и в ущерб принципам распределения обязанностей в модели предметной области... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 17:10 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Ну вот... бяка была вот в чем: <METHOD DOES NOT EXIST>%0AmBr7^CacheSql9 *IsConfirmNeededGet Эта ошибка произошла в связи с тем, что у потомка не был переопределен наш метод расчета свойства.... Т.е. если зайти с той стороны, откуда попытался зайти я, снова упираемся в то, что скл слабо разбирается в наследовании... Итого получается, что даже если метод расчета есть в предке, в потомке я его должен все равно написать, чтобы иметь к расчетному свойству нормальный доступ через скл. Или использовать хранимку... но это мне не очень симпатично - громоздко выглядит ее вызов в коде ;( Или идти по старому пути - в родительском методе обсчитывать свойство исходя из того, какого класса объект выбран... это-то точно работает ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 17:23 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovчто в методе должно быть 5-10 строк не более чем рекомендация. [quote kolesov]обсчитывать свойство исходя из того, какого класса объект выбран... это-то точно работает[quote] но как "идеологически" неправильно :), наследование как раз для этого. Лучше хранимку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 17:31 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Вообще с расчетными свойствами что-то не так, суть есть оболочка над методами класса (что с точки зрения SQL = хранимая процедура). Имхо, надо использовать только в самых простых случаях Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 17:42 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovОно будет (и уже есть ;) на самом верху наследования Хм, как-то сомневаюсь я. У меня вообще в программе $$getName^class(bclass,xclass). На крайний случай в класс с утилитами. kolesovА излишнее поклонение идолу, с названием "Домэин Моудел" ... "постоянных вызовов неизвестно чего неизвестно откуда" "Шо занадта, то не здрово". Излишнее поклонение чему угодно, приводит к печальным последствиям. Код: plaintext Проблемы? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 17:51 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefintИ то лишь из за компактности. И тоже, имхо, но зачем Вы их так активно используете? По многим причинам... навскидку: - архитектура системы становится легкой и понятной; - каше позволяет (2 млн. таких свойств расчитывается за 30 сек, а если в выборке есть ограничения, например по интервалу дат, где есть индексы, то расчет - меньше секунды) - ZEN располагает к их использованию (вместо сложностей с colExpression в таблице могу просто указать colName и не заботиться о том, как по таким полям сортировать и фильтровать) - совместно с "->", и наследованием, на мой взгляд, является основным преимуществом перед обычным скл, где я писал и вызывал хранимки (ведь и сейчас можно по-честному джойнить таблицы... Вы это делаете? я - нет...) - если в хранимую процедуру передается только ID - она первый кандидат в вычисляемое свойство, потому что хранимки в каше, имхо, нужны для более сложных вещей (вычислить значение на дату или для конкретного юзера...) - это работает. 2 года. и не было пока ни одного случая, чтобы при падении производительности ее нельзя было вырастить в 100 или 100 000 (и такое бывало ;) раз. - ... МастХэв, в опчем ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:03 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovЯ правильно понимаю, что при наследовании в расчетном свойстве имя класса можно узнать только так: Код: plaintext что-то использование %%CLASSNAME не помогает - в нем всегда имя суперкласса... Неужто нет более простого пути? Свойство {x__classname} не всегда бывает определено, т.е. вышеприведенный код может вернуть пустую строку (с последующей ошибкой "класс не существует" в $zobjclassmethod()). Есть метод %ClassName(), который возвращает имя класса открытого объекта: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:08 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Как вариант: Код: plaintext 1. 2. 3. 4. Если знаете английский, то здесь есть более правильное решение Вашей проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:17 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefint Код: plaintext 1. Ну вот опять!? Это НЕ РАБОТАЕТ!!! Вернее работает, но неправильно... зато очень прикольно характеризует движок, я рыдал: Код: plaintext 1. 2. Код: plaintext Результат приводить не буду... но поверьте, он печальный... Вывод - хранимки и каше еще менее совместимы, чем расчетные поля и каше ;( Во всяком случае, при наследовании... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:18 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
TurkСвойство {x__classname} не всегда бывает определено Опаньки, а КОГДА оно бывает неопределено? Я думаю, я бы об этом знал... пользователи позвонили бы ;) TurkЕсть метод %ClassName(), который возвращает имя класса открытого объекта: Код: plaintext 1. 2. 3. У меня одна сотрудница, по неопытности, и давно, что-то подобное сделала... Хорошо, вовремя заметили.... На миллионах записей такой код положит сервер... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:22 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovПо многим причинам... навскидку: Итого - Zen, все остальное прекрасно существует без Calculated свойств. Которые как мы помним kolesovТам с этими расчетными свойствами вообще-то песня и неприятностей много (не программу пишешь, а по болоту по кочкам прыгаешь) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:33 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefint, Я и ко всему Каше примерно так отношусь... что с того... Он куплен, и никуда я с подводной лодки не денусь ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 18:38 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
servit дал ссылку на надежное решение (блин, можно было бы и самому дойти) в родительском классе Код: plaintext 1. 2. 3. 4. 5. "Select ID,ParentClass_GCN(ID) From ChildrenClass" - работает' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 19:32 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesov и не было пока ни одного случая, чтобы при падении производительности ее нельзя было вырастить в 100 или 100 000 (и такое бывало ;) раз. Можно я ссылку на это в разделе "Сравнения СУБД" запощу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 19:38 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovTurkСвойство {x__classname} не всегда бывает определено Опаньки, а КОГДА оно бывает неопределено? Я думаю, я бы об этом знал... пользователи позвонили бы ;) Цитата : Код: plaintext Для проверки выполните в области SAMPLES: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2010, 19:43 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
doublefintProperty ClassName as %String[InitialExpression={..%ClassName(1)},ReadOnly]; Да, я как раз вчера об этом и думал вечером - как мне это свойство установить у примерно 3 млн. объектов в работающей системе. Нет соображений? С учетом того, что у меня нет уверенности, что часть объектов БД даст себя сохранить (при наступлении определенных условий изменения некоторых объектов запрещены ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 05:07 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesov, Когда-то давно столкнулись с такой проблемой и сразу же завели такое свойство в родителе: Код: plaintext 1. Заапдейтить поле не проблема ручками через SQL, если таблиц немного.. Код: plaintext Только не забудьте снять ReadOnly со свойства перед этим... Вычисляем свойства так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 06:21 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesovTurkСвойство {x__classname} не всегда бывает определено Опаньки, а КОГДА оно бывает неопределено? Я думаю, я бы об этом знал... пользователи позвонили бы ;) Например, так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. kolesov TurkЕсть метод %ClassName(), который возвращает имя класса открытого объекта: Код: plaintext 1. 2. 3. У меня одна сотрудница, по неопытности, и давно, что-то подобное сделала... Хорошо, вовремя заметили.... На миллионах записей такой код положит сервер... Если не закрывать открытый объект ( kill, не %Close()! ), то да - рано или поздно Cache "встанет". Можно также передать открытый объект в вызываемый метод вместо ID (если конечно ID внутри медота используется для открытия объекта) и лишь после этого закрывать этот объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 08:58 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
kolesov, Если сложная логика, вернитесь (осторожно!!! - не забываем про пакеты и пустые значения) к использованию служебного свойства x__classname, у меня работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2010, 09:07 |
|
||
|
Имя класса в расчетном свойстве при наследовании
|
|||
|---|---|---|---|
|
#18+
Подытоживая, могу сказать одно. Попытка действовать вне правила "решение должно быть тупое... если можно сделать решение еще тупее, то немедленно так и делаем", приводит к неприятностям, во всяком случае, с Каше. Хорошо, что там, где мне нужно, x__classname всегда работает (отдельно хранить то, что и так хранится, м.б. и стоит, но я так все-же делать не стану ;) Вызвать при расчете свойства метод реального потомка не получится (так устроена скл-проекция, как я понял). При попытке такого вызова система (по непонятным причинам) не обратит внимания на то, был ли унаследован искомый метод, и, если в наследнике он отдельно не определен, обломит с ошибкой "метод не найден". Заниматься проставлением во всех наследниках заглушек на все методы предков - махровый ононизм, как мне кажется... Итого - проблема неразрешима в рамках текущей модели скл-доступа. И использовать я все же буду самое первоначальное и неубиваемое решение: расчетом свойств всех потомков будет заниматься их предок. Это тупо, дебильно, зато работает.... За то время, что я пытался (в очередной раз) придумать нечто красивое на Каше, мог бы написать гору тупого кода, и сейчас бы пиво пил, а не работал ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2010, 09:20 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36478610&tid=1557552]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
79ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 425ms |

| 0 / 0 |
