Estoy buscando razones más allá de lo habitual "los parámetros de salida son confusos e indican que el método está haciendo más de una cosa" argumentos de estilo y más sobre lo que es específicamente malo acerca de los parámetros de salida en los servicios de WCF. Donde trabajo ahora, tenemos una regla en contra de ellos en los servicios de WCF, ¡y estoy tratando de descubrir por qué!¿Es una mala práctica tener un parámetro de salida en un método en un servicio WCF?
Respuesta
Personalmente, utilizo los parámetros en lugares específicos (como los métodos denominados TryParse()). Entonces, tengo algunos de los prejuicios de los que hablas cuando solo los uso en lugares específicos y limitados. Además, no puede suponer que una aplicación .Net va a consumir esto en el otro extremo. Debido a que WCF proporciona un consumible de interfaz como un servicio web SOAP o REST (entre otros tipos de comunicación), no puedo garantizar que WCF incluso admita parámetros para la compatibilidad con consumidores que no sean .Net.
Más allá de eso, un servicio WCF proporciona una API a un consumidor, y las API deben proporcionar una interfaz que debe consumirse con un conocimiento limitado de cómo se codificaron los métodos del servidor. (No suponga que el tipo que escribe el servidor WCF es el mismo tipo que escribe el cliente en el otro extremo). Intentar utilizar un parámetro out en una API parece un olor a código. Presumiblemente, uno usaría un param para devolver otro (s) valor (es) al consumidor. Considere en cambio usar un objeto de mensaje. Un objeto de mensaje se compone específicamente de todos los datos que deben enviarse desde el servidor WCF a su consumidor. Por ejemplo, digamos que usted tiene un método expuesto en un servidor de llamada WCF TryCreateUser:
bool TryCreateUser(string name, string email, out User user){}
donde va a devolver un bool que indica que se produjo con éxito la creación de usuarios y un objeto de usuario que contiene el usuario si tenía éxito. Me gustaría crear una nueva clase, UserCreationMessage:
class UserCreationMessage {
bool IsSuccessful;
User user;
}
Retorno este objeto de mensaje de vuelta al consumidor, y todavía se puede conseguir a los múltiples valores devueltos. Sin embargo, ahora tiene devuelto un objeto coherente que es más explicativo para el usuario final de la API.
Al final, razonaría que es una mala práctica tener un parámetro de salida en una API, como un servidor WCF porque los programadores que crean el consumidor para este servicio tienen que poder ver fácilmente la API y consumir sin saltar por los aros que un param presente. Dado que existe un mejor diseño para esto, úselo. Las API requieren estándares de codificación más altos, especialmente en la interfaz expuesta al consumidor final.
Una de las razones es que los parámetros out
son manejados por la clase de proxy generada cuando se agrega la referencia de servicio, eso es una sobrecarga adicional.
Otra razón: de acuerdo con this post, incluso si el parámetro original out
es el último cuando lo consume, se convierte en primer lugar - confuso y puede conducir a errores complicados que pueden tomar tiempo para resolver hasta que alguien se dé cuenta.
Opinión personal: la operación WCF (método) debería hacer algo y devolver algo. Puede hacer muchas cosas, pero solo devuelve una cosa, que es el resultado: si necesita material adicional, simplemente devuelva el tipo complejo con todo lo que necesita como campos de datos de ese tipo.
- 1. ¿Es una mala práctica tener un método de inicialización largo?
- 2. ¿Es esto una mala práctica sobrecargar un método?
- 3. ¿Es una mala práctica para un objeto secundario tener un puntero a su elemento primario?
- 4. ¿En general es una mala práctica tener muchos parámetros "initWith"?
- 5. ¿Es una mala práctica tener estado en una clase estática?
- 6. ¿Es un servicio WCF un servicio web?
- 7. Está usando una mala práctica "fuera de servicio"
- 8. ¿Es una mala práctica tener una definición de macro para devolver un valor para una función?
- 9. ¿Puede un contrato de servicio WCF tener un parámetro de entrada nullable?
- 10. ¿Puedo llamar localmente un método en un servicio WCF autohospedado?
- 11. ¿La seguridad del transporte es una mala práctica para el servicio WCF a través de Internet?
- 12. ¿Es una mala idea declarar un método estático final?
- 13. Java asignar un nuevo valor a un parámetro, ¿se considera una mala práctica?
- 14. ¿Es una mala práctica escribir un método que no haga nada excepto lanzar una excepción?
- 15. es @unlink una mala práctica?
- 16. ¿Es una mala práctica usar el retorno dentro de un método de vacío?
- 17. ¿Es una mala práctica dividir una matriz en C simplemente usando un puntero en el medio?
- 18. ¿Es una mala práctica poner un punto en una ruta de URI?
- 19. Especifique un servicio Singleton en un servicio alojado de WCF
- 20. ¿Es una mala práctica usar uno mismo en decoradores?
- 21. Mala práctica: ¿exponer un evento en una interfaz?
- 22. En C++, ¿es un método const devolver un puntero a un objeto no const considerado mala práctica?
- 23. Identificación de clientes en un servicio WCF
- 24. ¿Es una mala práctica tener más de una afirmación en una prueba unitaria?
- 25. ¿Qué es una mala práctica al usar los parámetros?
- 26. ¿Es una mala práctica escribir a $ _POST?
- 27. ¿Salida de HTML con eco considerado mala práctica en PHP?
- 28. ¿Es una mala práctica usar un nombre de función incorporado como un atributo o identificador de método?
- 29. ¿Es aceptable tener un parámetro en el constructor de clase?
- 30. Devolver una interfaz desde un servicio WCF
+1 por mencionar el objeto de mensaje. – slugster