Hay dos formas de obtener la instancia de cliente, pero no sé cuál es mejor y por qué. ingrese la descripción de la imagen aquí

enter image description here

1
Eric.guo 14 ene. 2017 a las 06:10
No sé cuál es su caso de uso o métrica para "mejor". Pero estático significa un solo cliente. Se puede combinar un frijol de primavera. No desea una única conexión a la base de datos a menos que siempre haya un solo usuario.
 – 
duffymo
14 ene. 2017 a las 06:41
1
StackOverflow le permite publicar código en la pregunta. No publique capturas de pantalla de código. Especialmente no con un fondo negro: no puedo leerlo a menos que incline la pantalla de mi computadora portátil de cierta manera y mueva la cabeza para que me duela el cuello. Además, la captura de pantalla corta una de sus líneas de código a la derecha.
 – 
ajb
14 ene. 2017 a las 08:38
Gracias por tu sugerencia, soy demasiado vago para copiar el código y formatearlo ...
 – 
Eric.guo
14 ene. 2017 a las 08:47
1
Dada la opción, casi siempre optaría por la inyección de dependencia. Una razón es que facilita las pruebas, ya que puede burlarse de su dependencia, burlarse de los singleton estáticos es mucho más difícil de hacer.
 – 
wybourn
14 ene. 2017 a las 15:41
Pegue lo relevante en su pregunta en lugar de usar capturas de pantalla. Más información: Meta.stackoverflow.com/questions/285551/…
 – 
g00glen00b
17 ene. 2017 a las 12:51

1 respuesta

La mejor respuesta

El segundo ejemplo es mucho peor. Hacer de algo un singleton es muy inflexible, todo lo que lo usa está ligado a esta implementación y no puede ejercerse independientemente de ella.

Un singleton es un estado global cableado al que cualquier cosa en su aplicación puede llamar, por lo que los objetos no declaran sus dependencias y es difícil saber de qué depende. Consulte este artículo http://misko.hevery.com/ 2008/08/17 / singletons-are-patological-liars / para más explicación.

Los marcos de inyección de dependencia se inventaron para brindar a los desarrolladores una mejor manera de conectar objetos que a través de referencias estáticas o localizadores de servicios. El hecho de que la unicidad sea impuesta por el marco en lugar del código permite una sustitución más fácil de los simulacros.

En el primer ejemplo, la llamada al constructor y las llamadas a métodos estáticos que intentan resolver nombres de host dificultan las pruebas. Pero getClient es un método de instancia que se puede anular en una prueba. El segundo ejemplo es peor porque el problema es más amplio, todo lo que usa el singleton es difícil de probar.

2
Nathan Hughes 14 ene. 2017 a las 08:41
Gracias por tu respuesta. También me gusta usar DI en el código, pero a menudo veo la segunda forma en el código de los demás, así que tengo la pregunta.
 – 
Eric.guo
16 ene. 2017 a las 11:52