2009-03-27 12 views
11

En .NET, a diferencia de Java, los métodos no son virtuales por defecto. Para usar la mayoría de los frameworks de objetos simulados, debes marcar los métodos que quieras usar en tu simulacro como virtuales en el objeto `real ', o tienes que tener una interfaz que te permita simular que la clase bajo prueba aceptar en lugar de la implementación.Objetos de burla: ¿declara todos los métodos como virtuales o usa la interfaz?

Parece una mala forma ir y marcar todos los métodos como virtuales, pero también parece una mala forma definir una interfaz para cada clase.

¿Qué es lo mejor que puedes hacer?

Respuesta

8

Mi regla de oro es definir la interfaz si espero tener múltiples implementaciones, ya sean clases reales de aplicaciones concretas o una implementación de aplicación única y una implementación falsa para pruebas unitarias. Si solo espero una implementación única y la clase no necesita falsificación (la mayoría no), iré por la ruta del método virtual y la refactorizaré a una interfaz según sea necesario.

+0

Me gusta la idea de tratar los dobles de prueba como implementaciones planificadas de la interfaz. No estoy seguro si me gusta hacer que los otros sean virtuales a menos que sea parte del diseño de la clase, pero de nuevo, si resulta que necesitas burlarte de algo más tarde, cambiar el código solo por eso huele mal. – dnewcome

0

¿Quién dice que se debe burlar el objeto de la misma jerarquía de clases?

Es mucho más fácil crear una clase independiente simple que tenga la interfaz necesaria y crear instancias de ese objeto.

Incluso puede crear una jerarquía de clases simuladas y usarla para fines de pruebas unitarias.

+0

Gracias por la respuesta. Veo a qué te refieres, pero para que la clase en prueba funcione con el simulacro, tiene que derivarse de la misma interfaz que implementa el objeto real o directamente de la clase real. Creo que el simulacro debe satisfacer la relación 'Es A '. – dnewcome

+0

@dnewcome: Parece que tienes razón. Lo que escribí sería mucho mejor para los idiomas que usan pato-tipado. –

11

Si tengo que elegir entre los dos, me gustaría ir con la interfaz. Una interfaz está destinada a definir un contrato, que es básicamente lo que un objeto simulado va a cumplir. Marcar un método como virtual podría tener efectos secundarios imprevistos. Afecta el diseño de la clase real que se burla. Una interfaz simplemente define los nombres de los métodos y no tendrá ningún efecto en la clase real.

+2

Esto tiene sentido para mí desde el punto de vista de la corrección. En .net, para mí la definición de un método virtual indica que el diseñador de la clase pretende que esto se anule en alguna parte. Tampoco puede ser inline, etc, en cuanto a los efectos secundarios. Estás en lo cierto sobre el simulacro de adhesión al contrato, creo. – dnewcome

-1

Lo mejor es utilizar la cabeza. Piensa en tu escenario, si tiene más sentido usarlo virtual, hazlo. Sin embargo, si una interfaz es más adecuada para su tarea, entonces hágalo.

Así que en realidad lo veo como esta en la adición de nuevas funcionalidades

  • inheritence: Usar métodos virtuales.
  • Composición: Use interfaces.

Estoy seguro de que hay un montón de advertencias sobre esto. Entonces use su cabeza y haga lo que sea más fácil en su escenario.

+1

Lo que dices es definitivamente la mejor práctica para diseñar clases. El problema que tengo es que realmente no tengo la llamada para ninguno. Las clases de las que me estoy burlando son generalmente independientes en cuanto a comportamiento, y no necesito métodos virtuales que no sean para permitir simulaciones. – dnewcome

+0

Si solo intentas burlarte de algo que no se puede burlar, existen algunas opciones. Primero vea si TypeMock puede ayudarlo.Si no, pondría una Fachada a su alrededor y haré que implemente una interfaz. Desde allí, simplemente puede burlarse de la interfaz y seguir con la vida. Keep es simple! –

Cuestiones relacionadas