|
|
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Работаю над существующим проектом, в объектах которого фантастическим образом смешались события и функции. Попытки выявить чем руководствовись создатели системы, выбирая чем быть скрипту, ни к чему не привели. Более того, производя рефакторинг (refucktoring?) (а именно - перенося дублирующуюся функциональность в ancestor), словил себя на том, что нещадно превращаю события в функции и при этом мысленно очень нецензурно выражаюсь, хотя для моей зарплаты нет никакой разницы, пусть хоть одни eventы будут. Вот и подумалось - а есть ли какие-то очень конкретные правила что когда применять? Ну, ясное дело, в книжках описана разница, но в таком примерно виде: события могут быть только public, выполняются после скрипта предка если не приказать иначе, их можно "насадить" на системное событие. Это всё понятно, но всё-же есть какие-то чётко изложенные правила что из двух выбрать когда на первый взгляд оба варианта одинаково приемлемы? Может, и встречал это в книжках, когда учил любимый вечно умирающий PowerBuilder, но Итак, событие применяется в ситуациях, когда: 1. Необходимо чтоб сначала отработал скрипт предка, затем - потомка (зачем делать функцию и вызывать скрипт предка вручную?). 2. Необходимо переопрделить скрипт объекта, помещённого в другой объект (например, мы в окне и хотим переопределить скрипт помещённого в него датавиндова - мы вынуждены оформлять этот скрипт как событие иначе не "увидим" его из окна). Это одна из необъяснимых странностей PowerBuilder-а (чё, кисло было позволить переопределять функции тем-же абсолютно образом?), и если б не она - не было бы этого пункта. 3. Мы "перезапускаем" встроенные (существующие) события PowerBuilder-а в другом объекте (как правило, в NVO для отделения обработки от визуальности, или чтоб использовать наследование где оригинальный объект этого не позволяет, как в случае с application manager-ом) - здесь технически, может, более приемлема функция, но переопределённым событиям мы обычно даём те-же имена, что и у переопределяемых (лишь пришпандоривая префиксы конвенции наименования, например ue_ItemChanged), и делание таких скриптов функцищй будет просто резать ухо (даже после 8-го стакана ясно, что ItemChanged - не функция). 4. Мы "сажаем" скрипт на системное событие операционки (когда-то читал, что таких событий в Виндовсе более 900, а сейчас, наверно, и того больше). Во всех остальных случаях юзаем функцию и радуемся жинзи. Или мне всё это померещилось? Будут какие-то мыслишки по поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 21:16 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
UrsegoВот и подумалось - а есть ли какие-то очень конкретные правила что когда применять?Есть только одно правило - событие отрабатывает асинхронно к вызывающему коду а функция всегда отрабатывает синхронно. Все. Для события ты можешь сделать someobject.PostEvent(eventname) и это событие выполнится даже после того как скрипт его вызвавший уже давным давно завершен. Для функции такой отложеный вызов ты сделать не можешь. Отсюда и пляши - есть подозрение что данная функциональность будет вызываться асинхронно - делаешь событие. Во всех остальных случаях - функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 21:31 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
White Owl UrsegoВот и подумалось - а есть ли какие-то очень конкретные правила что когда применять?Есть только одно правило - событие отрабатывает асинхронно к вызывающему коду а функция всегда отрабатывает синхронно. Все. Для события ты можешь сделать someobject.PostEvent(eventname) и это событие выполнится даже после того как скрипт его вызвавший уже давным давно завершен. Для функции такой отложеный вызов ты сделать не можешь. Отсюда и пляши - есть подозрение что данная функциональность будет вызываться асинхронно - делаешь событие. Во всех остальных случаях - функцию. НЕ верно - функцию иожно точно также постнуть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 21:34 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Есть еще одна отличительная особенность события от функции. Можно триггеровать несуществующее событие и ничего не произойдет, а вот вызов несуществующего метода, то бишь функции, может завалить приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 22:23 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
White Owl UrsegoВот и подумалось - а есть ли какие-то очень конкретные правила что когда применять?Есть только одно правило - событие отрабатывает асинхронно к вызывающему коду а функция всегда отрабатывает синхронно. Все. Для события ты можешь сделать someobject.PostEvent(eventname) и это событие выполнится даже после того как скрипт его вызвавший уже давным давно завершен. Для функции такой отложеный вызов ты сделать не можешь. Отсюда и пляши - есть подозрение что данная функциональность будет вызываться асинхронно - делаешь событие. Во всех остальных случаях - функцию. Бред. От первого до последнего слова. Разница минимальная. Стараюсь использовать функции. Исключения: асинхронные сообщения, предопределенные события (по аналогии с retrievestart/retrieveend) чтобы проще было дополнять функциональность framework-а, безопасные динамические вызовы событий по имени (триггеровать несуществующее событие), в том числе для определения наличия у объекта нужного функционала по аналогии с "pfc_descendant" . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 22:50 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
edmikecaЕсть еще одна отличительная особенность события от функции. Можно триггеровать несуществующее событие и ничего не произойдет, а вот вызов несуществующего метода, то бишь функции, может завалить приложение.Совершенно верно, но это тот случай, когда вопрос что использовать не возникает и, следовательно, не подпадает под то, что я написАл, а именно - если можно и то и то использовать. Внутренний голос "тянет" меня в сторону функций, но, собственно, почему не событий? Может потому, что событие всегда public, что иногда не есть хорошо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 23:17 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Ursego edmikecaЕсть еще одна отличительная особенность события от функции. Можно триггеровать несуществующее событие и ничего не произойдет, а вот вызов несуществующего метода, то бишь функции, может завалить приложение.Совершенно верно, но это тот случай, когда вопрос что использовать не возникает и, следовательно, не подпадает под то, что я написАл, а именно - если можно и то и то использовать. Внутренний голос "тянет" меня в сторону функций, но, собственно, почему не событий? Может потому, что событие всегда public, что иногда не есть хорошо? То бишь почти всегда плохо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2007, 23:44 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Плохо что, что события всегда Public? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 00:20 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
edmikecaПлохо что, что события всегда Public? Естественно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 00:22 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Филипп edmikecaПлохо что, что события всегда Public? Естественно. Ну вряд ли удастся обойтись без событий :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 00:32 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Ursego 2. Необходимо переопрделить скрипт объекта, помещённого в другой объект (например, мы в окне и хотим переопределить скрипт помещённого в него датавиндова - мы вынуждены оформлять этот скрипт как событие иначе не "увидим" его из окна). Это одна из необъяснимых странностей PowerBuilder-а (чё, кисло было позволить переопределять функции тем-же абсолютно образом?), и если б не она - не было бы этого пункта. А вот эту багу очень даже можно превратить в фичу. :) В качестве функций userobject-а используются скрипты, которые заведомо НЕ предназначены для переопределения на окнах/обьектах, которые используют данный обьект в качестве control-а. Если же такое переопределение предполагается заведомо - то значит нужен event. А вот для nonvisual обьекта - действительно разницы нет. За исключением возможности закрыть функции private/protected для вызовов извне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 01:39 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Может кратко сказать так - если это может быть функцией - пусть будет ? :) А если не кратко, то можно и упомянуть и о том, что удобно, описывая события в предке, сослаться на события, которые будут описаны в потомках. Good Luck ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 11:10 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
если использовать события, то в наследнике всегда видно родительские события и можно посмотреть скрипт родительских событий а чтобы посмотреть на функции родителя приходится закрывать текущий объект, открывать родительский, смореть, потом обратно или есть какие-то методы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 12:41 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Помнится были такие проблемы. Сейчас в PB 9.0.3 посмотрел - из объекта-потомка функции предка вижу так же как и события. Good Luck ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 14:11 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
А я посмотрел из абсолютно той-же версии (build 8614) - не видно функции предка. Только события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2007, 19:41 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
2 Ursego: считаю это определение одним из самых полных + (edmikeca) Можно триггеровать несуществующее событие пункт №2 подходит и для невизуальных обьектов: их тоже можно вставить в визуальные через меню: и соответственно расширить/переопределить только события ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 00:20 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Dmitry.Можно триггеровать несуществующее событиеКакой ужас! А зачем? Аппликация ведь вылетит! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 01:19 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Ursego Dmitry.Можно триггеровать несуществующее событиеКакой ужас! А зачем? Аппликация ведь вылетит! Ужжос в том что вы не в курсе, что НЕ вылетит :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 02:35 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
UrsegoА я посмотрел из абсолютно той-же версии (build 8614) - не видно функции предка. Только события. Вообще - интересно. Я помню у меня были те же самые проблемы. Сейчас их нет. Может это где-то в настройках ? К сожалению помочь не могу - "чемоданное настроение" - завтра в отпуск, на эгейское море. С Филиппом, как всегда, согласен - аппликация не вылетит. Чем и пользуюсь очень часто. Можно сделать объекты гораздо "тоньше" Good Luck ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 10:02 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
ChV UrsegoА я посмотрел из абсолютно той-же версии (build 8614) - не видно функции предка. Только события. Вообще - интересно. Я помню у меня были те же самые проблемы. Сейчас их нет. Может это где-то в настройках ? К сожалению помочь не могу - "чемоданное настроение" - завтра в отпуск, на эгейское море. Вы просто про разные вещи говорите. Один - про методы и события контролов размещенных в контейнере, а другой - про методы и события самого контейнера. Для контролов доступно переопределение только событий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 15:29 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 16:06 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Филипп Ursego Dmitry.Можно триггеровать несуществующее событиеКакой ужас! А зачем? Аппликация ведь вылетит! Ужжос в том что вы не в курсе, что НЕ вылетит :-)Не вылетит только если пользоваться давно устаревшим прадедушкиным методом TriggerEvent, принимающим имя события как стринг, но мы-то в 2007 году живём и пользуемся такими штуками, как TRIGGER/POST DYNAMIC/STATIC FUNCTION/EVENT, а с TRIGGER DYNAMIC EVENT - вылетит как пробка из шампанского! Но уж если надо зачем-то запустить метод динамически (что как правило свидетельствует об отсутствии у девелопера желания сделать кастинг к конкретному классу, что сделало бы скрипт более понятным, и о присутствии лени или незнания принципов создания качественного кода), то можно и функцию триггернуть динамицки. Аппликация вылетит, и поделом - нефиг вызывать то, чего нет, оставьте этих штучек Додику Копперфильду. При правильном кодировании такой надобности не возникнет! Но даже если я неправ в этом плане на все сто, это говорит о том, что товарищь, заговоривший об этом, невнимателен: я писАл о выборе между функией и событием там, где они ОБА приемлемы. А если приемлемо только событие, о чём говорить-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 20:21 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
авторНо уж если надо зачем-то запустить метод динамически (что как правило свидетельствует об отсутствии у девелопера желания сделать кастинг к конкретному классу, что сделало бы скрипт более понятным, и о присутствии лени или незнания принципов создания качественного кода), то можно и функцию триггернуть динамицки. Аппликация вылетит, и поделом - нефиг вызывать то, чего нет, оставьте этих штучек Додику Копперфильду. При правильном кодировании такой надобности не возникнет! Полный бред. А если еще дальше пойти по Вашим принципам, то нужно запретить использование таких вещей как this и parent , а обращение к методам/событиям жестко кодировать: win_name.tab_name.tabpg_name.function_name/trigger_name и т.д. и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 21:17 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Не возникнет надобность если не использовать динамического создания объекта При хорошем стиле эта надобность периодически возникает Ну и эксцпшн наверное не в падлу перехватить или проверить существование метода(раз мы говорим о хорошем стиле) до того как его вызовешь -------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 21:39 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=34599015&tid=1337124]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 132ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...