2. • Las sobrecargas de operadores permiten combinar y comparar los tipos
utilizando operadores como "+", "-", "=" y "!=". Agregando sobrecargas de
operadores a un tipo, se permite a los desarrolladores utilizar el tipo como
si fuera un tipo primitivo integrado. La sobrecarga de operadores sólo
debería realizarse cuando el significado de la operación es intuitivo para el
tipo (por ejemplo, para admitir que se agreguen dos instancias de un tipo
que representa un valor numérico). La sobrecarga de operadores no se
debería utilizar para proporcionar un acceso directo sintáctico para las
operaciones no intuitivas.
• El ejemplo siguiente muestra la firma para la operación de suma de la
clase DateTime
•
• [Visual Basic]
• Public Shared Function op_Addition(ByVal d As DateTime, _
• ByVal t As TimeSpan _
• ) As DateTime
Sobrecargas de operador
3. Operador lógico unario
• El Not (Operador, Visual Basic) realiza
la negación lógica en una expresión Boolean. Produce
el contrario lógico de su operando. Si la expresión se
evalúa como True, Not devuelve False; si la expresión
se evalúa comoFalse, Not devuelve True. Debido a que
Object es la clase base de todos los tipos de referencia
en .NET Framework, este comportamiento es heredado
por los tipos de referencia que no reemplazan el
métodoToString.
• VB
• Dim x, y As Booleanx = Not 23 > 14y = Not 23 > 67' The
preceding statements set x to False and y to True.
4. Operadores lógicos binarios
• El And (Operador, Visual Basic) realiza la conjunción lógica de dos expresiones Boolean. Si ambas
expresiones se evalúan como True, And devuelve True. Si al menos una de las expresiones se
evalúa como False, Anddevuelve False.
• El Or (Operador, Visual Basic) realiza la disyunción o inclusión lógicas de dos expresiones Boolean. Si
una de las expresiones o ambas se evalúan como True, Or devuelve True. Si ninguna de las
expresiones se evalúa como True, Or devuelve False.
• Xor (Operador, Visual Basic) realiza la exclusión lógica de dos expresiones Boolean. Si exactamente
una expresión, pero no ambas, se evalúa como True, Xor devuelve True. Si ambas expresiones se
evalúan como Trueo como False, Xor devuelve False.
• En el siguiente ejemplo se muestra cómo utilizar los operadores And, Or y Xor.
•
•
• VB
• Dim a, b, c, d, e, f, g As Boolean a = 23 > 14 And 11 > 8b = 14 > 23 And 11 > 8' The preceding
statements set a to True and b to False. c = 23 > 14 Or 8 > 11d = 23 > 67 Or 8 > 11' The preceding
statements set c to True and d to False. e = 23 > 67 Xor 11 > 8f = 23 > 14 Xor 11 > 8g = 14 > 23 Xor 8
> 11' The preceding statements set e to True, f to False, and g to False.
5. Polimorfismo y Funciones Virtuales
• El polimorfismo es la funcionalidad que permite a código
antiguo invocar código nuevo, también permite extender el
sistema sin modificar el código existente, esto se logra
sobreescribiendo o redefiniendo el código, para lo cual se
utilizan funciones virtuales y la palabra clave override.
• Las funciones abstractas son automaticamente funciones
virtuales, las cuales permiten al programador usar
polimorfismo para hacer su código simple.
• Virtual significa que cuando una invocación a funciones
miembro, el compilador debería buscar por el tipo real del
objeto y no por el tipo de la referencia, e invocar en base al
tipo la función apropiada.
6. • using System; public class Persona{ //Propiedades
public string sNombre; public int iEdad;
//Constructor public Persona(string sNombre, int iEdad){
this.sNombre = sNombre;
this.iEdad = iEdad; } //Métodos
virtual public string Tipo(){ return "Persona";
} } //Herencia Simple public class
Empleado : Persona{ public Empleado(string sNombre, int
iEdad):base(sNombre, iEdad){} override public string Tipo(){
return "Empleado"; } } class
App{ //Aplicación public static void Main(){
Persona Mexicano = new Persona("Gerado Ángeles Nava", 33);
Console.WriteLine("Mexicano.sNombre : " + Mexicano.sNombre);
Console.WriteLine("Mexicano.iEdad : " + Mexicano.iEdad);
Console.WriteLine("Mexicano.Tipo : " + Mexicano.Tipo());
Console.WriteLine("--- Arreglo de Objetos ---");
Empleado[] aProgramadores = new Empleado[2];
aProgramadores[0] = new Empleado("Bill Gates", 50);
aProgramadores[1] = new Empleado("Eric S. Raymond", 60);
for(int i = 0; i < aProgramadores.Length; i++){
Console.WriteLine("aProgramadores["+i+"].sNombre : " +
aProgramadores[i].sNombre);
Console.WriteLine("aProgramadores[" + i + "].iEdad : " + aProgramadores[i].iEdad);
Console.WriteLine("aProgramadores[" + i + "].Tipo : " +
aProgramadores[i].Tipo()); } } }
7. • Cuando una función es declarada con la palabra
reservada override significa que es la misma función que
fue declarada en laclase base, si la palabra
reservada override se omite el compilador podría asumir
que la función no está relacionada a la función de la clase
base y no despacha la función virtual (el compilador podría
sugerir omitir override o agregar new) .
• Cuando existe una función virtual el programador puede
pasar una referencia a la clase abstracta aunque la clase
derivada y el compilador podrían escribir código para
invocar la versión apropiada de la función en tiempo de
ejecución.
• Por ejemplo, el objeto base object tiene una función virtual
llamada ToString() que convierte un objeto a string. Si se
invoca la función ToString() en un objeto que que no la
tiene como versión propia, la versión de la función que es
parte de la clase object podría ser invocada.
•
8. IDENTIFICACION DE PATRONES DE DISEÑO
PARA LA AUTENTIFICACION EN APLICACIONES
• En algunas aplicaciones, hay clases que deben
ser instanciadas una sola vez.
Por ejemplo, un sistema operativo debe tener
solo un sistema de reloj y una compañía debe
tener solo un sistema contable llamada
singular o singleton.
El patrón de diseño Singular (Singleton)
asegura que se cree sólo una instancia de la
clase y provee un método para acceder esa
única instancia.
9. • Todos los objetos que utilizan una instancia de una
clase Singular utilizan la misma instancia
Estructura Observa que los miembros estáticos de la
clase están subrayados .
En este patrón de diseño
El atributo estático instance contiene la única instancia
de la clase.
El constructor es definido como private de modo que
las otras clases no puedan crear instancias.
El método estático getSingletonInstance regresa la
única instancia de la clase.
La primera vez que este método es llamado, crea la
única instancia
En la línea 10, la variable estática y privada
singletonInstance es inicializada con una instancia de la
claseICarnegieInfo —singletonInstance será la única
instancia de la clase ICarnegieInfo en una aplicación.
10. • En la línea 22, el constructor es definido como privado, de modo
que otras clases no puedan crear instancias deICarnegieInfo .
En la línea 36, la clase define un método estático llamado
getSingletonInstance que regresa una referencia a la única instancia
de ICarnegieInfo .
a primera llamada al método getSingletonInstance crea la única
instancia.
• Consecuencias
El patrón de diseño Singular tiene los siguientes beneficios:
Una clase Singular puede controlar cómo y cuando el código cliente
puede acceder a la única instancia.
El código cliente no tiene la libertad de utilizar el operador new
para crear una instancia de la clase Singular.
En vez de eso, debe llamar a un método estático que regresa una
referencia a la instancia única.
Una clase Singular puede ser modificada fácilmente si los
requerimientos cambian y la aplicación necesita limitar el número
de instancias a un número diferente de uno.
11. FABRICAS ABSTRACTAS
• Contexto y problema
Contexto: Debemos crear diferentes objetos, todos pertenecientes
a la misma familia. Por ejemplo: las librerías para crear interfaces
gráficas suelen utilizar este patrón y cada familia sería un sistema
operativo distinto. Así pues, el usuario declara un Botón, pero de
forma más interna lo que está creando es un BotónWindows o un
BotónLinux, por ejemplo.
El problema que intenta solucionar este patrón es el de crear
diferentes familias de objetos.
El patrón Abstract Factory está aconsejado cuando se prevé la
inclusión de nuevas familias de productos, pero puede resultar
contraproducente cuando se añaden nuevos productos o cambian
los existentes, puesto que afectaría a todas las familias creadas.
12. Estático
• La estructura típica del patrón Abstract Factory es la siguiente:
• Cliente: La clase que llamará a la factoría adecuada ya que necesita crear uno de
los objetos que provee la factoría, es decir, Cliente lo que quiere es obtener una
instancia de alguno de los productos (ProductoA, ProductoB).
• AbstractFactory: Es de definición de la interfaces de las factorías. Debe de
proveer un método para la obtención de cada objeto que pueda crear.
("crearProductoA()" y "crearProductoB()")
• Factorías Concretas: Estas son las diferentes familias de productos. Provee de la
instancia concreta de la que se encarga de crear. De esta forma podemos tener
una factoría que cree los elementos gráficos para Windows y otra que los cree
para Linux, pudiendo poner fácilmente (creando una nueva) otra que los cree para
MacOS, por ejemplo.
• Producto abstracto: Definición de las interfaces para la familia de productos
genéricos. En el diagrama son "ProductoA" y "ProductoB". En un ejemplo de
interfaces gráficas podrían ser todos los elementos: Botón, Ventana, Cuadro de
Texto, Combo... El cliente trabajará directamente sobre esta interfaz, que será
implementada por los diferentes productos concretos.
13. • • Producto concreto: Implementación de los diferentes productos. Podría
ser por ejemplo "BotónWindows" y "BotónLinux". Como ambos
implementan "Botón" el cliente no sabrá si está en Windows o Linux,
puesto que trabajará directamente sobre la superclase o interfaz.
•
Un ejemplo:
Veremos un ejemplo didáctico y basado en el libro Head First Design
Patterns, de O'Reilly.
Supongamos que disponemos de una cadena de pizzerías. Para crear
pizzas disponemos de un método abstracto en la clase Pizzería que será
implementada por cada subclase de Pizzería.
abstract Pizza crearPizza()
Concretamente se creará una clase PizzeríaZona por cada zona, por
ejemplo la Pizzería de New York sería PizzeriaNewYork y la de Californía
PizzeríaCalifornia que implementarán el método con los ingredientes de
sus zonas.
Las pizzas son diferentes según las zonas. No es igual la pizza de New York
que la pizza de California. Igualmente, aunque usarán los mismos
ingredientes (tomate, mozzarella...) no los obtendrán del mismo lugar,
cada zona los comprará donde lo tenga más cerca. Así pues podemos crear
un método creador de Pizza que sea
Pizza(FactoriaIngredientes fi);
14. • Como vemos utilizamos la factoría abstracta (no las
concretas de cada zona, como podría ser
IngredientesNewYork o IngredientesCalifornia). Pizza podrá
obtener los ingredientes de la factoría independientemente
de donde sea. Sería fácil crear nuevas factorías y añadirlas
al sistema para crear pizzas con estos nuevos ingredientes.
Efectivamente, en este ejemplo cliente es Pizza y es
independiente de la Factoría usada.
El creador de la Pizza será el encargado de instanciar la
factoría concreta, así pues los encargados de instanciar las
factorías concretas serán las pizzerías locales. En
PizzeríaNewYork podemos tener el método crearPizza() que
realice el siguiente trabajo:
Pizza crearPizza() {
FactoríaIngredientes fi = new IngredientesNewYork();
Pizza pizza = new Pizza(fi); // Uso de la factoría
pizza.cortar();
pizza.empaquetar();
return pizza;
}
15. SINGLENTOS O SINGULAR:
• En algunas aplicaciones, hay clases que deben ser instanciadas una sola
vez.
Por ejemplo, un sistema operativo debe tener solo un sistema de reloj y
una compañía debe tener solo un sistema contable llamada singular o
singleton.
El patrón de diseño Singular (Singleton) asegura que se cree sólo una
instancia de la clase y provee un método para acceder esa única instancia.
•
Todos los objetos que utilizan una instancia de una clase Singular utilizan
la misma instancia
Estructura Observa que los miembros estáticos de la clase están
subrayados .
En este patrón de diseño
El atributo estático instance contiene la única instancia de la clase.
El constructor es definido como private de modo que las otras clases no
puedan crear instancias.
El método estático getSingletonInstance regresa la única instancia de la
clase.
La primera vez que este método es llamado, crea la única instancia
En la línea 10, la variable estática y privada singletonInstance es
inicializada con una instancia de la claseICarnegieInfo —singletonInstance
será la única instancia de la clase ICarnegieInfo en una aplicación.
16. • En la línea 22, el constructor es definido como privado, de
modo que otras clases no puedan crear instancias
deICarnegieInfo .
En la línea 36, la clase define un método estático llamado
getSingletonInstance que regresa una referencia a la única
instancia de ICarnegieInfo .
a primera llamada al método getSingletonInstance crea la única
instancia.
• Consecuencias
El patrón de diseño Singular tiene los siguientes beneficios:
Una clase Singular puede controlar cómo y cuando el código
cliente puede acceder a la única instancia.
El código cliente no tiene la libertad de utilizar el operador new
para crear una instancia de la clase Singular.
En vez de eso, debe llamar a un método estático que regresa
una referencia a la instancia única.
Una clase Singular puede ser modificada fácilmente si los
requerimientos cambian y la aplicación necesita limitar el
número de instancias a un número diferente de uno.
•
17. FACTORY METHOD O METODO DE
FÁBRICA:
• En diseño de software, el patrón de diseño
Factory Method consiste en utilizar una clase
constructora (al estilo del Abstract Factory)
abstracta con unos cuantos métodos definidos y
otro(s) abstracto(s): el dedicado a la construcción
de objetos de un subtipo de un tipo determinado.
Es una simplificación del Abstract Factory, en la
que la clase abstracta tiene métodos concretos
que usan algunos de los abstractos; según
usemos una u otra hija de esta clase abstracta,
tendremos uno u otro comportamiento.
18. Estructura
• Las clases principales en este patrón son el creador y el
producto. El creador necesita crear instancias de productos,
pero el tipo concreto de producto no debe ser forzado en
las subclases del creador, porque entonces las posibles
subclases del creador deben poder especificar subclases
del producto para utilizar.
La solución para esto es hacer un método abstracto (el
método de la fábrica) que se define en el creador. Este
método abstracto se define para que devuelva un
producto. Las subclases del creador pueden sobrescribir
este método para devolver subclases apropiadas del
producto.
Ejemplo de código (en Java)
19. • // Definimos la clase abstracta constructora
public abstract class Creator{
// Operación que realiza
public Product anOperation() {
return factoryMethod();
}
// Definimos método abstracto
protected abstract Product factoryMethod();
}
Ahora definimos el creador concreto.
public class ConcreteCreator extends Creator{
protected Product factoryMethod() {
return new ConcreteProduct();
}
}
Y definimos el producto y su implementación concreta.
public interface Product{
public void operacion();
}
public class ConcreteProduct implements Product{
public void operacion(){
System.out.println("Una operación de este producto");
}
}
Y un ejemplo de uso :
public static void main(String args[]){
Creator aCreator;
aCreator = new ConcreteCreator();
Product producto = aCreator.anOperation();
producto.operacion();
20. PROTOTIPO:
• Programación basada en prototipos es un estilo de programación
orientada a objetos en el cual, las "clases" no están presentes, y la
re-utilización de procesos (conocida como herencia en lenguajes
basados en clases) se obtiene a través de la clonación de objetos ya
existentes, que sirven de prototipos, extendiendo sus
funcionalidades. Este modelo es conocido como orientado a
prototipos, o programación basada en instancias.
El original (y el más canónico) ejemplo de lenguaje prototipado es
el lenguaje Self, desarrollado por David Ungar y Randall Smith. Sin
embargo el paradigma sin clases está comenzando a popularizarse y
ya ha sido implementado en lenguajes de programación como
JavaScript, Cecil, NewtonScript, Ío, MOO, REBOL y varios otros.
21. Analógicamente
• Un ejemplo de instancia en un lenguaje de programación visual,
sería tomar o arrastrar un objeto de la barra de herramientas o de
la lista de librerías y colocarlo en el escritorio o escenario de trabajo
(estamos creando una instancia de ese objeto, una copia). Si
arrastramos 10 botones al entorno visual de trabajo, estamos
creando una instancia del botón original, si a cada botón le
cambiamos el nombre, tendremos 10 botones que heredan las
mismas propiedades y métodos del objeto original. Tenemos como
resultado que con un solo botón hicimos 10 y nuestro archivo
pesara como si tuviese uno solo.
De esta forma, partiendo de lo que conforma a un objeto original
(propiedades y métodos) se reutilizan sus funciones creando una
instancia del mismo en distintas partes del programa donde se
necesite. Si el objeto original cambia o le es agregado algún nuevo
atributo, las instancias lo heredaran puesto que son una copia del
objeto original.
22. Comparación con el modelo basado en
clases
• En lenguajes basados en clases los objetos pueden ser
de dos tipos generales, las clases y las instancias. Las
clases definen la disposición y la funcionalidad básicas
de los objetos, y las instancias son objetos "utilizables"
basados en los patrones de una clase particular. En este
modelo, las clases actúan como colecciones de
comportamiento (métodos) y estructuras que son
iguales para todas las instancias, mientras que las
instancias llevan los datos de los objetos. La distinción
del papel se basa así sobre todo en una distinción entre
la estructura y el comportamiento en un lado, y el
estado en el otro.
23. • Los entusiastas de la programación basada en prototipos a
menudo argumentan que los lenguajes basados en clases animan
un modelo del desarrollo que se centra primero en la taxonomía y
las relaciones entre las clases. En cambio, la programación basada
en prototipos intenta animar al programador que se centre en el
comportamiento de un cierto sistema de ejemplos y después de
clasificar estos objetos en objetos arquetipos que se utilizan más
adelante en una manera similar a las clases. Como tal, muchos
sistemas basados en prototipos animan la alteración de prototipos
durante tiempo de ejecución, mientras que solamente muy pocos
sistemas orientados a objeto, basados en clase (como el primer
sistema orientados al objetos dinámicos, Smalltalk) permiten que
las clases sean alteradas durante la ejecución de un programa.
Mientras que basan la amplia mayoría de sistemas basados en
prototipos se hacen con lenguajes de programación interpretados
y de tipos de datos dinámicos, es importante precisar que los
sistemas de tipos de datos estáticos son técnicamente factibles. El
lenguaje de programación de Omega que es basado en prototipos
es un ejemplo de tal sistema, aunque según el Web site de Omega,
Omega no es exclusivamente de tipos de datos estáticos, pero su
"compilador puede elegir utilizar el tipo de dato estático donde es
posible esto y puede mejorar la eficacia del programa.”
24. APLICACIÓN DE METODOS PARA LA
OPERACIÓN CONTINUA DEL SISTEMA
• CIFRADO DE DATOS:
• El cifrado de datos se puede entender como el hecho de guardar
algo valioso dentro de una caja fuerte cerrada con llave. Los datos
confidenciales se cifran con un algoritmo de cifrado y una clave que
los hace ilegibles si no se conoce dicha clave.
• Las claves de cifrado de datos se determinan en el momento de
realizar la conexión entre los equipos. El uso del cifrado de datos
puede iniciarse en su equipo o en el servidor al que se conecta.
Conexiones de red admite dos tipos de cifrado:
• Microsoft MPPE, que utiliza cifrado RSA RC4.
• Una implementación de Seguridad de Protocolo Internet (IPSec)
que utiliza cifrado de Estándar de cifrado de datos (DES).
25. INICIALIZACION DE OBJETOS:
• Para declarar o inicializar variables o ya sean objetos de
referencia, el proceso es muy parecido al de crear las
variables de tipo primitivo. La única diferencia es que se
debe crear un objeto de la clase que apunta a la variable de
referencia ante de que podamos inicializar dicho objeto.
Para poder obtener este proceso debemos seguir los
siguientes pasos:
<!--[if !supportLists]-->- <!--[endif]-->Declara una referencia
a un objeto, esto se hace mediante la especificación de un
identificador y del tipo de objeto al que se quiere hacer
referencia, que es la clase del objeto.
26. • <!--[if !supportLists]-->- <!--[endif]-->Crear nuestro nuevo objeto
mediante la palabra reservada “new”.
<!--[if !supportLists]-->- <!--[endif]-->Inicializar la variable que
referencia al objeto asignándole el objeto.
Veamos un ejemplo donde declaramos nuestra variable que
referencia a un objeto e instanciamos nuestro objeto.
public class Fabrica
{
public static void main(String agrs[])
{
Auto miAuto;
miAuto = new Auto();
miAuto.mostrarInformacionAuto();
}
}
Bien, tenemos la clase Fabrica la cual contiene el método estático
main, en donde nosotros instanciamos un objeto de tipo auto, el
cual se llama miAuto y con el podemos invocar un método de la
clase Auto que en este caso fue el método
mostrarInformacionAuto().
27. DESTRUCCION DE OBJETOS:
• La destrucción de objetos es una función virtual
que necesita ser implementada por una clase
derivada que no sea abstracta. Las clases que
contienen métodos virtuales puros son
denominadas "abstractas". Éstas no pueden ser
instanciadas directamente, y una subclase de una
clase abstracta sólo puede ser instanciada
directamente si todos los métodos virtuales
puros han sido implementados por esa clase o
una clase padre.
28. • Las destrucciones de objetos normalmente tienen una
declaración (cabecera) pero no tienen definición
(implementación). Como ejemplo, una clase base abstracta
como "SimboloMatematico" puede ofrecer una función
virtual pura como hazOperacion, y las clases derivadas
"Suma" y "Resta" pueden implementar hazOperacion para
ofercer implementaciones concretas. La implementación de
hazOperacion no tendría sentido en la clase
"SimboloMatematico" porque "SimboloMatematico" es un
concepto abstracto cuyo comportamiento es definido
solamente por cada tipo (subclase) de "SimboloMatematico"
dado.
De forma similar, una subclase dada de "SimboloMatematico"
no sería completa sin una implementación de hazOperacion.
Aunque los métodos virtuales puros normalmente no tienen
implementación en la clase que los declara, en C++ permite
hacer esto, ofreciendo un comportamiento por omisión en el
que la clase derivada puede delegar si es apropiado.
29. • Las destrucciones de objetos también son utilizadas
donde las declaraciones de métodos se utilizan para
definir una interfaz para la que las clases derivadas
proveerán todas las implementaciones. Una clase
abstracta sirviendo como interfaz contiene sólo una
destrucción de objetos, y ningún miembro de datos
(variables, constantes, etc.) ni métodos ordinarios. El
uso de clases puramente abstractas como interfaces
funciona en C++ ya que éste soporta herencia múltiple.
Debido a que muchos lenguajes orientados a objetos
no soportan herencia múltiple, normalmente ofrecen
un mecanismo por separado para hacer interfaces. Esto
es así por ejemplo en Java.
30. MANEJO DE EXPRESIONES:
• Una excepción en términos de lenguaje de programación es la indicación
de un problema que ocurre durante la ejecución de un programa. Sin
embargo la palabra excepción se refiere que este problema ocurre con
poca frecuencia generalmente cuando existe algún dato o instrucción que
no se apega al funcionamiento del programa por lo que se produce un
error. El manejo de excepciones permite al usuario crear aplicaciones
tolerantes a fallas y robustos (resistentes a errores) para controlar estas
excepciones y que pueda seguir ejecutando el programa sin verse afectado
por el problema. En lenguaje java estas excepciones pueden manejarse
con las clases que extienden el paquete Throwable de manera directa o
indirecta, pero existen diversos tipos de excepciones y formas para
manejarlas. Uso del manejo de excepciones El manejo de excepciones
ayuda al programador a remover el código para manejo de errores de la
línea principal de ejecución, además se pude elegir entre manejar todas
las excepciones, las de cierto tipo o de las de grupos relacionados, esto
hace que la probabilidad de pasar por alto los errores se reduzca y a la vez
hace los programas más robustos.
31. Limpieza de pila
• En ocasiones cuando se hace lanza una excepción, pero
no se atrapa en un enlace específico, la pila de
llamadas se limpia y el programa intenta volverlo a
atrapar en el siguiente bloque, esto se conoce como
limpia de pila. Este proceso hace que el método en el
que no se atrapó la excepción termina, todas sus
variables quedan fuera del enlace y el control regresa a
la instrucción que originalmente la invocó. La limpieza
de pila de repetirá hasta que la excepción pueda ser
atrapada porque de lo contrario se producirá un error a
la hora de compilar.
32. Aserciones
• Las aserciones ayudan a asegurar la validez del programa al atrapar los errores potenciales e
identificar los posibles errores lógicos del desarrollo. Estas pueden escribirse como comentarios
para apoyar a la persona que desarrolla el programa. Algunos ejemplos son: Precondiciones y pos
condiciones Estas características son utilizadas por los programadores para hacer un análisis de lo
esperado del programa antes y después de su ejecución. Son importantes porque gracias a ellas se
pueden detectar posibles fallas en el programa y corregirlas. Las precondiciones son verdaderas
cuando se invoca a un método, estas describen las características del método y las expectativas que
se tienen en el estado actual del programa. Si no se cumplen las precondiciones el comportamiento
del método es indefinido por lo que se lanza una excepción que esté preparada o continuar con el
programa esperando el error. Las pos condiciones describen las restricciones en el entorno y
cualquier efecto secundario del método. Es recomendable escribirlas para saber que esperar en un
futuro si es que se hacen modificaciones.
Las aserciones ayudan a asegurar la validez del programa al atrapar los errores potenciales e
identificar los posibles errores lógicos del desarrollo. Estas pueden escribirse como comentarios
para apoyar a la persona que desarrolla el programa. Algunos ejemplos son: Precondiciones y pos
condiciones Estas características son utilizadas por los programadores para hacer un análisis de lo
esperado del programa antes y después de su ejecución. Son importantes porque gracias a ellas se
pueden detectar posibles fallas en el programa y corregirlas. Las precondiciones son verdaderas
cuando se invoca a un método, estas describen las características del método y las expectativas que
se tienen en el estado actual del programa. Si no se cumplen las precondiciones el comportamiento
del método es indefinido por lo que se lanza una excepción que esté preparada o continuar con el
programa esperando el error. Las pos condiciones describen las restricciones en el entorno y
cualquier efecto secundario del método. Es recomendable escribirlas para saber que esperar en un
futuro si es que se hacen modificaciones.
33. • El manejo de excepciones ayuda a lidiar con los
errores de una aplicación por medio de la
manipulación del código para hacer programas más
robustos. Además existen herramientas que ayudan
a manejarlas tal es el caso de los bloques tratar que
encierran el código que puede lanzar una excepción
y los bloques atrapar que lidian con las excepciones
que surjan. También existen técnicas que el
programador utiliza para conocer el posible
funcionamiento del programa y detectar los errores
que pueda contener.
Ejemplo de manejo de excepción en Java:
import java.io.IOException;
34. • // ...
public static void main(String[] args) {
try {
// Se ejecuta algo que puede producir una excepción
} catch (IOException e) {
// manejo de una excepción de entrada/salida
} catch (Exception e) {
// manejo de una excepción cualquiera
} finally {
// código a ejecutar haya o no excepción
}
}
Ejemplo de manejo de excepción en Delphi:
procedure TForm1.Button1Click(Sender : TObject);
begin
try
try
a := b / c;
finally
// Este código siempre se ejecuta, independientemente de si ocurre o no una excepción.
end;
except
on e:EZeroDivide do
// Manejo de la excepción División por cero.
on e:Exception do
// Manejo de una excepción "genérica".
end;
end;
35. • Ejemplo de manejo de excepción en Python:
try:
result = x / y
except ZeroDivisionError:
print "division by zero!"
else:
print "result is", result
finally:
print "executing finally clause"
Ejemplo de manejo de excepcion en Ada
type T_Matriz is array (Positive range <>,
Positive range <>) of Integer;
procedure Rellenar_Matriz
(Matriz : in T_Matriz;
K : in Integer;
Q : in Integer);
is
begin
begin
Matriz (K,Q) := 3;
exception
when Constraint_Error =>
Put_Line ("Las posiciones se salen del rango de la matriz");
end;
end Rellenar_Matriz;