[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Design Patterns
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
chee
twin, а у тебя тебя точно там небыло долнительных методов? Можешь не отвечать, они были, иначе смысл от такого трюка в статических классах нету, ну разве что для кэширование, но тогда это уже прокся, а не декоратор. Декоратор должен полностью соответствовать интерфейсу декорируемого, иначе это не декоратор. Декоратор очень редкий паттерн в PHP, я еще не разу не видел его использования в реальных проектах.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Ron
Цитата (twin @ 4.09.2017 - 04:26)
А достижения лучше "подглядывать" в живых кодах, нежели в абстрактной теории.

Что тут можно сказать? У каждого своя методика (само)обучения. Я придерживаюсь классической схемы: сначала теория, затем практика.

Цитата (twin @ 4.09.2017 - 04:26)
А зачем мне раньше?

Зачем тебе не знаю, а мне для расширения кругозора. Чтобы не выглядеть дубиной в приличном обществе, хотя бы для этого. wink.gif Если рассматривать более сложную идею, то для наращивания потенциала, для эффективных умозрительных изысканий. Теория порождает теорию, на голой практике никуда не уедешь. А ты спрашиваешь зачем раньше, даже странно. Чем раньше научишься тем лучше!

Цитата (twin @ 4.09.2017 - 04:26)
А достижения лучше "подглядывать" в живых кодах, нежели в абстрактной теории.

Код еще неизвестно кто пишет, а теория, обычно, выдвигается довольно видными деятелями ИТ, как правило высокообразованными. Теория не привязана к ЯП + многие вещи в опенсорс попросту не попадают, особенно в сообществе PHP, про который и поговаривают типа "ты все еще указываешь в резюме знание PHP? Тебе не стыдно?" и т.д. Так что искать в чужом PHP коде особую мудрость занятие весьма неблагодарное. Разве что из крупных проектов, типа Symfony, но их читать заимеешься, пока найдешь (идею) решение своей задачи в виде кода, не зная теории. Ищу то не знаю что. Охрененная тактика, нечего сказать! biggrin.gif

Цитата (twin @ 4.09.2017 - 04:26)
И это, я использовал его совсем не так, как принято везде описывать. А именно - вообще без объектов.

От этого он не стал твиноратором, вот в чем соль! wink.gif Еще раз повтоюсь: паттерны это алгоритмы, они не зависят от реализации. В книгах приводится один из примеров, обычно максимально абстрактный.

Цитата (twin @ 4.09.2017 - 04:26)
И поверь, ни капли легче не стало, когда я узнал, что это так называется.

Должно было стать грустно. =)
twin
Цитата (Ron @ 4.09.2017 - 12:05)
Теория порождает теорию, на голой практике никуда не уедешь
Цитата
В теории теория и практика неразделимы. На практике обычно наоборот.
(с) не помню кто

Цитата (Ron @ 4.09.2017 - 12:05)
От этого он не стал твиноратором, вот в чем соль!
Для меня может и стал. Глубоко наплевать, как называется.
Цитата (Ron @ 4.09.2017 - 12:05)
Должно было стать грустно. =)
От чего грустить то... Вот сейчас оказывается, что это вовсе не декоратор, как chee сказал. И ты знаешь, эта штука хуже работать не стала, я специально проверил. biggrin.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (chee @ 4.09.2017 - 10:14)
twin, а у тебя тебя точно там небыло долнительных методов?

Не понял о чем ты, но суть примерно такая:

<?php

class
example
{

public static function firstMethod()
{
return 1;
}

public static function secondMethod()
{
return 2;
}
}


class twinorator
{

public static function __callStatic($method, $arguments)
{
return example::$method($arguments);
}

public static function secondMethod()
{
return '<b>'. example::secondMethod() .'</b>';
}
}



echo twinorator::firstMethod();
echo twinorator::secondMethod();


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
Цитата (twin @ 4.09.2017 - 16:26)
В теории теория и практика неразделимы.

Речь ведь о приоритетах была? Или я чего-то упустил?

Цитата (twin @ 4.09.2017 - 16:26)
Для меня может и стал. Глубоко наплевать, как называется.

То есть иными словами наплевать что о тебе подумают люди, когда вместо общепринятого названия начнешь объяснять сложными фразами суть решения. Тебе скажут, так это ж декоратор! А ты им: "мне плевать". Так что ли? Не думаю что получится оставить о себе благоприятное впечатление. Тем хуже будет, если выдавать чужие достижения за свои наработки, тем более хорошо известные. Тут люди могут даже обозлиться под соусом "за кого он нас принимает".

Не понимаю, чего ты хочешь доказать, упорно настаивая, что невежество не является чем-то зазорным. Мне эти знания (заранее) не нужны; плевать как называются общепринятые и широкоизвестные в специальности вещи; я и сам сусам. Да? Искренне не понимаю этот месседж.

Цитата (twin @ 4.09.2017 - 16:26)
Вот сейчас оказывается, что это вовсе не декоратор, как chee сказал.

Он сделал предположение, попросил уточнений. Прокся и декоратор вещи настолько похожие, что декоратор можно считать серией последовательно вызванных проксей в указанном порядке. И то и другое от одного и того же интерфейса реализуется обычно. Юз кейс декоратора оч простой, например динамическая агрегация или фильтрация (данных). Другое дело, что этот функционал стараются спихнуть по максимуму на СуБД.

Твин, в твоем примере самое обычное делегирование. Здесь вообще нет никакого паттерна, максимум прокся, ито какая-то убогая.
twin
Цитата (Ron @ 4.09.2017 - 13:25)
Твин, в твоем примере самое обычное делегирование. Здесь вообще нет никакого паттерна, максимум прокся, ито какая-то убогая.
Ну ты же сам говорил, что паттерн, это не реализация, а идея. Идея декоратора, на сколько я понял, изменить часть функционала на изменяя интерфейса. Его еще враппером называют. Оберткой. Просто вы привыкли, что обернуть можно только объект. А почему?

В том коде, что я написал, что не так? Интерфейс сохранился, часть функционала изменилась (причем не переопределилась, а именно изменилась, дополнилась). Идея вроде не нарушена. А реализация - моё право.

Прокся там есть внутри, но в ваших декораторах она тоже используется. Не обязательно выносить сюда все методы. Делегирование, это то, что chee подумал. Если бы в классе были другие публичные методы, то да - делегирование. А тут интерфейс сохранен. Объясни в чем претензия. Может в том, что я тут прямой вызов написал, без call_user_func_array(), но это тоже реализация. К идее отношения не имеет... Растолкуй невежде, раз ты все понимаешь.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
Цитата (twin @ 4.09.2017 - 17:51)
Просто вы привыкли, что обернуть можно только объект. А почему?

Просто здесь нет контракта раз и в примере прокся два. Раз уж реализацию не обсуждаем, тогда ладно, готов согласиться на проксю. Действительно, реализация дело каждого.

Цитата (twin @ 4.09.2017 - 17:51)
Растолкуй невежде, раз ты все понимаешь.

Боже упаси, я далеко не всё понимаю. Буду благодарен за некоторые по части общеизвестных/общепринятых моментов.
twin
Цитата (Ron @ 4.09.2017 - 14:26)
Просто здесь нет контракта раз
Контракт тут причем... Это тоже тонкости реализации.

Цитата (Ron @ 4.09.2017 - 14:26)
Раз уж реализацию не обсуждаем, тогда ладно, готов согласиться на проксю. Д
Э, нет. Так не пойдет. Я все же настаиваю, что это декоратор чистой воды. Для пущей важности готов убрать проксю и добавить контракт, хотя терпеть их не могу:
<?php

interface
exInterface
{
public static function firstMethod();
}

class example implements exInterface
{
public static function firstMethod()
{
return 1;
}
}


class twinorator implements exInterface
{
public static function firstMethod()
{
return '<b>'. example::firstMethod() .'</b>';
}
}



echo example::firstMethod();
echo twinorator::firstMethod();
Что тут не так?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
Цитата (twin @ 4.09.2017 - 18:36)
Я все же настаиваю, что это декоратор чистой воды.

Декоратор подразумевает нечто вроде цепочки вызовов, которая определяет последовательность. Я ее тут не вижу, в последнем примере это опять же прокся для example. Получается последовательность определена в методах, а это ниразу не декоратор, так себя не ведет даже прокся, которой передается инстанс объекта делегирования типа интерфейс. То есть заранее не известно куда будет делегирование. У тебя это хардкодится, так что даже прокся получается хреновая. Захочешь подменить класс Examle на NewExample и чего, лазить по всем методам переписывать вызовы? Главное днамики нет. =( Да, понимаю, IDE может выполнить сию задачу, ок, отняли у тебя среду разработки или сглючила она, не знаю, срочно из консоли нужно подменить на тестовую версию NewExample ситуаций масса.

В идеале объекты (классы) не должны ничего друг о друге знать, кроме интерфейса, никаких названий класса. Тогда получается для декоратора в твоем случае нужно передавать в первый метод (вызова) массив, содержащий цепочку и на каждой "итерации" выбивать из него имя текущего класса. Так получится, но опять же убого, почему просто не использовать объекты, в чем сложность?

Интерфейсы нужно любить, потому что они являют собой нечто вроде документации, далеко не всегда реализуются только методы интерфейса, часто есть дополнительные. Как потом выискивать что именно относится к контракту, чтобы не поломать проект? Понадобился еще один полиморфный объект/класс и чего делать? Долго выяснять, а так заглянул в интерфейс и всё понятно становится. Кроме того будет выброшена фатальная ошибка раз и IDE будет орать два. Можно сразу сгенерировать заголовки методов контракта. Удобно это, что не говори.

Или нет? Тогда прошу подключиться других участников к беседе, все мы люди, я тоже могу ошибаться, думаю мне никто не откажет в этом праве? wink.gif

twin
Цитата (Ron @ 4.09.2017 - 16:01)
Декоратор подразумевает нечто вроде цепочки вызовов, которая определяет последовательность
Нет, не подразумевает. Есть такая штука, можно тоже паттерном обозвать. Она так и называется - цепочка декораторов. Но суть самого декоратора тут соблюдена.
Цитата (Ron @ 4.09.2017 - 16:01)
в последнем примере это опять же прокся для example.
Нет, это не прокся. Прокся просто передает управление, а тут изменяется функционал. Причем не просто изменяется, а дополняется. Если в декорируемом классе заменить 1 на 2, декоратор завернет в теги двойку. Тоесть он не переопределяет метод основного класса, тот работает как обычно. Декоратор дополняет результат своей спецификой.
Цитата (Ron @ 4.09.2017 - 16:01)
Получается последовательность определена в методах, а это ниразу не декоратор
Нет тут никакой последовательности. Это просто обертка. Враппер. Декоратор.
Цитата (Ron @ 4.09.2017 - 16:01)
Получается последовательность определена в методах, а это ниразу не декоратор, так себя не ведет даже прокся, которой передается инстанс объекта делегирования типа интерфейс. То есть заранее не известно куда будет делегирование.
Это опять про цепочку, но можно и это сделать, если так нужна последовательность. Ведь по сути ты в переменной передаешь вовсе не объект, а ссылку на него. Ни кто мне не помешает передать, так же как ссылку, строку с адресом класса. Но еще раз повторю - я говорю не про цепочку декораторов, а именно про декоратор. Обертку. Я всегда раньше называл это оберткой. Оказалось - это целый паттерн, да еще и с красивым названием. smile.gif

Может ты и прав, в светских беседах это может дать какй то профит, что я теперь знаю его название. Но в программировании это не дает ровным счетом ничего.

Цитата (Ron @ 4.09.2017 - 16:01)
У тебя это хардкодится, так что даже прокся получается хреновая. Захочешь подменить класс Examle на NewExample и чего, лазить по всем методам переписывать вызовы?
Стопэ. Куда поехал))) Это вообще не важно, это реализация. Пусть у меня трижды говнокод и я не смогу ничего подменить, но декоратором это быть не перестает. smile.gif

Про интерфейсы отдельная тема, с этим пока не разобрались.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
twin, в примерах которые размещены на wiki, почему-то именно "цепочка" как ты ее называешь. Причем и на Java и на PHP5, получается суть декоратора именно цепочка. Опять же, с моей точки зрения одиночный декоратор и прокся вещи идентичные. Тут правильнее говорить именно о прокси.
Цитата
Adapter придает своему объекту новый интерфейс, Proxy предоставляет тот же интерфейс, а Decorator обеспечивает расширенный интерфейс.

У тебя интерфейс тот же, то есть суть прокси. Поведение вовсе тут не при чем, это полиморфизм: возможность изменять поведение без изменения интерфейса (то есть без влияния на объект-клиент). Эт не паттерн, но принцип.
Цитата (twin @ 4.09.2017 - 20:50)
Но в программировании это не дает ровным счетом ничего.

Сами названия для разработчика одиночки, который ни с кем никогда не общается конечно же не важны, главное суть.
twin
Цитата (Ron @ 4.09.2017 - 17:41)
в примерах которые размещены на wiki, почему-то именно "цепочка" как ты ее называешь.
Ты сам говорил, что нельзя воспринимать паттерны по примерам. А вот я тебе сюда прям выдержки из вики:
Декоратор.
Цитата
Задача
Объект, который предполагается использовать, выполняет основные функции. Однако может потребоваться добавить к нему некоторую дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта.


Цитата
Способ решения
Декоратор предусматривает расширение функциональности объекта без определения подклассов.


А вот про прокси:
Цитата
Проблема
Необходимо контролировать доступ к объекту, не изменяя при этом поведение клиента.

Необходимо иметь доступ к объекту так, чтобы не создавать реальные объекты непосредственно, а через другой объект, который может иметь дополнительную функциональность.

Цитата (Ron @ 4.09.2017 - 17:41)
У тебя интерфейс тот же, то есть суть прокси
У декоратора тоже должен быть такой же интерфейс. не в этом суть.
Цитата (Ron @ 4.09.2017 - 17:41)
Опять же, с моей точки зрения одиночный декоратор и прокся вещи идентичные.
Прокси не меняет функционал, в сотый раз говорю. В том и различие.

Ну так какие же они идентичные?

А про цепочку, я уже говорил. Не важно, захардкожены ссылки или я строкой передам, это к идее отношения не имеет. Если мне не нужно несколько декораторов, один только нужен. Причем тут цепочка.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (Ron @ 4.09.2017 - 17:41)
Сами названия для разработчика одиночки, который ни с кем никогда не общается конечно же не важны, главное суть.

Ты послушай тот вебинарчик)) Там чувак про это как раз и говорил. Внутри команды можно называть это как угодно. В светских беседах и на собеседованиях - да. Можно блеснуть. Теоретически. Но кроме ЧСВ это ничего не даст. Практического применения этому мало. Суть да, важна. А названия, диаграмы эти, примеры... Только запутать могут. Вот мы сейчас черти скока времени не можем придти к общему знаменателю. Оба знаем название паттерна. Оба читали о нем в разных источниках. И что? Это как то помогло нам найти общее видение паттерна? Хрентотам. И в команде тоже самое. Важен стиль архитектуры, а не эта теоретическая мишура.

Вот мы называем это декоратором. Ты пришел, и говоришь - не. Это прокся. Начался холивар. Где тут ускорение разработки и слаженность комманды?

А вот если ты пришел, а тебе говорят - это твиноратор. И всё, инцидент исчерпан в зародыше. Начинаем работать. biggrin.gif

Так что как еще посмотреть, где лучше, где хуже. Я давно говорил, сколько программистов, столько и мнений. И никакими названиями и примерами этого не упорядочить. Только практика поможет.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Ron
twin, вся беда в том, что ты воспринимаешь абстрактные вещи слишком буквально, мне кажется. Неудевительна неприязнь к ООП в таком случае.

У тебя разве декоратор добавляет новую функциональность? Я этого не вижу, форматирование текста не является новым функционалом, относительно интерфейса.

Одна из проблем решаемых прокси "контролировать доступ к объекту". Например есть подтип логгера, нихххх...рена он не контролирует. =) А есть подтип который нацелен на развязку с кэшем. Если говорить про контроль, но это защищающий тип. Твой подтип форматирует контент, в примере по крайнкй мере. Он не описан на вики, ок, как можно описать все юзкейсы? Не возможно.

Цитата (twin @ 4.09.2017 - 21:54)
Если мне не нужно несколько декораторов, один только нужен.

Если нужен один, то настаиваю, что это НЕ декоратор (по крайней мере).

Давай так, мы похоже столкнулись по терминологии/восприятию. Я с места не сойду, ты, видимо, тоже. Предлагаю спросить у господ форумчан, скилловых естественно, что они думают по поводу нашего спора. Не в целом, а конкретно прокси vs декоратор, когда речь не идет о "цепочках" (которые твин берет и выбрасывает из паттерна, хотя они являют суть и главное отличие от прокси).
Ron
Цитата (twin @ 4.09.2017 - 22:05)
И что? Это как то помогло нам найти общее видение паттерна? Хрентотам.

Потому что мы спорим о тонкостях абстрактных вещей, чего делать не нужно. Структурно эта пара идентична, но декоратор подразумевает цепочки. Всё-таки, ну я так считаю, ты считаешь иначе, повод нашей полемики ерундовый, если так работать в команде она с места не сдвинется, вот что я тебе скажу. Не по паттернам будем спорить, так по другим поводам, мы не работаем в команде а уже коснулись целого пласта проблем. Так нельзя в любом случае если о команде речь.



Быстрый ответ:

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