Algoritmia
Bases de algoritmia
Hasta ahora, nos hemos contentado con desarrollar aplicaciones que no incluyen ninguna «lógica»: se limitaban a mostrar datos. No había ningún concepto de condición, repetición o lógica de código. En efecto, es frecuente que el código de una aplicación sea complejo y hay múltiples ramificaciones en función de diversas condiciones. En este capítulo, vamos a descubrir la lógica algorítmica, que nos permitirá crear código más parecido a lo que se puede encontrar en las aplicaciones que responden a problemáticas más complejas.
1. Lógica condicional
Es innegable que aquí se trata de un componente que va a usar de manera sistemática. Una condición implica la ejecución o no de una parte del código en función de la evaluación de una prueba lógica.
a. Prueba simple: el if/else
La lógica condicional se traduce en pseudocódigo de la siguiente manera:
SI una condición ENTONCES
Hago una cosa
SI NO
Hago otra cosa
En C#, las palabras clave para realizar una instrucción condicional son if y else:
if(condición)
{
....
}
else
{
....
}
La condición comprobada por una instrucción if debe devolver un booleano. Este último se puede guardar en una variable, pero también es posible que la instrucción if evalúe directamente la condición, sin variable intermedia.
Si retomamos el ejemplo del final del capítulo anterior, podríamos mejorar nuestra clase Coche para añadir un booleano que indique si la instancia del coche es funcional. Si el valor es igual a «sí», es inútil reparar el coche. Sin embargo, si el coche no es funcional, hay que repararlo:
public class Coche
{
public bool Funcional { get; set; }
...
}
public class Garaje
{
public void Repara(Coche coche)
{
if(coche.Funcional)
{ ...
Gestión de los errores
Hemos mencionado muchas veces en el libro los errores que podrían suceder cuando se ejecuta el código. Es el momento de ponerles nombre: se trata de excepciones. Una excepción es un error que se encuentra en la ejecución. Puede ser imprevisto (debido a un bug) o planificado de manera voluntaria. Primero vamos a ver qué es una excepción.
1. Concepto de una excepción
Como se indica arriba, una excepción es una instancia de una clase especial que representa un error de ejecución. Pero, para poder usar este error, tiene que llevar dos datos:
-
El tipo de error.
-
Información sobre el error.
Como el lenguaje C# está fuertemente tipado, usamos el tipo de la clase de la excepción para transmitir la información del tipo de error. Por ejemplo, una de las excepciones más habituales es NullReferenceException, procedente de la clase del mismo nombre. Esta excepción lleva el siguiente tipo de error: ha habido un intento de acceso a un dato en un objeto que no ha sido asignado (que es igual a null).
Por otro lado, como una excepción es una instancia de una clase, se le puede añadir información mediante propiedades. Sin embargo, una clase de excepción debe heredar forzosamente de la clase del framework .NET Exception para que sea posible usar todo el mecanismo de gestión de errores del framework.
Por ejemplo, para crear una excepción personalizada, se escribe el siguiente código:
public class MiExcepcion : Exception { }
Por defecto, la clase de base Exception proporciona varios datos que se pueden usar. Se usan con más frecuencia los siguientes:
-
Message contiene el mensaje de texto generado automáticamente por el framework o añadido por el desarrollador (a menudo es el primer parámetro del constructor de una excepción).
-
InnerException contiene una posible excepción interna, que también transmite información. Este dato se usa con frecuencia en el marco de la gestión de excepciones que traspasa varias capas de código.
2. Devolver una excepción
Cuando el desarrollador quiere avisar de que hay que desencadenar un error, hay que devolver una excepción. Para que sea posible, hay que efectuar estas acciones:
-
Crear una instancia nueva de una clase que representa una excepción.
-
Usar la palabra...