[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Fluent interface (текучий интерфейс)
Djadka
Интересует вообще все за и против данного подхода в PHP, так же скорость работы и оптимальность?



Спустя 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 (простой, только для примера)

$(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 - это верный говнокод.

Спустя 4 минуты, 57 секунд (10.04.2012 - 10:11) Djadka написал(а):
по сути в памяти уже есть данный экземпляр и он уже не порождает новые, он только возвращает сам себя.
Все фрамефорки в нынешнее время написано по методу тогда этого же "гавнокода", если я не ошибаюсь, то даже Зенд фраемворк имеет такой же подход.
Каждый кодит так как он хочет, фломастеры у всех разные и разного вкуса. Только вот оптимально ли это в ресурсах и скорости, вот в чём вопрос? Стиль одно, ресурсы другое, можно кодить просто, только вот наплодить пачку переменых и в итоге память и скорость будет хромать, а можно обойтись несколькими переменными и будет скорость и ресурсоёмкость в порядке.

Спустя 12 минут, 35 секунд (10.04.2012 - 10:23) caballero написал(а):
Не будет там проблем со скоросью и ресурсами. Железо гораздо дешевле стоимости программиста. Поэтому надо писать код нормально чтбы его можно было нормально читать и сопровождать.
И не надо кивать на другие фреймворки. Сайт на 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 методов.
типа:

//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 ? Ну например что нибудь типа реализации собственно бизне-слогики.
В любом случае интерфейс не читабелен и противоречит грамотному стилю програмирования - с какого перепугу сеттеры вообще что то должны возвращать? ихнее предназначение установить свойство а не возвращать чего то.

Цитата
просто из удобства Jquery разрешило разнообразные типы ретурна


Еще раз - JavaScript - наполовину функциональный язык. Не надо сравнивать с PHP.
.

Спустя 1 час, 41 минута, 19 секунд (15.04.2012 - 15:26) SlavaFr написал(а):
Цитата (caballero @ 15.04.2012 - 10:44)
SlavaFr

А что, других методов не бывает кроме set и get ? Ну например что нибудь типа реализации собственно бизне-слогики.
В любом случае интерфейс не читабелен и противоречит грамотному стилю програмирования - с какого перепугу сеттеры вообще что то должны возвращать? ихнее предназначение установить свойство а не возвращать чего то.

Цитата
просто из удобства Jquery разрешило разнообразные типы ретурна


Еще раз - 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
То что индусов до фига програмистов и они участвуют в проектах покруче дебильного Зенда не отменяет существования понятия "индусский код".
Быстрый ответ:

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