Al escribir una API u objeto reutilizable, ¿hay alguna razón técnica por la cual todas las llamadas a métodos que devuelven 'nulo' no deberían simplemente devolver 'esto' (* esto en C++)?¿Por qué debería una API devolver 'nulo'?
Por ejemplo, el uso de la clase string, podemos hacer este tipo de cosas:
string input= ...;
string.Join(input.TrimStart().TrimEnd().Split("|"), "-");
pero no podemos hacer esto:
string.Join(input.TrimStart().TrimEnd().Split("|").Reverse(), "-");
..because Array.reverse() devuelve vacío
Hay muchos otros ejemplos en los que una API tiene una gran cantidad de operaciones de retorno de vacío, por lo que el código termina pareciéndose a:
api.Method1();
api.Method2();
api.Method3();
..pero sería perfectamente posible escribir:
api.Method1().Method2().Method3()
..si el diseñador de API lo permitió.
¿Hay alguna razón técnica para seguir esta ruta? ¿O es solo una cuestión de estilo indicar mutabilidad/nuevo objeto?
(x-ref Stylistic question concerning returning void)
Epílogo
He aceptado la respuesta de Luvieere ya que creo que mejor representa la intención/diseño, pero parece que hay ejemplos de API populares hacia fuera allí que se desvía de esto:
En C++ cout << setprecision(..) << number << setwidth(..) << othernumber;
parece alterar el objeto cout para modificar el siguiente datum insertado.
En .NET, Stack.Pop()
y Queue.Dequeue()
ambos devuelven un elemento pero también cambian la colección.
Apoyos a ChrisW y otros para obtener información detallada sobre los costos reales de rendimiento.
El patrón que está describiendo también se conoce como * method chaining * (http://martinfowler.com/dslwip/MethodChaining.html). –
Método de encadenamiento, o interfaces fluidas (¡aunque los puristas afirman que se requiere algo más para este último, creo!). –
Ahhh - ¡tiene un nombre! Parece bastante legible y popular en cosas como JQuery – JBRWilkinson