Las interfaces son útiles cuando desea simular una interacción entre un objeto y uno de sus colaboradores.Sin embargo, hay menos valor en una interfaz para un objeto que tiene un estado interno.
Por ejemplo, supongo que tengo un servicio que habla con un repositorio para extraer algún objeto de dominio con el fin de manipularlo de alguna manera.
Existe un valor de diseño definido al extraer una interfaz del repositorio. Mi implementación concreta del repositorio bien puede estar fuertemente vinculada a NHibernate o ActiveRecord. Al vincular mi servicio a la interfaz obtengo una separación limpia de este detalle de implementación. Da la casualidad de que también puedo escribir pruebas de unidades independientes súper rápidas para mi servicio ahora que puedo entregarle un IRepository falso.
Considerando el objeto de dominio que regresó del repositorio y sobre el cual actúa mi servicio, hay menos valor. Cuando escribo la prueba para mi servicio, querré usar un objeto de dominio real y verificar su estado. P.ej. después de la llamada al servicio.AddSomething() Quiero verificar que se haya agregado algo al objeto de dominio. Puedo probar esto mediante una simple inspección del estado del objeto de dominio. Cuando pruebo mi objeto de dominio de forma aislada, no necesito interfaces, ya que solo realizaré operaciones en el objeto y lo examinaré en su estado interno. p.ej. ¿Es válido para mis ovejas comer hierba si está durmiendo?
En el primer caso, estamos interesados en interacción basado en la prueba. Las interfaces ayudan porque queremos interceptar las llamadas que pasan entre el objeto bajo prueba y sus colaboradores con los simulacros. En el segundo caso, nos interesan las pruebas basadas en . Las interfaces no ayudan aquí. Intente ser consciente de si está probando el estado o las interacciones y deje que eso influya en su interfaz o no tome ninguna decisión sobre la interfaz.
Recuerde que (siempre que tenga una copia de Resharper instalada) es extremadamente económico extraer una interfaz más adelante. También es barato eliminar la interfaz y volver a una jerarquía de clases más simple si decides que no necesitas esa interfaz después de todo. Mi consejo sería comenzar sin interfaces y extraerlas a pedido cuando descubras que quieres simular la interacción.
Cuando incorpora IoC en la imagen, entonces tendería a extraer más interfaces, pero trate de controlar cuántas clases inserta en el contenedor de IoC. En general, desea mantener estos restringidos a objetos de servicio en gran parte sin estado.
Bien, ahora todos ... ¡cambie de computadora y lea el código de cada uno! –