[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Делегирование
m4a1fox
Итаки доброго дня! Читаю книгу Мэтта Зандстра - понятие делегирование. Просто что бы понимать. По сути.
Делегирование - это механизм по средствам которого, один объект может вызывать метод другого объекта.
Пример:

class methodName{
public $name;

public function getName($name){
return $this->name;
}
}



class Function{
function printName(!!!!!!!methodName $o!!!!!!!!){
echo $o->getName();
}
}



Как я понимаю, делегирование тут выделено знаками !(восклицания)? Так? Или я ошибся?



Спустя 5 минут, 45 секунд (26.10.2011 - 13:06) Dezigo написал(а):
да.
Вот оно
 echo $o->getName();

Спустя 3 минуты, 56 секунд (26.10.2011 - 13:10) m4a1fox написал(а):
Dezigo
Ага! То есть вот это
echo $o->getName();

делегирование.... ясно! То есть присвоение объекту $o метода getName.... взятого из класса methodName..... ясненько.... Тогда как вот называется, вот это не подскажите?
function printName(methodName $o){

Спустя 8 минут, 53 секунды (26.10.2011 - 13:19) Winston написал(а):
Цитата (m4a1fox @ 26.10.2011 - 13:10)
Тогда как вот называется, вот это не подскажите?

Приведение типов, значит, что ты можешь в качестве аргумента передать только объект типа methodName

Спустя 1 минута, 11 секунд (26.10.2011 - 13:20) m4a1fox написал(а):
Winston
Ясно! Спасибо Dezigo, Winston. Помогли разложить по полочкам!

Спустя 24 минуты, 39 секунд (26.10.2011 - 13:44) Invis1ble написал(а):
Цитата
Приведение типов, значит, что ты можешь в качестве аргумента передать только объект типа methodName

разве об этом не говорится в книге до рассмотрения делегирования?

Спустя 1 минута, 53 секунды (26.10.2011 - 13:46) Winston написал(а):
Цитата (Invis1ble @ 26.10.2011 - 13:44)
разве об этом не говорится в книге до рассмотрения делегирования?

В книге об этом говорится намного раньше чем тема делегирование smile.gif

Спустя 9 минут, 48 секунд (26.10.2011 - 13:56) Invis1ble написал(а):
Это был намек ТС wink.gif

Спустя 47 секунд (26.10.2011 - 13:57) caballero написал(а):
Цитата
То есть присвоение объекту $o метода getName.... взятого из класса methodName.

Нету там никакого присвоения метода и быть не может. Тем более $o как раз и есть экземпляр класса MethodName

Цитата
разве об этом не говорится в книге до рассмотрения делегирования?

это просто синтаксис PHP делегирование тут ни при чем

Спустя 2 минуты, 7 секунд (26.10.2011 - 13:59) Invis1ble написал(а):
ясен пень, что не причем. Это вообще основы, которые должны изучаться еще до ООП собственно.

Спустя 7 минут, 35 секунд (26.10.2011 - 14:07) m4a1fox написал(а):
Ясно что основы! Еще раз! Я просто уточнил, что бы до конца понять момент! smile.gif

Спустя 2 минуты, 5 секунд (26.10.2011 - 14:09) m4a1fox написал(а):
caballero
Цитата
Тем более $o как раз и есть экземпляр класса MethodName

А не уточнение ли это?

Спустя 3 минуты, 38 секунд (26.10.2011 - 14:12) Winston написал(а):
Цитата (m4a1fox @ 26.10.2011 - 14:09)
А не уточнение ли это?

Точно !
(methodName $o) и есть уточнение типа, так чего спрашивал если знал ? smile.gif
Я написал
Цитата (Winston @ 26.10.2011 - 13:19)
Приведение типов

т.к. не мог вспомнить это слово "уточнение" rolleyes.gif

Спустя 2 минуты, 50 секунд (26.10.2011 - 14:15) m4a1fox написал(а):
smile.gif Это я уточнял.... ибо помнил что
Цитата
В php5 появилась новая возможность - уточнение типов данных класса. Что бы добавить уточнение типа к аргументу метода, просто поместите перед ним имя класса!

Спустя 8 часов, 26 минут, 39 секунд (26.10.2011 - 22:42) Greg1978 написал(а):
Формально да, делегирование это вызов интерфейса у другого объекта, фактически слово "делегирование" выходит из объектно-ориентированного проектирования , а не программирования (то есть на уровне абстракции а не реализации). Что это значит вообще по русски smile.gif - "передача управления какими то действиями и алгоритмами другому объекту" и не важно каким способом это будет реализовано, почему его ещё называют "чёрным ящиком" (эта тема про наследования через реализацию в объектах не очень хорошо муссировалась здесь smile.gif )

Спустя 2 часа, 4 минуты, 49 секунд (27.10.2011 - 00:47) bodja написал(а):
m4a1fox
Если это пример Мэтта Зандстра ,то он не самый понятный ,да и еще с ошибкой в коде.
Лень мне конечно все это было писать,но думаю прийдется,а то еще занесет не в ту сторону при изучении ООП.
Здесь ниже таже суть примера ,ну и со сравнением с наследованием.

<?php

class
classA {
private $msg="Прювет!!!";
public $cnt=0;
public function metodA(){
$this->cnt++;
return $this->msg;
}
}


class classB {
private $obj;
function __construct($arg) {
$this->obj=$arg;
}
public function metodB() {
echo $this->obj->metodA();
}
}


class classC extends classA {
public function metodC() {
echo 'test';
}
}

$obj1=new classA();
$obj2=new classB($obj1);
$obj3=new classC();
echo $obj2->metodB();
echo $obj1->cnt;
echo $obj3->cnt;

?>


Теперь ,что мы имеем ?
Мы имеем classB которому доступны свойства и методы classA ,способом "делегирования"
и мы имеем classC которому доступны свойства и методы classA ,способом класического наследования.
В чем собственно разница ,ведь код выполнения один и тот же?
А разница в результате :)
Цитата
Прювет!!!
1
0

Я не даром добавил вот эту строчку
Цитата
$this->cnt++;

что бы вы поняли чем это может пахнуть,а пахнет я думаю вы уже догадались какой код :)
Тоесть вот это "делегирование" из той же оперы,что и использование глобальных переменных в функциях,но только на уровне ООП. :)
Тоесть работая с уже созданным обьектом ,а не создавая новый экземпляр класса,вы рискуете нежелательной модификацией свойства этого обьекта,с вытекающими последствиями.

Спустя 1 день, 11 часов, 26 минут, 19 секунд (28.10.2011 - 12:13) m4a1fox написал(а):
bodja
Вроде понял... все равно они так похожи.... еще бы знать для каких реальных целей это необходимо.... было бы здорово! smile.gif

Спустя 2 часа, 29 минут, 14 секунд (28.10.2011 - 14:42) caballero написал(а):
Цитата
Вроде понял... все равно они так похожи.... еще бы знать для каких реальных целей это необходимо.... было бы здорово!


В большинстве случаев для различеых callback функций

Например для обработчиков событий - клас выполняет какуюто бизнес логику потом проверяет - если у него присвоен делегат - дергает его (возможно с параметрами)

когда ты присваиваешь тэгу onclick яваскрипт функцию обрабочик - это и есть пример делегата

Спустя 11 минут, 39 секунд (28.10.2011 - 14:54) m4a1fox написал(а):
caballero
Цитата
когда ты присваиваешь тэгу onclick яваскрипт функцию обрабочик - это и есть пример делегата

О! Отличное сравнение... теперь понятнее....

Спустя 19 минут, 16 секунд (28.10.2011 - 15:13) caballero написал(а):
Цитата
Отличное сравнение... теперь понятнее

А то!
Мэтт Зандстра тебе понятных примеров не приведет - не царское дело (точнее не та распальцовка).

Спустя 10 минут, 55 секунд (28.10.2011 - 15:24) bodja написал(а):
Цитата
еще бы знать для каких реальных целей это необходимо....

Ну разница в чем,
при делегировании вы работаете с уже созданным обьектом,
при наследовании вы создаете копию classA и присоединяете что у вас уже есть ,то есть classС.
Тоесть ,что получается ,при наследовании вы можете выполнять код classA,но при этом вы не рискуете изменить свойства другого обьекта.
А при делегировании,вам прийдется контролировать этот вопрос,что бы случайно не вызвать
нежелательное изменение свойства другого обьекта.
А в сложном коде,этот вопрос достаточно актуальный.
Это все касаемо многократного использования одинакового кода.
Если же нужно получить просто свойство чужого обьекта,достаточно просто сделать снаружи этих обьектов вот так.
$obj1->pro=$obj2->pro;

Спустя 2 минуты, 29 секунд (28.10.2011 - 15:26) Winston написал(а):
caballero
Можешь сказать какие книги по ООП на твой взгляд лучшие ?

Спустя 3 минуты, 5 секунд (28.10.2011 - 15:30) caballero написал(а):
Цитата
при делегировании вы работаете с уже созданным обьектом


Делегирование как таковое вообще не связано с наследованием
в большинстве случаев делегаты либо просто ссылки на функцию в нетипизированных языках либо соответствующим образом объявленные типы в типизированных

Спустя 9 минут, 12 секунд (28.10.2011 - 15:39) caballero написал(а):
Цитата
Можешь сказать какие книги по ООП на твой взгляд лучшие ?


Не могу - я изучал ООП когда не было никакого PHP и интернета. А была одна на всех книжка Страуструпа по С++ в читалке заводской библиотеки..

Что сейчас читать фиг его знает. Новичкам бы советова книгу Котерова. Естиственно при внимательном изучении подряд по всему языку.

Лично мое мнение - нет смысла изучать ООП (как и паттерны) как некую отдельную дисциплину . Как результат мы видим вопросы - человек даже не понимает где клас где объект. Потому что голая теория вне контекста бесполезна.

Я кстати изучал не ООП как таковое а C++. Остальное приложилось в процесссе изучения и написания программ.
Глупо звучит когда новичок тут пишет - я вот ООП выучил - где бы мнее его применить. А на фига ты учишь то что не знаешь где применять. С таким же успехом мог выучить как коровам в колхозе хвосты крутить.
Если есть задача где нужно ООП то просто бери и решай ее изучая по дороге методы решения синтаксические конструкции и прочее.













Спустя 4 минуты, 52 секунды (28.10.2011 - 15:44) bodja написал(а):
Да,делегирование не связано с наследованием,это два разных подхода.
я выше приводил код и показывал разницу делегирования и наследования.
А в целом я не сторонник ни того не другого.

Спустя 42 секунды (28.10.2011 - 15:44) Winston написал(а):
Спасибо за ответ wink.gif
Цитата (caballero @ 28.10.2011 - 15:39)
я изучал ООП когда не было никакого PHP и интернета

Фигасе, как давно blink.gif

Спустя 6 минут, 7 секунд (28.10.2011 - 15:50) caballero написал(а):
Цитата
Да,делегирование не связано с наследованием,это два разных подхода.
я выше приводил код и показывал разницу делегирования и наследования.
А в целом я не сторонник ни того не другого


Эти вещи вообще никак не связаны, они решают разные непересекающиеся задачи. В конечном итоге делегирование это обычные callback функции - тут даже ООП как таковое не нужно.

Просто изобразили идею в виде паттерна, а какой же паттерн без ООП - несолидно типа.

Спустя 28 минут, 15 секунд (28.10.2011 - 16:19) bodja написал(а):
Цитата
Эти вещи вообще никак не связаны, они решают разные непересекающиеся задачи

Ну знаю я,ну нет у ПХП ни событий ни многопоточности ни прерываний ни dll со своими потоками,калбекам неоткуда взятся,что поделаеш ? biggrin.gif
Но нужно же куда нибудь впихнуть такую фичу,правда? biggrin.gif
Ну нашли ООП ,тоже хорошо,дружно говорим респект Мэтту Зандстре biggrin.gif

Спустя 3 минуты, 19 секунд (28.10.2011 - 16:22) caballero написал(а):
Цитата
Ну знаю я,ну нет у ПХП ни событий ни многопоточности ни прерываний ни dll со своими потоками,калбекам неоткуда взятся,что поделаеш


этого обычно нет в большинстве языков
это создается когда пишуться библиотеки фреймворки и все такое
например есть кнопка у нее событие
но кнопка - это не конструкция языка программирования.

Спустя 31 минута, 45 секунд (28.10.2011 - 16:54) bodja написал(а):
Ну незнаю,я создавал напрмер поток на С++ когда собирал DLL для работы с DirectX и GSM кодеком.
Кодек выдрал из UNIX исходников гдето в инете ,ну а DirectX понятно в MSDN.
А калбек передавал этой ДЛЛке из проги на VB6 biggrin.gif biggrin.gif biggrin.gif
Это касаемо для компа.

Если говорить про микроконтроллеры,то там вообще все без тормозов,как на Си ,так и на других языках.Что хочеш и как хочеш,лиш бы архитектура ядра это позволяла.

Калбеки- вещь специфичная ,и ними нужно быть очень акуратным,и в языках они применяются,правда очень редко.

Спустя 4 минуты, 50 секунд (28.10.2011 - 16:59) caballero написал(а):
Цитата
Ну незнаю,я создавал напрмер поток на С++ когда собирал DLL для работы с DirectX и GSM кодеком.


в C++ никаких потоков нет - это либо API либо классы с той или иной библиотеки.


Цитата
Если говорить про микроконтроллеры,то там вообще все без тормозов,как на Си ,так и на других языках.Что хочеш и как хочеш,лиш бы архитектура ядра это позволяла.

Там ты пишешь код прямо на железо и никакой Билл Гейтс со своим виндовым API на дороге не стоит

Впрочем С для микроконтролеров как правило обрезанный и как правиило не C++ - это слишком громоздко для ограниченного объема памяти..

Спустя 4 часа, 24 минуты, 4 секунды (28.10.2011 - 21:23) bodja написал(а):
Цитата
в C++ никаких потоков нет - это либо API либо классы с той или иной библиотеки.

Ну действительно biggrin.gif
а API или библиотеки на каком языке написаны?
На инопланетном ? biggrin.gif
Вам просто не приходилось их готовить.C++ - Потоки в Win32

Цитата
С для микроконтролеров как правило обрезанный

Ну что есть ,то есть rolleyes.gif
урезано там,урезано на ПХП - вот так и живем с обрезаниями. biggrin.gif

Спустя 3 дня, 11 часов, 44 минуты, 42 секунды (1.11.2011 - 09:07) linker написал(а):
function printName(methodName $o){
назыается Type Hinting

Спустя 2 минуты, 12 секунд (1.11.2011 - 09:10) linker написал(а):
caballero
Потоки есть везде где есть банальный I/O. Файл - это тоже поток. Работа с сокетами - это тоже работа с потоками. В Сях основная либа iostream.

Спустя 1 час, 43 минуты, 16 секунд (1.11.2011 - 10:53) caballero написал(а):
Цитата
Потоки есть везде где есть банальный I/O. Файл - это тоже поток. Работа с сокетами - это тоже работа с потоками. В Сях основная либа iostream.

Потоки есть в операционной системе (это объект ядра), а не в С или каком либо еще языке програмирования.

И кстати речь шла не о потоках stream а о потоках thread
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.