Escrevendo uma interface fluente (eu tenho misturado com ele) exige mais esforço, mas tem um retorno porque se você fizer certo, a intenção do código de usuário resultante é mais óbvio. É essencialmente uma forma de linguagem específica de domínio.
Em outras palavras, se seu código é lido muito mais do que está escrito (e qual código não é?), então você deve considerar criar uma interface fluente.
Interfaces fluentes são mais sobre contexto e são muito mais do que apenas maneiras de configurar objetos. Como você pode ver no link acima, usei uma API fluente para obter:
- Contexto (assim, quando você costuma executar muitas ações em uma sequência com a mesma coisa, pode encadear as ações sem precisar declarar seu contexto repetidamente).
- Detectabilidade (quando você vai para
objectA.
, então o intellisense lhe dá muitas dicas. No meu caso acima,plm.Led.
te dá todas as opções para controlar o LED embutido, eplm.Network.
te dá as coisas que você pode fazer com a interface de rede.plm.Network.X10.
fornece o subconjunto de ações de rede para dispositivos X 10. Você não obterá isso com inicializadores de construtor (a menos que você queira construir um objeto para cada tipo diferente de ação, o que não é idiomática). - Reflexão (não usada no exemplo acima) - a capacidade de usar a expressão LINQ e manipulá-la é uma ferramenta muito poderosa, particularmente em algumas APIs auxiliares criadas para testes de unidade. Eu posso passar uma expressão getter de propriedade, construir um monte de expressões úteis, compilar e executá-las, ou até mesmo usar o getter de propriedade para configurar meu contexto.
Uma coisa que normalmente faço é:
test.Property(t => t.SomeProperty)
.InitializedTo(string.Empty)
.CantBeNull() // tries to set to null and Asserts ArgumentNullException
.YaddaYadda();
Eu não vejo como você pode fazer algo assim sem uma interface fluente.
Editar 2 : Você também pode fazer melhorias de legibilidade realmente interessantes, como:
test.ListProperty(t => t.MyList)
.ShouldHave(18).Items()
.AndThenAfter(t => testAddingItemToList(t))
.ShouldHave(19).Items();