Costumo usar um padrão em que uso o método encadeamento para configurar um objeto, semelhante a um Builder
ou Prototype
padrão, mas não criando novos objetos a cada chamada de método, modificando o objeto original.
Exemplo:
new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");
Basta saber se existe um nome para esse padrão e se ele é considerado um antipadrão, porque, embora possa ler com mais fluência, pode levar a longas cadeias de métodos.
menu.withStyle("")
sem contexto. Você precisa de duas APIs nesse caso.Respostas:
Interface Fluente
Eu sempre ouvi falar que esse método é chamado de ' interface fluente ', cunhado por Eric Evans (da fama do Domain Driven Design ) e Martin Fowler (da fama do Agile Manifesto ).
As principais desvantagens são a legibilidade (que algumas pessoas amam e alguns odeiam), e o fato de que pode ser mais difícil depurar em alguns casos, porque toda a cadeia de ações pode ser considerada uma única declaração ao passar por ela.
Certamente não considero isso um anti-padrão, embora eu só tenha usado a técnica algumas vezes.
fonte
O encadeamento de métodos como esse geralmente é chamado de Interface Fluente quando existe algum tipo de fluxo ou descoberta na cadeia. Como alternativa, você pode pensar em uma API como jQuery, que depende muito do encadeamento de métodos como não 'fluente', porque não há a mesma ênfase na capacidade de descoberta - é mais por conveniência.
Para o seu exemplo (usando withx, withy), você pode considerar isso uma variante do padrão Builder, porque você possui uma classe especializada que, dado algum estado (chamadas de método), sabe como retornar um objeto configurado corretamente.
Este não é um anti-padrão se usado adequadamente.
fonte
definitivamente não é um anti-padrão. O jQuery é provavelmente a implementação mais usada disso.
Sim, pode, mas qual é a alternativa? Você pode acabar com uma frase em inglês simples, com a API guiando o que está disponível e apropriado.
fonte
É chamado de padrão de "destruição de trem".
(É um anti-padrão e é contra o Código Limpo)
O padrão de "destruição de trem" viola a Lei de Demeter .
fonte
a.getB().getC().doSomething()
. Esse exemplo é ruim porque "Seu método pode chamar métodos em seus próprios campos diretamente (mas não nos campos dos campos)". Aqui, existe apenas um objeto, que está sendo criado, e "você pode brincar com brinquedos que você mesmo criou".