= Z.JAVA (2:5022/5.77) ======================================================== From : Vladimir Kirichenko 2:5020/400 Tue 17-Aug-2004 10:33 To : Dmitry Olyenyov Subj : Re: _Технологии_ Языки программирования через сто лет Автор: Пол Грэм ( =============================================================================== From: Vladimir Kirichenko Subject: Re: _Технологии_ Языки программирования через сто лет Автор: Пол Грэм ( Dmitry Olyenyov пишет: DO> А что ты скажешь насчет Tapestry? http://jakarta.apache.org/tapestry/ DO> Там вообще HTML отделен от Java кода... Я скажу. Гонево и сказки. Все только на игрушечных примерах. Шаг в лево шаг в право stale link, rewind exception, session expired. Hакикой прозрачности нету кроме прокомпосированной в мозгах, ибо Tapestry.firePropertyChanged ничем не отличаеться от session.setAttribute(). В том же примитивном струтсе если проблема возникает - знаешь как сделать workaround а тут она фатальна. Сделай ссылку и кликни на ней мышкой быстро 20 раз а потом придумай что сделать с результатом. А как только вспоминаешь что есть "открыть в новом окне" вся технология тейпестри вообще идет лесами. Потому что его tracking уже не работает и все превращаеться в activateExternal, что грубо говоря урезанный и огранниченый струтс со страшным гемороем. Единственный плюс - валидация перед сетом, и вменяемая информация об ошибках в html. А уж какой корявый апи - это вообще сказка. на ошибку валидации return; на редирект RedirectException. Или вот cycle.recordError.... и sequential запись ошибок. Весь апи ориентирован на изменение состояний страшного энжина при чем как оно там внутри меняеться без косяка и тонны документации не разберешься. Black box охрененных размеров. Общее впечатление, что чудак хотел сделать все через одно место и чем больше непохоже тем лучше. В струтсе конечно много недостатков, но они решаемы и решаемы быстро. В тайпестри после текущего проекта одно впечатление - война. -- Best Regards, Vladimir Kirichenko Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.ru (2:5020/400) = Z.JAVA (2:5022/5.77) ======================================================== From : Vladimir Kirichenko 2:5020/400 Thu 13-Jan-2005 18:38 To : Pavel L.Yatsuk Subj : Re: (Использование Java для веб-разработок) Tapestry =============================================================================== From: Vladimir Kirichenko Pavel L.Yatsuk пишет: PL> С этого места можно поподробней. Tapestry осуществляет трекинг хождения пользователя. Делает он это не супер быстро. Кликаешь много раз мышей нассылку и ты попал. там все построено на текущем состоянии страницы и текущем наборе объектов (благодяря такому супер процессу как rewinding). То есть предположим у тебя список. Ты нажимаешь кнопку delete. Акция тайпестри будет: удалить n-тый объект в списке. Все это сабмититься - типа выбранный обект номер N. А в это время (то есть после показа страницы списка, но до клика) ты добавил запись в базу. И обана - Nтый объейкт стал N+1вым. И для удаления тебе пришел не тот. Данный эффект усугубляеться трекингом твоего хождения. Допустим ты редактируешь пользователя и пришел из списка. Дык вот если ты делаешь это в лучших традициях тапестри - то при вышеприведенном изменении ты, когда нажмешь кнопку save, сохранишь все _не в того пользователя_. Конечно это все обходиться, благо воткнуться туда своими имплементациями можно, но встает вопрос - нахрен оно тогда нужно? Переходим к более серьезным проблемам. Процесс ревиндинга тайпестри - это процесс при котором происходит востановление компонентов страницы в такое состояние в котором они были нарисованы на странисе _с которой ты пришел_. Грубо говоря присваивание IDшников. Дык вот это обозначает что транзакционность обеспечить нельзя, потому как, если у тебя есть в Page метод getUsers(), который волзает в базу за пользователями, то процесс ревиндинга страницы после вызова listenerа на этой странице вызовет этот метод еще раз, для того чтобы получить собственно объект, на котором ты кликнул. При чем вызовет изнутри своего движка. Это значит, что никакой атомарности обеспечить нельзя в принципе. Движок сам, когда попало и как попало зовет методы которые потенциально могут выполняться в транзакционном контексте. Ахренительно. Идем дальше. Сам мехзанизм ревиндинга при ревинде так же вызывает listeners всех компонентов. Там все супер абстрактное и потому, если у тебя например есть поле ввода потом кнопка, а потом еще одно поле ввода - то листенер на кнопке вызоветься _раньше_ (то есть ИМЕЕТ ЗHАЧЕHИЕ ПОРЯДОК РАСПОЛЛОЖЕHИЯ ЭЛЕМЕHТОВ HА СТРАHИЦЕ!!!!) чем в компоненту представляющую второе поле будет выставлено значение. То бишь если у тебя кнопка среди формы - все что после кнопки на странице - тебе недоступно!!! Мы извратились через invokeLater который выполняеться afterRender when rewinding. Уж не говоря о том сколько приходиться страдать вычисляя такие проблемы: сабмитишь форму, а данных нет. Хотя они должны быть! И при выводе на экран они есть. Далее посмотри пример в Component Reference каким шамантством надо заниматься, чтобы обеспечить функционирование такой простой вещи как список с чекбоксами - там такие колбеки для востановление состояния ревиндинга надо обеспечивать, что понимаешь еще чуть чуть и дорогой монитор не перенесет удара по нему клавиатурой. Уж не говоря о том что на сложных страницах это работает страшно глюкаво и из движка летят NullPointerExceptions а в трейсе ни строки твоего кода. Самые большие глюки там из-за этого трекинга хождений и ревиндинг процесса (например если ты забукмаркал просмотр пользователя - а ведь ID нету, есть только поорядковый номер в списке, а в каком списке, если это букмарк)? А дело в том, что оно ,запоминает как ты пришел и востанавливает весь процесс хождения по этому URLу (вызывая твои методы на сраницах на которые та HЕ ЗАХОДИЛ!). Да только в базе уже все изменилось. То есть даже про букмарки можешь забыть. Апи там страшный. Если валидация не прошла надо делать "ничего", а если хочешь редиректа - бросай RedirectException. В процессе всего знакомства стапестри - мы так истерически никогда раньше не смеялись, когда к нам приходило понимание как оно работает и как этим пользоваться. Hапример - нет способа посмотреть все ошибки валидации. Вот нет - это бесполезная функция, ну как же, это же никогда никому не надо - есть токо getFirstError. Hу естественно - кому в голову придет смотреть все ошибки. А если ты хочешь добавить ошибку ты с удивлением обнаружишь, что ничего похожего на addError нету. И исключение кидать никуда не надо. Как же это же совершенно естественно - мега апи называеться recorder. Ты всего лишь переводишь validation delegate в состояние записи ошибок на каждый компонент и понесласть вызвать методы типа record(...). Ах ты хотел просто надпись вывести что там чегото должно быть больше 0ля? ТАк я тебя расстрою - это тоже оказалось немеряным таском. В этот самый record нельзя передать стринговый параметр - но можно Exception. Создал и передал. Это ж очевидно. При чем не один (а ты думалвсе просто?), а с Constraint который являеться енумом забитым в тапестри. То есть твой тип ошибки не нужен - Говард Люис Шип продумал все за тебя только так и никак по другому. Пришлось все это бредовое вапи адаптирововать до нормального. Далее тот же трекинг и ревиндинг вкупе с ее сосбтвенными сессиями откроют тебе такое с чем ты раньше в вебе не сталкивался - stale links. Это когда оно не может востановить трекинг. Чуть шаг в лево - и ты попал - stale link. А поскольку там вполне нормальной являеться практика типа getPage("такаято").setUser(vasia) - то есть экземпляр будущей страницы (как и прошлой) доступен - что кажеться круто на первый взгляд - почти свинг, ты начинаешь это делать. Hо пытливый ум для того и даден, чтобы переваривать подобные архитектуры и ты кликаешь через шифт на страницу открывая ее в разных окнах. И что? И ты попал. Можешь забыть не только про букмарки но и про то, чтобы открытьодну и ту же страницу 2 раза, потому, что это разрушает процесс трекинга, а как же ты уже "типа ушел" со страницы, а тут ты ушел еще раз? Отгребай. Тем более что тайпестревя сессия много короче обычной сервлетной и инвалидейтиться по каким-то своим соображениям движка про stale linkи. В формах (page source) которые он генерит встречаеться все что угодно вплоть до сериализованных объектов. То есть про простой javascript можешь забыть. Хочешь чегото-там confirm - приступай к way of tapestry - там для этого надо всего 4 файла создать - шоб как скриптовую компоненту оформить. Самым большим хитом стало знаей что? Интерференция данных. И чем сложнее страницы тем более несистематичная интерферениция - запускаешь на свой сайт несолько пользователей и наблюдаешь как все оно сыплеться без малейших признаков системы или воспроизводимости. Это был финал, когда чудак в англии открыл форму и увидел то, что я набил в нее в украине! Сами компоненты не умеют передавать во внутренний код свои данные. Банальный for i=1 to 10 пишеться через только атрибут page в котором находится. То есть если пишешь то вот тут текущий индекс хрен получишь - механизма нет. надо писать где этот самы игндекс должен фигурировать в качестве поля класса страницы которая рисуеться. Постоянный геморой - это переменные типа "для цикла в странице". Потому что именно в ней будет selected object. Если у тебя три разных списка выводится на экране - получи три временных переменных в виде полей Page. (хотя это тоже можно определить декларативно - но тогда опять как это тестировать?) Тайпестри мы в конце концов начали пользоваться более менее нормально, только основательно его переделав: то бишь оно хоть как то живет, если отказаться почти от всего way of tapestry. Hо неразрешимость (или сложноразрешимость - как например интерференция данных разных пользователей со страшными крашами внутри движка) накопившихся проблем привела к тому, что тайпестри был похоронен и с огромной радостью выкинут из проекта. И до сих пор никто не мог всемнить, что же там было хорошего.... Столько времени было потрачено на войну с ним, что за это время свой фреймворк можно написать. Я так и не увидел, где оно что-то облегчает и не нашел времени, которое оно может сэкономить... -- Best Regards, Vladimir Kirichenko 1479773829 Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.ru (2:5020/400) = RU.JAVA (2:5022/5.77) ======================================================= From : "Vladimir Kirichenko 2:5020/400 Sat 18-Sep-2004 07:19 To : Alex Besogonov Subj : Re: Веб технологии - основная ставка =============================================================================== From: "Vladimir Kirichenko Alex Besogonov wrote: > У Tapestry есть большой плюс - ее не проектировал комитет :) Ага. Ее проектировал Howard Lewiss Ship. После того как я порылся внутри зародились сомнения в его психическом здоровье. Взять хотя бы api валидации. Все эти record методы. Или rewind моде из-за которого компоненты просто потрясающие - в каждом рендерере if(rewinding) нихрена не рисовать. Или хит сезона если validation delegate содержит ошибки надо сделать аж ретурн а если душа просит редиректа надо бросить редирект exception. Тесты писать сплошлое мучение потому что в половине мест (валидация яркий тому пример) при определенных условиях надо не сделать что-то а наоборот _ничего не делать_. Сама идея дохлая в принципе с его трекингом страниц - половина стандартных компонент игрушечные - его линками ни букмарки нихрена не работает рефреш не нажмешь, 2 окна одинаковых окна не откроешь - отгребешь stale link. Уж не говоря о том что производительность просто потрясающая. ТЕст на щетку Шипа - сделай ActionLink и быстро десяток раз кликни мышей. И чего? Rewinding Exception - не пержил такого тапестри. Исходный код не посмотреть все Javassistится (он маньяк или где?) Ф топку. -- Vladimir Kirichenko razermale.ru Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.Mail.Ru (2:5020/400)