Qual é o nome do idioma usando o encadeamento de métodos para criar um objeto?


21

Costumo usar um padrão em que uso o método encadeamento para configurar um objeto, semelhante a um Builderou Prototypepadrã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.


3
Uma interface fluente é uma questão de estilo. Se você estiver escrevendo uma API, forneça formas alternativas a ela.
Oded

1
Para obter mais discussões, dê uma olhada nesta pergunta: programmers.stackexchange.com/questions/69519/…
Eric King

@Oded É possível usar essa API sem encadeamento, apenas tornando cada chamada uma instrução separada ou você teve outra ideia para uma alternativa?
Garrett Hall

@GarrettHall - Claro que é possível, mas você acaba chamando coisas como menu.withStyle("")sem contexto. Você precisa de duas APIs nesse caso.
Oded

2
@GarrettHall O objetivo da 'interface fluente' é a cadeia de métodos, que deve ser lida como uma frase. Nesse sentido, a longa cadeia de métodos não é considerada ruim. Mas, e aqui eu concordo com Oded, seria melhor também fornecer a mesma funcionalidade em uma sintaxe mais convencional. Dessa forma, o desenvolvedor pode escolher qual método usar.
Eric Rei

Respostas:


37

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.


4
Observe que os proponentes são bastante insistentes em que uma interface fluente envolve muito mais do que apenas encadeamento de métodos, embora muitas vezes não esteja claro o que mais significa esse termo.
precisa

É comum que toda a cadeia seja considerada uma única declaração? Parece um problema de depurador mal projetado para mim.
blueberryfields

Não encontrei um depurador que trate cadeias como uma única declaração, mas ainda pode ser doloroso se você estiver interessado apenas em um dos métodos no final da cadeia, em uma cadeia específica.
vaughandroid

1
Eu trabalho em c #, e o depurador do .NET me permite entrar nos métodos individuais muito bem. Outras línguas, não tenho tanta certeza.
Eric Rei

1
@KilianFoth Como observado nos comentários da pergunta, os métodos encadeados em uma interface fluente devem ser legíveis quase como uma frase. Às vezes isso significa que os métodos individuais devem ter nomes diferentes do que é de outro modo consideradas boas práticas
Izkata

5

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.


O que é descoberta? A capacidade de encontrar os métodos necessários através do preenchimento automático da API?
Josiah Yoder 02/02

Eu não estou familiarizado com jQuery. Como suas cadeias de métodos são apenas por conveniência, não por descoberta? Como existem tantas maneiras de encadear, é impressionante mesmo com o preenchimento automático?
Josiah Yoder

3

se é considerado um antipadrão,

definitivamente não é um anti-padrão. O jQuery é provavelmente a implementação mais usada disso.

porque, embora possa ler com mais fluência, pode levar a longas cadeias de métodos

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.


..e você obtém o que deseja em 1 linha, em vez de 8 a 10. O que é bom se você estiver escrevendo apenas uma linha em um terminal. É mais fácil recuperar 1 comando que 10. Como é fluente e os métodos têm nomes descritivos, também é mais fácil ler. Infelizmente, muito disso no Python2 não pode mais ser feito no Python3 / Python4.
Mckenzm

-3

É 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 .


3
Não é o mesmo que o método encadeado no artigo ao qual você vincula, onde está o exemplo 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".
Nic
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.