17

私は最近、Seaside+Squeak で Web アプリケーションを開発していますが、素晴らしい経験であることがわかりました。Seaside は実際に他のどのフレームワークよりも優れており、より高いレベルの抽象化 (他のフレームワークが処理する HTTP 要求/応答サイクルと HTML テンプレートの上) で作業しているように感じます。

そうは言っても、私は Seaside コンポーネントについて少し混乱しています。最近、コンポーネントにオブジェクトのリストを表示する必要がありました (stackoverflow のフロント ページに似ています)。最初は各オブジェクトをコンポーネント (WAComponent のサブクラス) にしましたが、これは非常に無駄であることが判明し、#children を親コンポーネントで動的に設定して機能させる必要がありました。次に、レンダリング オブジェクト (WAComponent のサブクラスではなく、コンポーネントのように renderContentOn: の代わりに renderOn: を使用してレンダリングするオブジェクト) を作成しようとしました。これは機能しましたが、コンポーネントが (#session を使用して) できるように、セッション オブジェクトのグローバル状態にアクセスできなくなりました。次に、現在の Seaside セッション オブジェクトへのアクセスを任意のオブジェクトに与える「WACurrentSession 値」を発見しました。これでレンダリング オブジェクトを作成できるようになりました。加えて、

call/answer または backtracking 状態が必要である以外に、レンダー オブジェクトよりもコンポーネントを使用する理由が他にあるでしょうか?

4

1 に答える 1

16

これは、新しい Seaside ユーザーにとってよくある混乱のポイントです。現在アルファ版の Seaside 2.9 でこれをより明確にするために懸命に努力しましたが、ここでは 2.8 に焦点を当ててみます。

まず第一に、セッションにアクセスするためにコンポーネントを使用する必要がないことは正しいです。Seaside 2.9 は、ほとんどすべての Seaside オブジェクト (コンポーネントを含む) にアクセスできるように#sessionする新しいクラスに移行しますが、2.8 で今のところ自分自身を参照することは間違いありません。WAObjectWACurrentSession

コンポーネントは、2.8 で大まかに次の機能を提供します。

  1. #renderContentOn:指定したレンダラー クラスのインスタンスで呼び出されます#rendererClass(オブジェクトがそれ自体をレンダリングするように求められたときに使用されているレンダラーではなく)
  2. #updateUrl:レンダラーがリンクを生成するために使用する URL を更新できるようにするためのフック ( )
  3. HTML ドキュメントの HEAD セクションを更新できるようにするためのフック ( #updateRoot:#style、 )#script
  4. アプリケーションのルートになる機能
  5. 状態のバックトラッキングを容易にするフック ( #updateStates:、 )#states
  6. #initialRequest:セッションを作成する原因となったリクエストに基づいて初期化を許可するためのフック ( )
  7. #children以下のすべてのコンポーネントにも上記のフックが呼び出されるようにする機能 ( )
  8. 装飾を追加する機能
  9. 表示/応答/呼び出し機能 (装飾を使用)
  10. いくつかの便利なメソッド ( #inform:#isolate:など)

上記のいずれも必要ない場合は、Component は必要ありません。上記のいずれかが必要な場合は、独自のクラスに同等の機能を実装したい場合を除き、ほとんどコンポーネントが必要です。

最も単純なメトリックはおそらく次のとおりです。HTTP リクエスト間でオブジェクトを保持する場合は、コンポーネントにする必要があります。オブジェクトを破棄して各レンダリング パスで作成する場合は、おそらくその必要はありません。ブログのページを表示するアプリケーションを想像すると、メニュー、ブログのロール、ブログの本文、各コメントなどのコンポーネントがあるはずです。ブログのマークアップの読み取りとその HTML の生成を除外して、さまざまなマークアップまたはさまざまなレンダラーをサポートし、コメント コンポーネントが同じマークアップをサポートできるようにすることができます。#renderOn:これは、必要に応じて他のコンポーネントで実装し、作成して使用できる非コンポーネント クラスで実行できます。

WAPresenterSeaside 2.9 は現在、具体化しWAPainterてそのスーパークラスとして導入することにより、上記の機能を分割しています。上記の 1 ~ 3 は on に実装されWAPainter、4 ~ 7 は on に実装されWAPresenterているため、ニーズに応じてサブクラス化するものを選択できます。また、エンド ユーザーが理解しやすくするために、WAPresenter と WAComponent から多くのメソッドを削除しています。

それが役立つことを願っています。

于 2009-05-08T08:05:52.553 に答える