FluentInterface
Čo to FluentInterface je?
Fluent v preklade znamená plynulý nuž a FluentInterface je spôsob ako zapísať na prvý pohľad neprehľadnú inicializáciu triedy, prípadne nejake tie operacie do trošku ľudsky čitateľnejšej formy.
Ako to vyzera v súčastnosti?
Veci je najlepšie vidieť na príklade (použitý príklad je z blogu ).
Ulohou je poslať mail pre aktuálne prihlaseného užívateľa z adresy systému s určitými nastaveniami a s hlavičkou a telom správy.
SendMail(
new Lookup(EntityName.systemuser, GetAccountOwner().Value),
new Lookup(EntityName.queue, Settings.Default.ControlQueueID),
title,
body,
GetAccountOwner(),
PostState.new_parentpolicy.Value,
PickLists.EmailPriority.Type.High);
Takýto kód ale veľa nikomu nepovie, preto môžme v rámci čitateľnosti napísať niečo taketo:
Owner owner = GetAccountOwner();
Lookup to = new Lookup(EntityName.queue, Settings.Default.ControlQueueID);
Lookup from = new Lookup(EntityName.systemuser, owner.Value);
Guid regarding = PostState.new_parentpolicy.Value;
Picklist priority = PickLists.EmailPriority.Type.High;
SendMail(from, to, title, body, owner, regarding, priority);
Tento spôsob už je prehľadnejší, ale dá sa to vyriešiť aj lepšie?
Použitie FluentInterface
Najskôr začneme najprehľadnejšie ako sa dá a to kódom:
Owner owner = GetAccountOwner();
Email
.Owner(GetAccountOwner())
.From(EntityName.systemuser, owner.Value)
.To(EntityName.queue, Settings.Default.ControlQueueID)
.Regarding(PostState.new_parentpolicy.Value)
.Priority(PickLists.EmailPriority.Type.High)
.Title(title)
.Body(body)
.Send();
Takýto kód je prehľadný, je jednoducho možné vynechať určitý parameter, pripadne postupnosť zmeniť (samozrejme okrem posledného Send:).
Implementácia FluentInterface
Fluent interface je možné implementovať buď pomocnou triedou, alebo wrapperom nad existujúcou triedou.
Doležité je, aby dana trieda vrátila z každej fluent funkcie sama seba, teda this.
Koho téma zaujala, môže viac informácii získať na nasledujúcich stránkach:
Tak to je všetko, občas mam vždy chuť nakoniec napísať, že rád sa s čitateľom stretnem pri ďalšom článku (tentoraz o vzore Inversion of Control), ale vždy keď sľúbim druhu časť nejakého článku, môžem so stopercentnou istotou povedať, že to zostane vo sfére snov:). Čo by bolo možno škoda, pretože by som rád vytvoril zopár článkov o projektu Castle, kde práve IoC použitý vo kompnente MicroKernel/Windsor by bol určite úvodnou témou takejto série.