Dans le Snap Framework, Snaplets sont utilisés pour incorporer la fonctionnalité dans d'autres Snaplets par l'intermédiaire d'une interface à base de composants: La principale application web est un Snaplet qui référence d'autres Snaplets par l'intermédiaire d'un classique « a-a » relation , et les sous-Snaplets peuvent à leur tour faire référence à d'autres Snaplets.procédé préféré pour faire référence à la sous-Snaplets
En examinant diverses implémentations de Snaplet, j'ai vu différents modèles utilisés pour intégrer un Snaplet dans un Snaplet parent. Spécifiquement:
Type de référence. L'implémentation de Snaplet suppose qu'un type spécifique de relation au Snaplet parent est présent. Ceci est appliqué via la méthode de référence utilisée (voir ci-dessous).
Une référence simple:
data MySnaplet = MySnaplet { subSnaplet :: Snaplet SubSnaplet }
Une lentille relative:
data MySnaplet = MySnaplet { _subSnaplet :: Snaplet SubSnaplet } subSnaplet :: Lens MySnaplet SubSnaplet subSnaplet = lens _subSnaplet $ \ a b -> a { _subSnaplet = b }
Méthode de référence. L'implémentation de Snaplet impose, via son interface, qu'un mode spécifique d'accès aux données Snaplet est en place, et différentes implémentations Snaplet utilisent des méthodes différentes. Le Snaplet suppose que:
- Les données sont présentes dans un
MonadState
chaque fois une fonction qui manipule le Snaplet est appelé. Les données sont présentes dans unMonadState
et enveloppées dans un emballageSnaplet
. - Il y a une classe + comme par exemple
instance HasSubSnaplet MySnaplet
qui a une fonction pour obtenir les données Snaplet surMySnaplet
à condition qu'unMySnaplet
est dans unMonadState
au point d'appeler la fonction. - La fonction dans 3. a le type
MySnaplet -> Snaplet SubSnaplet
à la place. - Il existe une instance de classe + comme dans 3. qui fournit un
Lens MySnaplet (Snaplet SubSnaplet)
. - L'instance class + requiert un
Lens (Snaplet MySnaplet) (Snaplet SubSnaplet)
. - La classe + exemple suppose que
MySnaplet
est le « top Snaplet » de l'application, et nécessite une lentille/référence absolue, de sorte queMySnaplet
doit être leb
dans unMonadSnaplet
.
- Les données sont présentes dans un
Comme je le vois, référence type 1. est logique si le Snaplet est en lecture seule, et 2. est logique si le Snaplet doit changer.
De plus, ayant une classe pour la méthode est logique quand MySnaplet
peut avoir qu'un seul SubSnaplet
et plus, et ayant une référence absolue pourrait être logique pour des choses comme les bases de données, qui ne peuvent éventuellement être configurés en tant que composant, étant donné que seulement le top Snaplet a accès aux informations d'identification et quoi d'autre. Cependant, faire de cette hypothèse un auteur de Snaplet peut être fallacieux, et il n'y aurait aucun inconvénient à utiliser une référence relative à la place.
Il y a un proglem, cependant: Les Snaplets existants sur le Hackage ne correspondent pas à ces hypothèses que je fais; toutes les méthodes décrites ci-dessus sont utilisées apparemment au hasard et dans toutes sortes de circonstances. En outre, je ne vois aucun avantage/inconvénient à certains des autres aspects décrits ci-dessus (comme nécessitant un emballage Snaplet
, ou non). Pour moi, le type de référence 2. et l'une des méthodes 1, 2, 5 ou 6 semblent les plus logiques sous toutes circonstances, et je ne vois aucune raison pour laquelle il n'y a pas consensus sur l'utilisation par ex. (2, 1) tout le temps.
Alors:
En tant qu'auteur Snaplet, ce procédé doit être préféré lors de l'écriture d'un nouveau Snaplet (en supposant qu'il a un but général), et
Quelle est la raison pour laquelle tous les Snaplets en existence ne pas déjà utiliser la même méthode de référence (Même dans le paquet de base snap
, une tonne de méthodes différentes sont utilisées)?
Je ne suis pas expérimenté avec Snap, mais 'StateMonad' est censé être [' MonadState'] (http://hackage.haskell.org/packages/archive/mtl/2.0.1.0/doc/html/Control -Monad-State-Class.html)? – ehird
@ehird droite, je suis trop habitué à dire "La monade' 'State'" – dflemstr
Je ne suis pas sûr exactement ce que vous faites référence à quand vous dites "une tonne de différentes méthodes sont utilisées". Nous avons utilisé la méthode la plus appropriée à la situation. – mightybyte