O encadeamento de métodos é a prática de métodos de objetos retornando o próprio objeto para que o resultado seja chamado para outro método. Como isso:
participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
Isso parece ser considerado uma boa prática, pois produz código legível ou uma "interface fluente". No entanto, para mim, ao contrário, parece quebrar a notação de chamada de objeto implícita na própria orientação a objeto - o código resultante não representa a execução de ações ao resultado de um método anterior, que é como geralmente se espera que o código orientado a objetos funcione:
participant.getSchedule('monday').saveTo('monnday.file')
Essa diferença consegue criar dois significados diferentes para a notação de ponto de "chamar o objeto resultante": No contexto do encadeamento, o exemplo acima leria como salvando o objeto participante , mesmo que o exemplo pretenda salvar o agendamento. objeto recebido por getSchedule.
Eu entendo que a diferença aqui é se o método chamado deve retornar algo ou não (nesse caso, ele retornaria o próprio objeto chamado para encadeamento). Mas esses dois casos não são distinguíveis da própria notação, apenas da semântica dos métodos chamados. Quando o encadeamento de métodos não é usado, sempre posso saber que uma chamada de método opera com algo relacionado ao resultado da chamada anterior - com encadeamento, essa suposição é interrompida e eu tenho que processar semanticamente toda a cadeia para entender qual é o objeto real chamado realmente é. Por exemplo:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Lá, as duas últimas chamadas de método se referem ao resultado de getSocialStream, enquanto as anteriores se referem ao participante. Talvez seja uma prática ruim escrever cadeias onde o contexto muda (não é?), Mas mesmo assim você terá que verificar constantemente se cadeias de pontos que parecem semelhantes são de fato mantidas no mesmo contexto ou apenas funcionam no resultado .
Para mim, parece que, embora o encadeamento de métodos produza superficialmente código legível, sobrecarregar o significado da notação de ponto resulta apenas em mais confusão. Como não me considero um guru da programação, presumo que a culpa seja minha. Então: o que estou perdendo? Entendo o encadeamento de métodos de alguma forma errado? Existem alguns casos em que o encadeamento de métodos é especialmente bom ou alguns em que é especialmente ruim?
Sidenote: Entendo que essa pergunta poderia ser lida como uma declaração de opinião mascarada como uma pergunta. Porém, não é - eu realmente quero entender por que o encadeamento é considerado uma boa prática, e onde errei ao pensar que isso quebra a notação inerente à orientação a objetos.
.
interna que ignorasse os valores de retorno do método e sempre invocasse métodos encadeados usando o mesmo objeto.