Actualmente estoy tratando de reestructurar mi programa a ser más OO e implementar mejor los patrones conocidos etc.Cómo evitar múltiples FI anidados
tengo bastante muchos anidados sentencias if y quieren deshacerse de ellos. ¿Cómo puedo hacer esto? Mi primer enfoque fue hacerlo con excepciones, por lo que p.
public static Boolean MyMethod(String param) {
if (param == null)
throw new NullReferenceException("param may not be null");
if (param.Equals("none") || param.Equals("0") || param.Equals("zero"))
throw new ArgumentNullException("param may not be zero");
// Do some stuff with param
// This is not executed if param is null, as the program stops a soon
// as one of the above exceptions is thrown
}
El método se utiliza en la clase principal de la aplicación, p.
static void Main() {
try {
Boolean test = MyClass.MyMethod(null); // Will throw an exception
} catch (Exception ex) {
MessageBox.Show(ex.Message, "Error");
}
creo que esto es bastante agradable, ya que evita que las instrucciones anidadas y casi todos los métodos de las acciones están muy bien dispuestos en una sola planta.
Al igual que con las sentencias if, el método se vería así
public Boolean MyMethod(String param) {
if (param != null) {
if (!param.Equals("none") && !param.Equals("0") && !param.Equals("zero")) {
// Do some stuff with param
} else {
MessageBox.Show("param may not be zero", "Error");
} else {
MessageBox.Show("param may not be null", "Error");
}
}
que me parece muy, muy feo y difícil de mantener.
Ahora, la pregunta es; ¿Este enfoque es bueno? Lo sé, eso podría ser subjetivo, pero ¿cómo superar las IF anidadas (1 o 2 niveles no son tan malos, pero empeora después de eso ...)
Esto puede ser solo un código de muestra, pero realmente debería evitar lanzar Exception. Use ArgumentNullException, etc. –
Y quizás lo más importante es que no debe tirar y luego detectar excepciones como esa. –
Es un código de muestra, siempre trato de arrojar mejores excepciones nombradas para el caso. Y la captura, por supuesto, no ocurre en el mismo método, se hace en un nivel mucho más alto de la aplicación, más o menos justo antes de que lleguen al usuario. –