Pregunta

es it / buena práctica aceptable para utilizar el método de patrón en los objetos de valor de encadenamiento (como, devolviendo un nuevo objeto en lugar de esto)? ¿existen casos por ahí donde se implementa esta solución?

No puedo pensar en ningún inconvenientes, pero me gustaría escuchar su punto.

¿Fue útil?

Solución

Conclusión:. Esta práctica es completamente aceptable

Creo que esto es lo que ocurre generalmente cuando se tiene un objeto inmutable. En lugar de la mutación del objeto original, uno nuevo se crea con el valor dado y devuelto. Los argumentos a favor y en contra de hacer esto con el encadenamiento método son más o menos lo mismo que usar objetos inmutables frente a mutable.

La única preocupación que tengo es que esto se pone de manifiesto a las personas que llaman de la clase - que no puede depender de la igualdad de identidad con el objeto encadenado y debe quedar claro que la llamada no está cambiando el objeto original. Aunque si en realidad estaban encadenando las llamadas, no estarían asignando los objetos intermediarios, por lo que no habría mucho de un riesgo de esto. Lo que es importante es que solamente utilizan el último objeto de la cadena de método.

Para usar java.lang.String como ejemplo, un cliente de la cadena de hacer esto:

myString.trim().replace("a", "b").substring(3, 9);

... no significa nada, y por lo general indica malentendido programador. Lo que debe estar haciendo es la siguiente:

String myNewString = myString.trim().replace("a", "b").substring(3, 9);

... y luego usando myNewString en las operaciones subsiguientes. Curiosamente, la herramienta de análisis estático para Java, Findbugs, puede detectar los casos de este malentendido, e informar de ello como un error probable.

comprensión del cliente es el caso principal. Otros inconvenientes incluyen si el objeto de valor es muy costoso crear, hacer una nueva en cada cadena será un impacto en el rendimiento. Usted debe ser capaz de decir de su propio escenario, si es probable que esto sea un problema. En este caso, en lugar de crear un nuevo objeto en cada cadena método, es posible que desee implementar el Builder.

Además de ellos, no puedo pensar en otras cuestiones.

Otros consejos

Sí, este es un perfectamente buena cosa que hacer. Ejemplos:

  • cadena en Java y .NET
  • DateTime y TimeSpan en .NET
  • Joda Time y Noda tiempo
  • Listas en los lenguajes funcionales tales como F #

Para los tipos de referencia que se implementan como objetos de valor inmutable, el inconveniente de que a veces puede ser que terminan generando un montón de basura. En cualquier caso, puede terminar con un montón de copiar pasando -. Que depende de la situación exacta, aunque

Un montón de clases de Java proporciona objetos de valor inmutable. java.lang.String, java.math.BigInteger y java.math.BigDecimal son objetos de valor inmutable, sus métodos devuelven un objeto nuevo. El mayor inconveniente es que con la nueva gente a que no entienden que es inmutable y piensan que están cambiando el original.

Algunos lenguajes hacen hincapié en la inmutabilidad más que otros. En Rubí cadenas son mutables, y las colecciones a menudo proporcionan una versión que devuelve una copia y otra que muta la copia existente (por ejemplo, el arreglo # clasificar y matriz de tipo #!). En Clojure inmutabilidad es la norma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top