Спустя 14 минут, 38 секунд (9.04.2012 - 19:47) redreem написал(а):
да, нас всех тоже интересует. слушаем.
Спустя 1 час, 24 минуты, 51 секунда (9.04.2012 - 21:12) Семён написал(а):
Да вроде сейчас во всех фреймворках это можно встретить
Спустя 49 секунд (9.04.2012 - 21:13) Djadka написал(а):
Да вот везде встречается, только вот интересует мнение насколько это оптимально в плане ресурсов и скорости?
Спустя 10 часов, 32 минуты, 35 секунд (10.04.2012 - 07:46) redreem написал(а):
мне кажется что текучий интерфейс - это малость зло. пример в jQ (простой, только для примера)
смысл в том, что не имея перед глазами список возможных возвращаемых результатов каждого метода класса, использование "текучки" превращается в танцы с бубном. в моем примере все просто и очевидно, понятно, что .css('width') надо поставить в конец очереди, но это только для примера, а если более сложные конструкции? вот и гадай, возвращает метод объект или нет?
да и "визуальная наглядность" довольно сомнительна. в длинных цепочках глаза разбегаются при анализе звеньев и их параметров.
чем хуже запись?
да ничем.
кто недоумевает как вообще это реализуется, достаточно просто показаны примеры тут: http://ru.wikipedia.org/wiki/Fluent_interface
$(el).css({width:100}).animate({height:120}); //сработает
a = $('#cmonitor').css('width').css({height:120}); //несработает
a = $('#cmonitor').css({height:120}).css('width'); //сработает
смысл в том, что не имея перед глазами список возможных возвращаемых результатов каждого метода класса, использование "текучки" превращается в танцы с бубном. в моем примере все просто и очевидно, понятно, что .css('width') надо поставить в конец очереди, но это только для примера, а если более сложные конструкции? вот и гадай, возвращает метод объект или нет?
да и "визуальная наглядность" довольно сомнительна. в длинных цепочках глаза разбегаются при анализе звеньев и их параметров.
чем хуже запись?
el = $(id);
el.css({width:100});
el.animate({height:120});
a = el.css('width');
el.css({height:120});
да ничем.
кто недоумевает как вообще это реализуется, достаточно просто показаны примеры тут: http://ru.wikipedia.org/wiki/Fluent_interface
Спустя 42 минуты, 39 секунд (10.04.2012 - 08:28) glock18 написал(а):
Цитата (Djadka @ 9.04.2012 - 16:33) |
Интересует вообще все за и против данного подхода в PHP, так же скорость работы и оптимальность? |
да ну какая там скорость работы и оптимальность.
основные за и против - читаемость. Кто-то с кровью из носа доказывает, что fluent читается в 100 раз лучше, кто-то наоборот. Лично я обычно, если api предлагает fluent interface, пользуюсь им по мере применимости, хотя его наличие мне глубоко безразлично.
Цитата (redreem @ 10.04.2012 - 04:46) |
смысл в том, что не имея перед глазами список возможных возвращаемых результатов каждого метода класса, использование "текучки" превращается в танцы с бубном. в моем примере все просто и очевидно, понятно, что .css('width') надо поставить в конец очереди, но это только для примера, а если более сложные конструкции? вот и гадай, возвращает метод объект или нет? |
ну, все не совсем так. подобные ошибки можно легко отловить (js просигнализирует о вызове несуществующего метода), и что более важно - их делать не надо.
Цитата (redreem @ 10.04.2012 - 04:46) |
чем хуже запись? el = $(id); el.css({width:100}); el.animate({height:120}); a = el.css('width'); el.css({height:120}); |
объективно говоря, она хуже по количеству строк. хотя конечно, ошибиться так сложнее.
Как бы то ни было, каждый под себя стиль выбирает. Разницы по скорости там существенной нет.
Спустя 1 час, 14 минут, 11 секунд (10.04.2012 - 09:42) Djadka написал(а):
Разницы, нет может в 5 классах, а при использование тысячи классов, возможно уже будет конкретная разница в скорости, ну не может быть, что дело только в подходе написания, конечно может самому какие тесты прогнать, но всё таки интересует кто сталкивался? Проще конечно без текучки быстрее читается, код лично для меня.
Спустя 5 минут, 44 секунды (10.04.2012 - 09:48) redreem написал(а):
теоретически каждое звено в цепочке - это порождение нового временного экземпляра, ну или как минимум новой ссылки на объект. если говорить о микросекундах, то полюбому будет медленнее.
Спустя 17 минут, 42 секунды (10.04.2012 - 10:06) caballero написал(а):
как по мне это просто разновидность говнокода поскольку абсолютно нечитаем.
по мере вызова цепочки может изменится объект вызова и человек который
то будет читать уже не поймет это функции изначального объекта или уже другой начался.
В примере: второй .css это какого объекта? первоначального или второй .css вернул какой то новый объект. И с какой стати css вообще возвразает какой то объект. Запдача данной функции установить свойство а не найти и вернуть данные, максимум что она может возвращать это true/false
При нормальном кодировании должно быть два, максимум три вызова.
Если больше надо делать промежуточные переменные. Компилятору все равно - он сгерерит одинаковый код на выходе, но такой код можно будет хотя бы прочитать и человеку не надо помнить что возвращает каждая функция
(особенно если переменным давать более вразумительные имена чем а).
В яваскрипте такие вещи еще с некотрой натяжкой могут иметь место поскольку оный в значительной степени функциональный язык а расово верном функциональном языке нет переменных вообще. Но в PHP - это верный говнокод.
по мере вызова цепочки может изменится объект вызова и человек который
то будет читать уже не поймет это функции изначального объекта или уже другой начался.
В примере: второй .css это какого объекта? первоначального или второй .css вернул какой то новый объект. И с какой стати css вообще возвразает какой то объект. Запдача данной функции установить свойство а не найти и вернуть данные, максимум что она может возвращать это true/false
При нормальном кодировании должно быть два, максимум три вызова.
Если больше надо делать промежуточные переменные. Компилятору все равно - он сгерерит одинаковый код на выходе, но такой код можно будет хотя бы прочитать и человеку не надо помнить что возвращает каждая функция
(особенно если переменным давать более вразумительные имена чем а).
В яваскрипте такие вещи еще с некотрой натяжкой могут иметь место поскольку оный в значительной степени функциональный язык а расово верном функциональном языке нет переменных вообще. Но в PHP - это верный говнокод.
Спустя 4 минуты, 57 секунд (10.04.2012 - 10:11) Djadka написал(а):
по сути в памяти уже есть данный экземпляр и он уже не порождает новые, он только возвращает сам себя.
Все фрамефорки в нынешнее время написано по методу тогда этого же "гавнокода", если я не ошибаюсь, то даже Зенд фраемворк имеет такой же подход.
Каждый кодит так как он хочет, фломастеры у всех разные и разного вкуса. Только вот оптимально ли это в ресурсах и скорости, вот в чём вопрос? Стиль одно, ресурсы другое, можно кодить просто, только вот наплодить пачку переменых и в итоге память и скорость будет хромать, а можно обойтись несколькими переменными и будет скорость и ресурсоёмкость в порядке.
Все фрамефорки в нынешнее время написано по методу тогда этого же "гавнокода", если я не ошибаюсь, то даже Зенд фраемворк имеет такой же подход.
Каждый кодит так как он хочет, фломастеры у всех разные и разного вкуса. Только вот оптимально ли это в ресурсах и скорости, вот в чём вопрос? Стиль одно, ресурсы другое, можно кодить просто, только вот наплодить пачку переменых и в итоге память и скорость будет хромать, а можно обойтись несколькими переменными и будет скорость и ресурсоёмкость в порядке.
Спустя 12 минут, 35 секунд (10.04.2012 - 10:23) caballero написал(а):
Не будет там проблем со скоросью и ресурсами. Железо гораздо дешевле стоимости программиста. Поэтому надо писать код нормально чтбы его можно было нормально читать и сопровождать.
И не надо кивать на другие фреймворки. Сайт на PHP весом в мегабайты исходников - маразм уже само по себе независимо от стиля кодирования.
И не надо кивать на другие фреймворки. Сайт на PHP весом в мегабайты исходников - маразм уже само по себе независимо от стиля кодирования.
Спустя 2 минуты, 55 секунд (10.04.2012 - 10:26) Djadka написал(а):
Знаю некоторые фраемворки весом по 70 мегов в сопровождение цмс. Да код надо что бы был очень читабельный, а то потом будет печалька, в плане его поддерживания.
Спустя 1 час, 13 минут, 8 секунд (10.04.2012 - 11:39) redreem написал(а):
Цитата |
по сути в памяти уже есть данный экземпляр и он уже не порождает новые |
напишите простенький транслятор собственноручно и поймете что вы не правы. порождается как минимум ссылка. в JS 100% так, в PHP - незнаю, не удивлюсь что он делает временные копии объектов при проходе по цепочке.
с другой стороны размещение всех порожденных сущностей в одной локальной области возможно ускоряет доступ к ним. так или иначе памяти жрется больше, а по скорости - надо потестить просто-напросто.
Спустя 5 дней, 1 час, 56 минут, 58 секунд (15.04.2012 - 13:36) SlavaFr написал(а):
короче разница в скорости и в пожерании ресурсов на столько не значительная, что об этом не стоит даже говорить. Дополнительное "return $ths;" в set-Методах практически не пожерает ресурсов так как в php5 передается только ссылка на объект.
ОТ:
Я персонально не считаю Fluent плохим стилем и нахожу его довольно приятным при чтени и написании кода. Так же не могу припомнить, чтоб мои колеги по этому поводу возмущались. Единственное это чтоб seter были структурно отделены от geter методов.
типа:
a вот так, лучше не надо, так как тяжело визуально отделить сет методы от гет методов:
Если к стате посмотреть на пример приведенный redreem сразу видна эта прооблема
просто из удобства Jquery разрешило разнообразные типы ретурна и к томуже использует метод css как set и get, что и приводит к тому что в css('width') работающему как get выдается число, а в css({height:120}) работающему как set по принципу Fluent выдается this.
ОТ:
Я персонально не считаю Fluent плохим стилем и нахожу его довольно приятным при чтени и написании кода. Так же не могу припомнить, чтоб мои колеги по этому поводу возмущались. Единственное это чтоб seter были структурно отделены от geter методов.
типа:
//set propertys
$var ->setA('blja')
->setB('blum')
->setC(6);
a вот так, лучше не надо, так как тяжело визуально отделить сет методы от гет методов:
echo $var ->setA('blja')
->setB('blum')
->setC(6)
->getHTML();
Если к стате посмотреть на пример приведенный redreem сразу видна эта прооблема
a = $('#cmonitor').css('width').css({height:120}); //несработает
a = $('#cmonitor').css({height:120}).css('width'); //сработает
просто из удобства Jquery разрешило разнообразные типы ретурна и к томуже использует метод css как set и get, что и приводит к тому что в css('width') работающему как get выдается число, а в css({height:120}) работающему как set по принципу Fluent выдается this.
Спустя 7 минут, 53 секунды (15.04.2012 - 13:44) caballero написал(а):
SlavaFr
А что, других методов не бывает кроме set и get ? Ну например что нибудь типа реализации собственно бизне-слогики.
В любом случае интерфейс не читабелен и противоречит грамотному стилю програмирования - с какого перепугу сеттеры вообще что то должны возвращать? ихнее предназначение установить свойство а не возвращать чего то.
А что, других методов не бывает кроме set и get ? Ну например что нибудь типа реализации собственно бизне-слогики.
В любом случае интерфейс не читабелен и противоречит грамотному стилю програмирования - с какого перепугу сеттеры вообще что то должны возвращать? ихнее предназначение установить свойство а не возвращать чего то.
Цитата |
просто из удобства Jquery разрешило разнообразные типы ретурна |
Еще раз - JavaScript - наполовину функциональный язык. Не надо сравнивать с PHP.
.
Спустя 1 час, 41 минута, 19 секунд (15.04.2012 - 15:26) SlavaFr написал(а):
Цитата (caballero @ 15.04.2012 - 10:44) | ||
SlavaFr А что, других методов не бывает кроме set и get ? Ну например что нибудь типа реализации собственно бизне-слогики. В любом случае интерфейс не читабелен и противоречит грамотному стилю програмирования - с какого перепугу сеттеры вообще что то должны возвращать? ихнее предназначение установить свойство а не возвращать чего то.
Еще раз - JavaScript - наполовину функциональный язык. Не надо сравнивать с PHP. . |
Для других методов кроме set (без ретурна) можно конечно тоже этот патерн применять.
О том что это не граматный стиль программирования я еще не от кого не слышал. Он может нравится или ненравится. Одни находят его читабельным другие нет. Что мне в нем нравитсй, так это то, что не кто не обязан его применять, но может им пользоватся. Тоесть если классы программировать в стиле fluent, то не кто не мешает вызывать методы в нормальном стиле. Если група программистов решает этим стилем не пользоватся, то не обязательно перепрограммировать классы, так как "return $this" абсолютно не нагружает систему, а выброшенный на воздух поинтер на объект не кому не мешает.
Цитата |
с какого перепугу сеттеры вообще что то должны возвращать? |
не должны но могут и не кто это не запрещал.
Спустя 29 минут (15.04.2012 - 15:55) caballero написал(а):
Цитата |
"return $this" абсолютно не нагружает систему, а выброшенный на воздух поинтер на объект не кому не мешает. |
он просто засирает код. Код надо писать так чтобы его потом прочитать можно было. Человек который станет это читать должен будет задаватся вопросом - а зачем тут этот оператор.
Я знаю только одну ситуацию когда оправдано возвращаенние объекта функцией которая ничего возвращать не должна - если метод принимает динамически создаваемый объект.
$SomeContainer->add(new MyClass());
Цитата |
не должны но могут и не кто это не запрещал. |
Разумеется говнокодить никто не запрещает.
Сам факт что надо вызывать несколько сеттеров подряд (неважно каким способом) уже говорит о неграмотном кодировании.
Спустя 2 минуты, 48 секунд (15.04.2012 - 15:57) Djadka написал(а):
Почему текучка это гавнокод, вообще не понимаю? Есть стиль програмирование, текучка например хорошо при создание кучи полей из шаблонизатора, и моментами это экономия ресурсов.
Спустя 13 минут, 29 секунд (15.04.2012 - 16:11) caballero написал(а):
Цитата |
Почему текучка это гавнокод, вообще не понимаю? Есть стиль програмирование, текучка например хорошо при создание кучи полей из шаблонизатора, и моментами это экономия ресурсов. |
Шаблонизаторы в PHP который по своей природе уже шаблонизатор - это изврат. Естественно что и для его програмирования требуется такая же методика.
Впрочем эту кучу полей можно передать массивом как в Смарти например а не городить стопицот вызовов по одному параметру.
Спустя 3 часа, 41 минута, 36 секунд (15.04.2012 - 19:52) SlavaFr написал(а):
Цитата (Djadka @ 15.04.2012 - 12:57) |
Почему текучка это гавнокод, вообще не понимаю? |
потому, что caballero его находит нечитабельным.
@caballero напиши программистам Zenda и JQuery что они говнокодят и не забудь сказатъ рекламируемым тобой Zippy что они в библиотеке phpQuery которая использует Zend_Http_Client
являются распостранителями Fluentа (говнокода в твоем понимание)
Спустя 45 минут, 16 секунд (15.04.2012 - 20:38) caballero написал(а):
SlavaFr
То что индусов до фига програмистов и они участвуют в проектах покруче дебильного Зенда не отменяет существования понятия "индусский код".
То что индусов до фига програмистов и они участвуют в проектах покруче дебильного Зенда не отменяет существования понятия "индусский код".