Подтвердить что ты не робот

Когда использовать компоненты Seaside и когда использовать простые объекты рендеринга?

Недавно я разрабатывал веб-приложение в Seaside + Squeak и нашел, что это замечательный опыт. Море на самом деле является главой и плечами над всеми остальными структурами, и я чувствую, что работаю на более высоком уровне абстракции (выше цикла HTTP-запроса/ответа и HTML-шаблонов, с которыми вы сталкиваетесь в других средах).

Тем не менее, я немного запутался в компонентах Seaside. Недавно мне пришлось отображать список объектов на компоненте (аналогично первой странице stackoverflow). Сначала я сделал каждый объект компонентом (подкласс WAComponent), но это оказалось действительно расточительным, и мне пришлось динамически устанавливать #children в родительский компонент, чтобы он вообще работал. Затем я попытался сделать их визуализацией объектов (объектов, которые не являются подклассами WAComponent, и рендеринга с помощью renderOn: вместо renderContentOn:, как и у компонентов). Это сработало, но теперь они больше не могли получить доступ к глобальному состоянию в объекте сеанса, поскольку компоненты могут (используя #session). Затем я обнаружил значение "WACurrentSession", которое дает любому объекту доступ к текущему объекту сессии Seaside. Теперь я смог заставить их визуализировать объекты. Кроме того, я обнаружил, что я мог бы переписать много других, более мелких компонентов в качестве объектов визуализации.

Кроме того, что нужно использовать состояние call/answer или backtracking, существуют ли другие причины для использования компонентов над объектами рендеринга?

4b9b3361

Ответ 1

Это частая путаница для новых пользователей Seaside. Мы постарались сделать это более ясным в Seaside 2.9, который в настоящее время находится в Alpha, но я постараюсь сосредоточиться на 2.8 здесь, поскольку похоже, что это то, что вы используете.

Прежде всего, вы правы, что вам не нужно использовать компонент для доступа к сеансу. Seaside 2.9 перемещает #session до нового класса WAObject, что делает его доступным почти для всех объектов Seaside (включая Компоненты), но вы можете определенно ссылаться на WACurrentSession самостоятельно на данный момент в 2.8.

Компоненты обеспечивают примерно следующую функциональность в 2.8:

  • #renderContentOn: вызывается с экземпляром любого класса визуализатора, который вы указываете в #rendererClass (вместо того, что используется рендерер, когда ваш объект просят сделать сам)
  • Крючок (#updateUrl:), позволяющий обновлять URL-адрес, используемый средством визуализации для создания ссылок
  • Крючки (#updateRoot:, #style, #script), чтобы обновить раздел HEAD документа HTML
  • Возможность быть корнем приложения
  • Крючки (#updateStates:, #states), чтобы облегчить отслеживание состояния.
  • Крючок (#initialRequest:), чтобы разрешить инициализацию на основе запроса, вызвавшего создание сеанса.
  • Объект (#children), чтобы убедиться, что все компоненты ниже вас также будут иметь указанные выше крючки, вызываемые на них
  • Возможность добавления украшений
  • Возможность показывать/отвечать/звонить (использует декорации)
  • Некоторые удобные методы (#inform:, #isolate: и т.д.)

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

Простейшая метрика, вероятно: если вы намерены поддерживать объект вокруг HTTP-запросов, он должен быть компонентом; если вы намерены выбросить объект и создать его на каждом проходе рендеринга, это, вероятно, не обязательно. Если вы представляете приложение, отображающее страницы блога, у вас наверняка есть Компоненты для меню, броска блога, тела блога, каждого комментария и т.д. Возможно, вам захочется отмерить чтение разметки блога и генерировать его HTML, чтобы вы могли поддерживать разные разметки или разные средства рендеринга и чтобы комментарии Компоненты могли поддерживать одну и ту же разметку. Это можно сделать с помощью некомпонентного класса, который реализует #renderOn: и может быть создан и использован другими компонентами по мере необходимости.

Seaside 2.9 в настоящее время разделяет вышеуказанную функциональность, создавая бетон WAPresenter и вводя WAPainter в качестве своего суперкласса. 1-3 выше реализованы на WAPainter и 4-7 на WAPresenter, поэтому у вас есть выбор того, что нужно для подкласса в зависимости от ваших потребностей. Он также удаляет множество методов из WAPresenter и WAComponent, чтобы облегчить их понимание конечными пользователями.

Надеюсь, что это поможет.