Sería mejor utilizar algo así como un tipo de opción como contenedor para los tipos de devolución que podrían estar ausentes. Estos son frecuentes en la mayoría de los lenguajes funcionales como Scala. Útil para el caso en el que solo te importa si algo tiene éxito o falla, y no te importa por qué. p.ej. Analizando enteros.
int num; // mutable = bugprone
if (!int.TryParse(str, out num)) // branching = complexity
num = someDefault;
Utilizando el tipo de opción, se podría definir un analizador int que se clausura la fealdad mutable y devuelve una opción limpia. esto reduce su complejidad teniendo esto si en UN SOLO LUGAR. evita la duplicación y la mutación.
uso
public Option<int> IntParse(string str) {
int num; // mutable
if (!int.TryParse(str, out num))
return Option.None<int>();
else
return Option.Some<int>(num);
}
en otra parte:
int result = IntParse(someString).GetOrElse(defaultValue);
Como se puede ver esto da lugar a un patrón de uso mensurable menos complejo, ya que la ramificación se ha ocultado.
Alternativamente, si su función tiene que devolver dos cosas, existe la posibilidad de que:
- la función es demasiado complejo y debería dividirse hacia arriba (hacer una cosa bien!), O
- El los valores de devolución están estrechamente relacionados y deben estar unidos en un nuevo tipo
¡Cosas para pensar!
Aquí hay un hilo relacionado: http://stackoverflow.com/questions/134063/why-are-out-parameters-in-net-a-bad-idea – razlebe
Hay una línea delgada entre menos cantidad de código y extensibilidad y elegancia Digamos que si hay más de dos params fuera, sería más prudente tener como tipo de retorno los efectos secundarios – Ramesh