Metodologia de Desarrollo de Programas III

Operaciones abstractas
Una abstracción es una visión simplificada de una cierta entidad, de la que solo consideramos sus elementos esenciales, prescindiendo en lo posible de los detalles. Las entidades que podemos abstraer para materializarlas como subprogramas son operaciones. Con la palabra operación englobamos tanto la idea de acción como la de función.

Especificación y realización
Hay que definir 2 posibles visiones.

Resumiendo:

La forma simplificada de especificación indica solamente cual ha de ser la sintaxis o forma de uso de la operación. La especificación completa debe establecer también cual es la semántica o significado de la operación.

Funciones. Argumentos
La idea de función surge al aplicar el concepto de una abstracción a las expresiones aritméticas. Una expresión representa un nuevo valor obtenido por calculo a partir de ciertos valores ya conocidos que se usan como operandos.

El concepto matemático de función es una aplicación entre conjuntos, cuyo computo se limita a suministrar un resultado, son modificar el valor de los argumentos.

La transparencia referencial se garantiza si la realización de la función no utiliza datos exteriores a ella. Es decir, si no emplea

Esta restricciones se cumplen en el ejemplo anterior del calculo del cubo de un numero. Las funciones que cumplen la cualidad de transparencia referencial y que no producen efectos laterales o secundarios se denominan funciones puras

Acciones abstractas. Procedimientos
Un procedimiento representa una acción, que se define por separa y que se invoca por su nombre.

Al definir procedimientos no podemos limitarnos a usar solo el paso de argumentos por valor. En programación imperativa las acciones consisten habitualmente en modificar los valores de determinadas variables. Por esta razón se considera normal que los procedimientos usen argumentos pasados por referencia.

Los procedimientos se escriben siempre como procedimientos puros, entendiendo por ello que no produzcan efectos laterales o secundarios. Con esto se consigue que la acción que realiza un procedimiento se deduzca en forma inmediata de la invocación de dicha acción.

Un procedimiento cumple esta cualidad si su realización no utiliza:

Desarrollo por refinamiento usando abstracciones
Desarrollo descendente
Es simplemente el desarrollo por refinamientos sucesivos, teniendo en cuenta además la posibilidad de definir operaciones abstractas.

Considerar la operación como operación terminal, y codificarla mediante sentencias del lenguaje de programación

Considerar la operación como operación compleja, y descomponerla en otras mas sencillas.

Considerar la operación como operación abstracta, y especificarla, escribiendo mas adelante el subprograma que la realiza.

En general resultara ventajoso refinar una operación como operación abstracta, que se define en forma separada, si se consigue alguna de las ventajas siguientes:

La llamada al subprograma representa una acción adicional que consume un cierto tiempo de ejecución.

Reutilización
La realización de ciertas operaciones como subprogramas independientes facilita la reutilización de software.

La escritura de otros programas que utilicen esa misma operación resulta mas sencilla, ya que se aprovecha el código de su definición que ya estaba escrito.

Para aplicar de manera eficaz esta técnica, es preciso pensar en las posibles aplicaciones de un cierto subprograma en el momento de especificarlo, con independencia de las necesidades particulares del programa que se esta desarrollando en ese momento.

Esto tiene ventajas e inconvenientes:

Desarrollo ascendente
Esta metodología consiste en ir creando subprogramas que realicen operaciones significativas de utilidad para el programa que se intenta construir, hasta que finalmente sea posible escribir el programa principal, de manera relativamente sencilla, apoyándose en los subprogramas desarrollados hasta ese momento.

Programas robustos
La corrección de un programa exige que los resultados sean los esperados, siempre que el programa se ejecute con unos datos de entrada aceptables.

Un programa se dice que es robusto si su operación se mantiene en condiciones controladas aunque se le suministren datos erróneos.

Programación a la defensiva
Consiste en que cada programa o subprograma este escrito de manera que desconfíe sistemáticamente de los datos o argumentos con que se le invoca, y devuelva siempre como resultado:

La mejora de la robustez del programa tiene como contrapartida una cierta perdida de eficiencia, al tener que hacer comprobaciones adicionales.

Tratamiento de excepciones
Ante la posibilidad de errores en los datos con que se opera, hay que considerar dos actividades diferentes: