¿Debo implementar las clases usando una clase de interfaz pura como base para simplificar la creación de objetos de prueba falsos?
- Eso me obligaría a hacer una gran cantidad de métodos virtuales. ¿Eso afectará el rendimiento?
Una solución que utilizo a menudo es crear plantillas de la clase en lugar de ocultarlo detrás de una interfaz. Luego, puedo pasar los objetos de prueba/simulación como parámetros de plantilla cuando los pruebo, y los objetos reales de lo contrario. De esta forma, se evita el golpe de rendimiento de las funciones virtuales.
Editar
Ok, un ejemplo sencillo:
Con programación orientada a objetos e interfaces, puede escribir una función como esta:
void Foo(IBar& someBar) { ... }
Esta función toma un parámetro que implementa la interfaz IBar
y hace algo con eso Si desea pasar una implementación falsa simulada, simplemente escriba un objeto simulado que hereda de IBar
y páselo a Foo
. Simple y directo.
Pero se puede lograr lo mismo con las plantillas:
template <typename BarType>
void Foo(BarType& someBar) { ... }
... y eso es todo. El cuerpo de Foo
puede ser casi sin cambios. Siempre que el tipo pasado a la función exponga todos los miembros que necesitamos, funcionará, sin tener que heredar formalmente de una clase de interfaz, y sin la sobrecarga de las funciones virtuales y el polimorfismo de tiempo de ejecución.
El diseño para la capacidad de prueba realmente es imprescindible. Sin embargo, también debe tener en cuenta que solo el 'límite' debe poder probarse de manera independiente, es perfectamente razonable que los componentes internos dependan unos de otros y no se prueben de forma aislada. –
Puede que le interese [Propuesta de intercambio de pila] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "revisión de código"). Está casi listo para comenzar la versión beta, solo necesita algunos más. – greatwolf