Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

08.05.2009

Ответы:


1

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

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

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

  1. #renderContentOn: вызывается с экземпляром любого класса рендерера, который вы указали в #rendererClass (вместо того, какой рендерер используется, когда ваш объект запрашивается для рендеринга)
  2. Хук (#updateUrl:), позволяющий обновлять URL-адрес, используемый визуализатором для создания ссылок.
  3. Хуки (#updateRoot:, #style, #script), позволяющие обновлять раздел HEAD HTML-документа
  4. Возможность быть корнем приложения
  5. Хуки (#updateStates:, #states) для упрощения возврата к состоянию
  6. Хук (#initialRequest:) для разрешения инициализации на основе запроса, вызвавшего создание сеанса.
  7. Средство (#children), чтобы убедиться, что все компоненты ниже вас также будут иметь вызовы вышеперечисленных хуков.
  8. Возможность добавления украшений
  9. Возможность показать/ответить/позвонить (использует украшения)
  10. Некоторые удобные методы (#inform:, #isolate: и т. д.)

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

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

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

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

08.05.2009
  • Спасибо за подробный ответ! 08.05.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..