(и опять про) обработчики событий в PHP @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 22 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: (и опять про) обработчики событий в PHP
Сообщение Добавлено: 28 Октябрь 2007, 22:37:14 
У меня идея фикс: попробовать программировать в ПХП используя события.
И я не успокоюсь пока на своей шкуре не испробую это :roll:

Я хочу:
- Разбить процедурный код на логические блоки (функции).
- Порядок определения функций не важен - это хорошо. Тогда как в процедурном коде часто один кусок программы должен сдедовать за другим.
- Не засорять глобальное пространство переменными. Временные переменные будут определяться внутри функции (обработчик события).

В примере:
1. Создаю класс Calculator
2. Создаю объект $objCalc (экземпляр класса Calculator)
3. Вызываю метод $objCalc->add() (допустим сложение 2-х чисел).
4. Это в свою очередь вызывает два обработчика событий:
- один в объекте: onResult()
- другой в теле программы: objCalc_onResult()

Код:
<?php
   class Calculator {

      private $_varname; // String. Имя переменной. Нужно что бы вызывать функцию с именем переменной.

      function __construct($varname) {
         $this->_varname = $varname;
      }

      function add() {
         // ….. код …..
         $this->onResult();
      }

      function onResult() {
         // Обработчик события внутри класса
         // ….. код …..

         // Вызвать обработчик события внутри программы
         $function = $this->_varname.'_onResult';
         $function();
      }

   }

   
   /* Создаем объект.
   ** Передаем конструктору имя переменной,
   ** что бы правильно называть функции-обработчики событий для этого объекта.
   ** К примеру: objCalc_onResult()
   */
   $objCalc = new Calculator("objCalc");
   
   $objCalc->add();

   function objCalc_onResult() {
      // Обработчик события внутри программы
      echo "Hello World";
   }
?>


Какие будут мнения ? :)

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 28 Октябрь 2007, 22:50:17 

Цитата:
Какие будут мнения ? :)



Мнений не будет. Будет вопрос: какую проблему мсье пытается решить этим спрсобом?

P.S. Добавлю лишь, что Вы понимаете концепцию "процедурного" программирования достаточно превратно. Это не считая того, что такого термина, в сущности, нет. Ввиду бессмысленности.
Бaзиль Муж.
участник
49
Сообщения: 1288
Зарегистрирован: 13.02.05
Откуда: Околомосковье
Сообщение Добавлено: 28 Октябрь 2007, 23:06:09 
жуть. Расширение классов просто так придумали?

_________________
Не кочегары мы, не плотники,
Но сожалений горьких нет -
Как нет?
А мы дизайнеры-художники,
И с высоты вам шлем привет -
Привет!
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 28 Октябрь 2007, 23:37:44 
Crazy,
допустим у меня есть длинная программа в 10 экранов. В ней один кусок программы (который решает определенную задачу) - следует за другим куском программы. Часто порядок их исполнения имеет значение. Ничего кроме комментов их не разделяет.

Когда мне надо добавить новую функциональность, мне надо пролистать всю программу, что бы:
- понять куда лучше впихнуть новый код (что бы ничего не нарушило и что бы крашивше выглядело)
- просмотреть переменные, что бы не назначить таких же новых. Знаю что в PHP 6 или 5.3 - обещают сделать namespace.

Появилась идея разбить программу на функции которые одновременно были бы обработчиками событий моих объектов. Решается проблема с namespace, и программа логически разделена на функции.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 28 Октябрь 2007, 23:39:19 

Бaзиль писал(а):
жуть. Расширение классов просто так придумали?


В смысле?

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 28 Октябрь 2007, 23:55:47 

AlexShop писал(а):
допустим у меня есть длинная программа в 10 экранов. В ней один кусок программы (который решает определенную задачу) - следует за другим куском программы. Часто порядок их исполнения имеет значение. Ничего кроме комментов их не разделяет.



Хм. Это трудно. Кому-то все же придется тебе это сообщить... В общем, если кратко, с тех пор, как лет 50 назад придумали концепцию подпрограмм, поток сплошного текста в 10 экранов воспринимается... как бы это помягче сказать... Ну, в общем, когда я лет 20 назад такое написал -- меня честно спросили: я обкурился или я природный кретин? Признаться, я до сих пор думаю над этим вопросом...
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 29 Октябрь 2007, 00:02:57 

AlexShop писал(а):

Бaзиль писал(а):
жуть. Расширение классов просто так придумали?


В смысле?



Я думаю, он пытается намекнуть, что парадигма :) ООП предполагает использование более адекватных средств, чем "$function = $this->_varname.'_onResult'; $function(); ".
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 29 Октябрь 2007, 00:38:57 

Crazy писал(а):
Хм. Это трудно. Кому-то все же придется тебе это сообщить... В общем, если кратко, с тех пор, как лет 50 назад придумали концепцию подпрограмм, поток сплошного текста в 10 экранов воспринимается... как бы это помягче сказать... Ну, в общем, когда я лет 20 назад такое написал -- меня честно спросили: я обкурился или я природный кретин? Признаться, я до сих пор думаю над этим вопросом...



Ну бывает такое :lying: редко. (маленьких экранов, этак 600x800 :laugh:)

Так к чему мы возращаемся - обратно к функциям.
Почему бы не создать функции - они же обработчики событий объектов?

Вопрос: как это сделать малой кровью? Без создания сложного фреймворка.
Пример - это то что я пока додумался.

Меня убивает это место:
Код:
$objCalc = new Calculator("objCalc");

При вызове конструтора, первый параметр надо указывать имя переменной


Crazy писал(а):
Я думаю, он пытается намекнуть, что парадигма :) ООП предполагает использование более адекватных средств, чем "$function = $this->_varname.'_onResult'; $function(); ".



что то я туплю тут.. :chih:

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 29 Октябрь 2007, 00:49:49 
http://en.wikipedia.org/wiki/Observer_pattern
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 29 Октябрь 2007, 01:02:33 
а-а-а-а-а точно :lol:
Паттерны я только недавно начал осваивать, так что не всегда про них помню. Observer - то что надо!

Осталось решить что сделать, что бы не передавать конструктору имя переменной.
-------
Стоп - с Observer'ом проблема может отпасть сама собой.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Бaзиль Муж.
участник
49
Сообщения: 1288
Зарегистрирован: 13.02.05
Откуда: Околомосковье
Сообщение Добавлено: 31 Октябрь 2007, 10:22:07 
AlexShop, воооооооот :beer:

_________________
Не кочегары мы, не плотники,
Но сожалений горьких нет -
Как нет?
А мы дизайнеры-художники,
И с высоты вам шлем привет -
Привет!
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Сообщение Добавлено: 6 Ноябрь 2007, 17:57:54 
А вообще-то использовать модель событий (observer/subscriber) разумно в случаях асинхронной обработки, например, когда многопоточный процесс. В PHP-то вам она зачем? Чтобы избавиться от пятиэкранных листингов - разбейте на классы/функции и положите все в разные файлы, подцепляемые в основной через require.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 6 Ноябрь 2007, 20:25:09 
gregzem, паттерн Observer хотя и можно применять для асинхронной обработки, но он никак на асинхронность не завязан.

Задачи паттерна Observer -- в другом.
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Сообщение Добавлено: 6 Ноябрь 2007, 21:43:59 
Совершенно верно. Я не осуждаю вашу любовь к данному паттерну, я полностью ее разделяю. Вопрос в другом - зачем применять его в PHP? Вопрос в целесообразности. Я понимаю - JS, где можно сделать многопотоковость за счет симуляции вызова функций через setTimeout + стейт машины, Java с их лисенерами (там в общем-то и придумывать уже ничего не надо), да и любой другой язык, на котором можно реализовать многопотоковое приложение. Здесь беспорно данный механизм подписывания на события по большому счету является единственной возможностью вызова обработчиков событий.

Возвращаясь к вопросу топикстартера: А в PHP, где все происходит линейно, зачем городить этот огород?
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 6 Ноябрь 2007, 22:19:29 
Причем тут линейность? JS тоже линейное и однопотоковое.
События, это возможность оповещать о каких-то изменениях те объекты, которым, возможно, это будет интересно.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 6 Ноябрь 2007, 23:18:20 

gregzem писал(а):
Вопрос в другом - зачем применять его в PHP?



А в PHP, где все происходит линейно, зачем городить этот огород?



Паттерн Observer не имеет никакого отношение к "линейности" или "нелинейности". Его назначение очень простое:


Цитата:
Intent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.



Цитируется по Portland Pattern Repository's Wiki.
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Сообщение Добавлено: 7 Ноябрь 2007, 10:47:12 

gro писал(а):
JS тоже линейное и однопотоковое.



С помощью setTimeout я могу "зарядить" несколько "потоков" и он перестанет быть однопотоковым и линейным. Что-то вроде

Код:
function thread1_run() {
  setTimeout("thread1_run()", 10);
}

function thread2_run() {
  setTimeout("thread2_run()", 5);
}

thread1_run();
thread2_run();


Чем не потоки? Прямо таки интерфейс Runnable у Java :)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 7 Ноябрь 2007, 17:03:46 
gregzem, какова вероятность, что thread2_run запустится во время выполнения thread1_run? Действительно больше 0?
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 8 Ноябрь 2007, 08:30:03 
товарищи,
я тут написал - а вы меня поправьте как новичка в патернах:

В архитектуре MVC, вьювер использует обзервер чтобы получать уведомления от модели.

Так как скрипт в вэбе - это программа которая загружается "с нуля" с каждым новым кликом,
то вьюверу достаточно один раз получить все уведомления что бы выдать страницу. Для этого обзервер не нужен.
Точнее в этом случае, вьювер уже не получает уведомления, а контроллер вызывает нужные вьювера, которые в свою очередь запрашивают модель о данных.

Если не ошибаюсь такая схема называется Model2

Но MVC это частный случай использования обзервера.
Этот паттерн (как и многие другие) направлен что бы ослабить связи между объектами. Мой (неудачный) код в начале топика как раз пример тому, где обзервер удачно вписывается.

Вообщем тут все сказано:

Цитата:
Intent: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Crazy :beer:

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 8 Ноябрь 2007, 21:15:07 
Так как скрипт в вэбе - это программа которая загружается "с нуля" с каждым новым кликом

А как же асинхронные запросы?

_________________
Лишь одно в моём кармане - беспонтовый пирожок
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 8 Ноябрь 2007, 21:25:02 
Обработчики асинхронных запросов -- мы, если кто не заметил, говорим о PHP -- загружаются точно так же "с нуля" по каждому запросу.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 25 Ноябрь 2007, 05:10:04 

gregzem писал(а):
Чтобы избавиться от пятиэкранных листингов - разбейте на классы/функции и положите все в разные файлы, подцепляемые в основной через require.


Я как раз на эту тему сейчас читаю: "Рефакторинг" Фаулера.
Книга - :up: :up:
Ее не то что полезно, но необходимо читать тем кто занимается программированием.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 22 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100