¿Hay alguna razón para preferir un cambio sobre una instrucción if con una sola condición?
-
08-07-2019 - |
Pregunta
Encontré el siguiente código en el proyecto de mi equipo:
Public Shared Function isRemoteDisconnectMessage(ByRef m As Message)
isRemoteDisconnectMessage = False
Select Case (m.Msg)
Case WM_WTSSESSION_CHANGE
Select Case (m.WParam.ToInt32)
Case WTS_REMOTE_DISCONNECT
isRemoteDisconnectMessage = True
End Select
End Select
End Function
No importa que la función no tenga un tipo de retorno (puedo agregar fácilmente 'As Boolean'); Lo que me pregunto es, ¿podría haber alguna razón para preferir lo anterior sobre el siguiente código (para mí, mucho más legible)?
Public Shared Function isRemoteDisconnectMessage(ByRef m As Message) As Boolean
Return m.Msg = WM_WTSSESSION_CHANGE AndAlso _
m.WParam.ToInt32() = WTS_REMOTE_DISCONNECT
End Function
Para poner la pregunta en términos generales: ¿Tiene sentido usar un bloque switch
(o, en este caso, Select Case
) - y / o anidado bloques - para probar una sola condición? ¿Es esto posiblemente más rápido que un if
sencillo?
Solución
Si te preocupa el rendimiento ... perfil. De lo contrario, no puede equivocarse errando en el lado de la legibilidad ...
Otros consejos
No creo que realmente importe en términos de velocidad, el compilador debería poder optimizarlo.
Creo que sería solo una cuestión de preferencia.
Mi regla de oro es usar una declaración de cambio cuando el número de condiciones if / else es mayor que tres. No tengo ningún dato detrás de por qué esto tiene sentido, aparte de la legibilidad / mantenimiento parece disminuir a medida que aumenta el número de condiciones if / else.
Creo que la respuesta en el caso específico que ha dado es no, no tiene sentido, como se sugiere en otras respuestas, uno esperaría que los compiladores optimicen cualquier diferencia práctica.
Apostaría a que esto es un poco de codificación de cortar, pegar y eliminar, tomando un conjunto generalizado de declaraciones de casos anidados y extrayendo ese bit que le da el resultado sí / no que necesita.
Si esto fuera algo similar en línea y / o hubiera una llamada a la función donde se establece el indicador de retorno, entonces uno podría, posiblemente, estar en un punto donde uno podría comenzar a justificarlo, pero no como es.