Snap Frameworkでは、Snapletを使用して、コンポーネントベースのインターフェイスを介して他のSnapletに機能を埋め込みます。メインのWebアプリケーションは、従来の「has-a」関係を介して他のSnapletを参照するSnapletであり、サブSnapletは順番に参照できます。他のスナップレット。
さまざまなSnapletの実装を見ると、Snapletを親Snapletに埋め込むためにさまざまなパターンが使用されているのがわかりました。具体的には:
参照の種類。Snapletの実装は、親Snapletとの特定の種類の関係が存在することを前提としています。これは、使用されるReferenceメソッドを介して実施されます(以下を参照)。
わかりやすいリファレンス:
data MySnaplet = MySnaplet { subSnaplet :: Snaplet SubSnaplet }
相対レンズ:
data MySnaplet = MySnaplet { _subSnaplet :: Snaplet SubSnaplet } subSnaplet :: Lens MySnaplet SubSnaplet subSnaplet = lens _subSnaplet $ \ a b -> a { _subSnaplet = b }
参照方法。Snaplet実装は、そのインターフェースを介して、Snapletデータにアクセスする特定の方法が実施され、さまざまなSnaplet実装がさまざまなメソッドを使用することを強制します。Snapletは、次のことを前提としています。
- データは
MonadState
、Snapletを操作する関数が呼び出されるたびに存在します。 - データはに存在し、ラッパー
MonadState
でラップされます。Snaplet
- 関数を呼び出す時点でaがa
instance HasSubSnaplet MySnaplet
にある場合、Snapletデータを取得する関数を持つそのようなクラス+インスタンスがあります。MySnaplet
MySnaplet
MonadState
- 3.の関数は
MySnaplet -> Snaplet SubSnaplet
代わりにタイプを持っています。 - 3.のようなclass+instanceがあります。これは。を提供します
Lens MySnaplet (Snaplet SubSnaplet)
。 - class+instanceには。が必要
Lens (Snaplet MySnaplet) (Snaplet SubSnaplet)
です。 - class + instanceは、それ
MySnaplet
がアプリケーションの「トップスナップレット」であると想定し、絶対レンズ/参照を必要とします。これは、に含まれているMySnaplet
必要があります。b
MonadSnaplet
- データは
私が見ているように、参照の種類1.スナップレットが読み取り専用の場合は意味があり、2。スナップレットを変更する必要がある場合は意味があります。
さらに、メソッドのクラスを持つMySnaplet
ことは、1つしか持てない場合に意味SubSnaplet
があり、絶対参照を持つことは、データベースなど、コンポーネントとして構成できない可能性があるものに意味がある場合があります。これは、最上位のSnapletのみがアクセスできるためです。クレデンシャルとそうでないもの。ただし、Snapletライターとしてこの仮定を行うことは誤りである可能性があり、代わりに相対参照を使用することに不利な点はありません。
ただし、問題が1つあります。ハッキングに関する既存のスナップレットは、私が行ったこれらの仮定に適合しません。上記のすべての方法は、一見ランダムに、あらゆる種類の状況で使用されます。また、上記の他のいくつかの側面(Snaplet
ラッパーが必要かどうかなど)に長所/短所はありません。
私には、種類2を参照し、方法1、2、5、または6のいずれかがすべての状況で最も理にかなっているように見えます。また、たとえば(2、1)だけを常に使用することにコンセンサスがない理由はわかりません。 。
それで:
Snapletライターとして、新しいSnapletを作成するときにどの方法を使用するか(汎用性があると想定)、および
存在するすべてのSnapletがまだ同じ参照メソッドを使用していない理由は何ですか(コアsnap
パッケージでも、多数の異なるメソッドが使用されています)?