|
|
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Спор примерно о том же что использовать функции или процедуры:) -------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 21:41 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Ну если вернуться к началу обсуждения то я думаю, что в первую очередь нужно пользоваться здравым смыслом: вряд ли вместо методов set/get стоит создавать аналогичные события точно также как вместо pre-open/post-open событий стоит создавать аналогичные функции. Также и с динамическими вызовами. Как правильно заметил spas2001 при динамическом создании объектов без динамических вызовов бывает сложно обойтись (разве что запретить создание объектов динамически, для улучшения читабельности кода). А вообще говоря и то и другое больше религия которой придерживается тот или иной программист. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2007, 22:13 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Ursego Филипп Ursego Dmitry.Можно триггеровать несуществующее событиеКакой ужас! А зачем? Аппликация ведь вылетит! Ужжос в том что вы не в курсе, что НЕ вылетит :-)Не вылетит только если пользоваться давно устаревшим прадедушкиным методом TriggerEvent, принимающим имя события как стринг, но мы-то в 2007 году живём и пользуемся такими штуками, как TRIGGER/POST DYNAMIC/STATIC FUNCTION/EVENT, а с TRIGGER DYNAMIC EVENT - вылетит как пробка из шампанского! Но уж если надо зачем-то запустить метод динамически (что как правило свидетельствует об отсутствии у девелопера желания сделать кастинг к конкретному классу, что сделало бы скрипт более понятным, и о присутствии лени или незнания принципов создания качественного кода), то можно и функцию триггернуть динамицки. Аппликация вылетит, и поделом - нефиг вызывать то, чего нет, оставьте этих штучек Додику Копперфильду. При правильном кодировании такой надобности не возникнет! Но даже если я неправ в этом плане на все сто, это говорит о том, что товарищь, заговоривший об этом, невнимателен: я писАл о выборе между функией и событием там, где они ОБА приемлемы. А если приемлемо только событие, о чём говорить-то? Для тех, кому лень хелп почитать: Errors when calling functions and events dynamically Events Consider these statements: 1 This statement calls an event without looking for a return value: object.EVENT DYNAMIC eventname( ) 2 This example looks for an integer return value: int li_int li_int = object.EVENT DYNAMIC eventname( ) 3 This example looks for an Any return value: any la_any la_any = object.EVENT DYNAMIC eventname( ) The following table uses these statements as examples. Condition 1 Condition 2 Result Example The event does not exist. The code is not looking for a return value. Nothing; the call fails silently. Statement 1 fails but does not cause an error. The code is looking for a return value. A null of the Any datatype is returned. La_any is set to null in statement 3. If the expected datatype is not Any, execution error 19 occurs: Cannot convert Any in Any variable to datatype. The assignment to li_int causes execution error 19 in statement 2. The event is found but is not implemented (there is no script). The event has a defined return value. A null of the defined datatype is returned. If eventname is defined to return integer, li_int is set to null in statement 2. The event does not have a defined return value. A null of the Any datatype is returned. La_any is set to null in statement 3. If the expected datatype is not Any, execution error 19 occurs: Cannot convert Any in Any variable to datatype. The assignment to li_int causes execution error 19 in statement 2. The event is found and executed but is not defined with a return value. The code is looking for a return value. Execution error 63: Function/event with no return value used in expression. Statements 2 and 3 cause error 63. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2007, 00:55 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
То Филипп +1 Как говорится, что и требовалось доказать -------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2007, 10:22 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
Естьвсе-таки разница между кодерами и программистами-разработчиками :-) -------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2007, 10:24 |
|
||
|
Событие или функция? Вот в чём вопрос!
|
|||
|---|---|---|---|
|
#18+
UrsegoTRIGGER DYNAMIC EVENT - вылетит как пробка из шампанского! FYI Этот код при отсутствии события ue_test вылетит: Код: plaintext 1. 2. НО Этот код при отсутствии события ue_test успешно выполнится: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2007, 17:10 |
|
||
|
|

start [/forum/topic.php?all=1&fid=15&tid=1337124]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 383ms |

| 0 / 0 |

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