Python Tema2 Parte9 v3
Python Tema2 Parte9 v3
Conceptos básicos de
programación
Segmentación de programación modular, recursividad,
global
1
IBM SkillsBuild | Introducción a Python
Índice
Introducción 3
Programación modular 4
Ventajas 4
Interfaz 5
Implementación 5
Tipos de módulos 5
Refinamiento y modularidad 7
El refinamiento sucesivo 7
El concepto de modularidad 7
El diseño descendente o diseño de arriba abajo (Top Down) 7
Ocultación de la información 8
Diseño de funciones 2
Procedimientos 3
Parámetros 3
Funciones 4
Ámbito de identificador 5
Recursividad 6
Tipos de recursión 6
Etapas del diseño recursivo: 6
Librerías 7
APIs 8
2
IBM SkillsBuild | Introducción a Python
Introducción
• La comprensibilidad, que incluye la legibilidad y
la buena documentación, características que
permiten una mayor facilidad y comodidad en el
A la hora de desarrollar un programa pueden mantenimiento de los programas.
planteársenos preguntas del tipo: ¿sigue nuestro • La eficiencia, que expresa los requerimientos de
programa una programación en módulos? ¿Tiene una memoria y el tiempo de ejecución del programa.
estructura básica o es un caos? ¿Están los
• La flexibilidad o capacidad de adaptación del
procedimientos y funciones bien desarrollados?
programa a variaciones del problema inicial, lo
Nuestro objeto de estudio en este tema será conocer
cual permite la utilización del programa durante
cómo es una programación modular, su estructura
básica y cómo deben ser las funciones y mayor tiempo.
procedimientos de los programas. Se presenta • La “transportabilidad ", que es la posibilidad de
históricamente como una evolución de la usar el mismo programa sobre distintos sistemas
programación estructurada para solucionar sin realizar cambios notables en su estructura.
problemas de programación más grandes y
complejos de lo que ésta puede resolver. Teniendo en cuenta que un programa, a lo largo de su
vida, es escrito solo una vez, pero leído, analizado y
La razón principal para utilizar un ordenador es para modificado muchas más, cobra una gran importancia
resolver problemas (en el sentido más general de la adquirir técnicas de diseño y desarrollo adecuadas,
palabra), o en otras palabras, procesar información como la programación modular que se presenta a
para obtener un resultado a partir de unos datos de continuación, para obtener programas con las
entrada. características mencionadas.
3
IBM SkillsBuild | Introducción a Python
Programación modular
Un módulo actúa como una caja negra con la cual el
resto del programa interactúa a través de una
sección de interfaz. La interfaz (o vista pública) es
una colección de declaraciones de constantes, tipos,
La programación modular es la técnica de
variables, procedimientos, funciones, etc. La otra
programación basada en la filosofía del diseño
sección principal de un módulo es la implementación
descendente, que consiste en dividir el problema
(o vista privada) que incluye el código de los
original en diversos subproblemas (y estos a su vez
procedimientos y demás elementos constitutivos de
en otros más pequeños, obteniendo una estructura
la parte ejecutable del módulo.
jerárquica o en árbol) que se pueden resolver por
separado, para después recomponer los resultados y Para efectuar un buen diseño modular los algoritmos
obtener la solución al problema. Un subproblema se que se van a desarrollar se han de concebir como una
denomina módulo y es una parte del problema que jerarquía de módulos intercomunicados donde cada
se puede resolver de manera independiente. uno de ellos presenta una función clara y
diferenciada y en la que ningún módulo accede
directamente al interior de otros módulos sino que
siempre utiliza los mecanismos de interfaz.
Ventajas
• Facilita el diseño descendente
• Disminuye la complejidad del algoritmo
• Disminuye el tamaño total del programa
• Reusabilidad: ahorro de tiempo de programación
• División de la programación entre un equipo de
programadores reducción del tiempo de
4
IBM SkillsBuild | Introducción a Python
Interfaz
Para servirse de un tipo o procedimiento ajeno a un
módulo es obligatorio especificar el lugar donde se
han definido originalmente dichos elementos.
Además, es conveniente que esa declaración de
Un módulo puede ofrecer a la "comunidad" de
objetos ajenos al módulo pero usados en él, se lleve a
módulos sus propios recursos, tipos y
cabo en una sección bien diferenciada. Para tal fin se
procedimientos dentro de lo que se conoce como
puede utilizar alguna versión de la denominada lista
sección de interfaz del módulo. Normalmente es
de importaciones.
posible exportar cinco tipos de elementos:
constantes, tipos, variables, procedimientos y Cada lenguaje presenta sus peculiaridades, así, en C,
funciones. las importaciones se pueden incluir explícitamente
declarando los procedimientos y funciones en el
La importación y la exportación constituyen acciones
mismo módulo o haciendo uso de un archivo de
simétricas. Para que un módulo pueda importar un
cabeceras con la sintaxis: # include
tipo, procedimiento u otro elemento es preciso que
"archivoDeExportaciones.h" donde
otro lo exporte. Por supuesto, es posible que el
archivoDeExportaciones corresponde al nombre del
mismo módulo se comporte como exportador e
archivo concreto que se utilice.
importador.
Tipos de módulos
Según su uso:
5
IBM SkillsBuild | Introducción a Python
6
IBM SkillsBuild | Introducción a Python
Refinamiento y
Para un caso general, este resultado es
intuitivamente obvio. Se tarda más tiempo en
primeras estrategias de diseño descendente. En ella, compuesto por p1 y p2 es mayor que la complejidad
la arquitectura de un programa se desarrolla en total cuando se considera cada problema por
niveles sucesivos de refinamiento de los detalles separado. Se puede deducir que
procedimentales. Se desarrolla una jerarquía E(pl+p2) > E(p1) + E(p2)
descomponiendo una declaración macroscópica de
Esto indica que es más fácil resolver un problema
una función de forma sucesiva, hasta que se llega a
complejo cuando se divide en trozos más
las sentencias del lenguaje de programación.
manejables. De la desigualdad anterior se podría
información conceptualmente, pero no proporciona esfuerzo (coste) asociado a los interfaces entre los
información sobre el funcionamiento interno de la módulos también crece. Por lo tanto, debe evitarse
función o sobre la estructura interna de la tanto la modularización excesiva como que ésta
Para ilustrar este punto, consideremos la siguiente La utilización de esta técnica de diseño tiene los
disquisición, basada en observaciones sobre la siguientes objetivos básicos
resolución humana de problemas.
• Simplificación del problema y de los bloques
• Sea C(x) una función que define la resultantes de cada descomposición.
complejidad de un problema x y E(x) una
• Las diferentes partes del problema pueden
función que define el esfuerzo (en tiempo)
ser diseñadas/desarrolladas de modo
requerido para resolver un problema x. Para
independiente e incluso por diferentes
dos problemas, p1 y p2, si C(p1) > C(p2) se
personas.
deduce que E(p1) > E(p2)
7
IBM SkillsBuild | Introducción a Python
• El diseño final queda estructurado en forma El uso del ocultamiento de información como criterio
de bloques o módulos, lo que hace más de diseño para los sistemas modulares, revela sus
sencilla su implementación y posterior mayores beneficios cuando se hace necesario
mantenimiento. realizar modificaciones, durante la prueba y, más
La principal ventaja del diseño Top Down es que adelante, el mantenimiento del software. Debido a
aminora la dificultad de resolución y posterior que la mayoría de los datos y de los procedimientos
mantenimiento de los problemas de diseño. Como estarán ocultos a otras partes del software, será
desventaja asociada tenemos que, a medida que se menos probable que los errores introducidos
divide el problema en subproblemas y el número de inadvertidamente durante la modificación se
módulos crece, se produce un incremento de los propaguen a otros lugares del software.
interfaces entre estos con la consiguiente
complejidad asociada.
Independencia funcional y
Ocultación de la calidad del software
información
El concepto de independencia funcional es una
derivación directa del de modularidad y de los
El principio de ocultamiento de información conceptos de abstracción y ocultamiento de
Propuesto por Parnas sugiere que los módulos se han información.
de "caracterizar por decisiones de diseño que los
La independencia funcional se adquiere
oculten unos a otros". En otras palabras, los módulos
desarrollando módulos con "una clara" función y una
deben especificarse y diseñarse de forma que la
"aversión" a una excesiva interacción con otros
información (procedimientos y datos) contenida
módulos. Dicho de otra forma, se trata de diseñar
dentro de un módulo sea inaccesible a otros módulos
software de forma que cada módulo se centre en una
que no necesiten tal información.
subfunción específica de los requisitos y tenga una
El ocultamiento implica que para conseguir una interfaz sencilla, cuando se ve desde otras partes de
modularidad efectiva hay que definir un conjunto de la estructura del software.
módulos independientes, que se comuniquen con los
Es importante la independencia funcional en el
otros solo mediante la información que sea necesaria
desarrollo de aplicaciones informáticas porque el
para realizar la función del software. La abstracción
software con modularidad efectiva, es decir, con
ayuda a definir las entidades procedimentales (o de
módulos independientes, es fácil de desarrollar
información) que componen el software. El
porque su función puede ser partida y se simplifican
ocultamiento establece y refuerza las restricciones
los interfaces (considérense las implicaciones
de acceso a los detalles procedimentales internos de
cuando el desarrollo es realizado por un equipo). Los
un módulo y a cualquier estructura de datos
módulos independientes son más fáciles de
localmente utilizada en el módulo.
mantener (y de probar) debido a que se limitan los
efectos secundarios producidos por las
modificaciones en el diseño/código, se reduce la
propagación de errores y se fomenta la reutilización
de los módulos. Resumiendo, la independencia
funcional es la clave de un buen diseño y el diseño es
la clave de la calidad del software.
8
IBM SkillsBuild | Introducción a Python
Cohesión
Mide el grado de conexión funcional entre los
elementos (instrucciones, definición de datos,
llamadas a módulos) de un mismo módulo. Cuanto
más fuerte sea la cohesión mejor será el
mantenimiento del módulo.
9
IBM SkillsBuild | Introducción a Python
Acoplamiento
Es el grado de interdependencia entre los módulos de
un sistema. Este criterio debe minimizarse, con ello se
logra atenuar el ruido del sistema (los errores de un
módulo no se propagan a otros) y se realiza el
mantenimiento sin mirar en el interior de otros
módulos.
1
IBM SkillsBuild | Introducción a Python
Para representar la jerarquía de control se utilizan de los que se utilizan sus datos en un
muchas notaciones diferentes. La más común es un determinado módulo. Por ejemplo, un módulo
diagrama en forma de árbol denominado diagrama de que en un momento dado provoca la ejecución
estructura. de otro módulo, está conectado a ese último.
Diseño de funciones
• El grado de salida (fan out) es una medida del
número de módulos que están directamente Uno de los componentes que los lenguajes
controlados por otros módulos. estructurados incorporan son un tipo de secuencias
• El grado de entrada (fan in) indica cuántos algorítmicas individualizadas que pueden recibir o no
módulos controlan directamente a un módulo valores de entrada y que también pueden devolver o
dado. no valores de salida.
• Las relaciones de control entre los módulos se
expresan de la siguiente forma: un módulo que Se trataría de sustituir todo un conjunto de
controla a otro módulo se dice que es superior a instrucciones que puede incluir cualquier
él, e inversamente, un módulo controlado por combinación de las denominadas estructuras básicas
otro se dice que es un subordinado del (secuencial, condicional, iterativa) por un
controlador. identificador que puede incorporar la declaración de
• La jerarquía de control también representa dos valores. Posteriormente, en cualquier lugar del
características, sutilmente diferentes, de la programa se podrá invocar al conjunto de
arquitectura del software: la visibilidad y la instrucciones nominado utilizando el identificador.
conectividad.
2
IBM SkillsBuild | Introducción a Python
Sirven para definir partes de un programa mediante denomina parámetros formales y a los segundos
la asociación de un identificador. Posteriormente parámetros reales. Los parámetros reales, según los
dichas partes se pueden activar utilizando sentencias casos, pueden ser constantes, variables definidas en
diseñado de tal modo que es susceptible de ser (mezcla de constantes, variables y operadores).
• m=n
• Dados una pareja de parámetros que ocupan la
misma posición en sus respectivas listas pfi y pri
su tipo debe ser igual o, al menos, compatible.
Sin embargo, su nombre no tiene por qué ser
igual.
3
IBM SkillsBuild | Introducción a Python
• Parámetros de salida: son aquellos que se En general, todos los lenguajes suelen dividir esta
utilizan para exportar datos desde el definición en dos partes:
procedimiento. No aportan valor inicial por lo que
• Cabecera o interfaz: incluye el identificador del
son directamente inicializados por el
procedimiento usualmente precedido de una
procedimiento que les asigna valores. Así, los
palabra reservada tal que procedure, y la lista de
cambios producidos en el valor del parámetro
parámetros formales con cero o más parámetros.
formal afectarán al parámetro real que deberá
En esta lista se indica el tipo de los parámetros y
ser una variable.
su clase. Para la clase se debe emplear alguna
• Parámetros de entrada/salida: son aquellos
notación específica. Nosotros, a efectos de
cuya función incluye a las dos anteriores. Por un
explicación, utilizaremos las siguientes palabras
lado aportan valores y por otro son modificados
reservadas que precederán a los parámetros:
por el procedimiento para exportar valores. Los
o De entrada, van precedidos por la
parámetros reales tienen también que ser
palabra reservada ent.
variables.
o De salida, por la palabra sal.
o De entrada/salida, por la palabra
Paso de Parámetros entSal.
• Por valor: únicamente nos interesa el valor, no • Cuerpo: el cuerpo del procedimiento los
las modificaciones que pueda tener dentro del componen las declaraciones e instrucciones en
subalgoritmo. Se trabaja con una copia del valor las que se ejecuta el algoritmo propio del
pasado. Son parámetros unidireccionales, que procedimiento.
pasan información desde al algoritmo al
subalgoritmo. Puede ser cualquier expresión Funciones
evaluable en ese momento.
• Por referencia: se pasa una referencia a la
Son procedimientos con características peculiares: a
posición de memoria donde se encuentra dicho.
excepción de un parámetro de salida, todos los
Se utilizan tanto para recibir como para transmitir demás son de entrada. El parámetro de salida sirve
información entre el algoritmo y el subalgoritmo. para albergar el valor devuelto por la función.
Debe ser obligatoriamente una variable.
No es casual que las funciones tengan un único
parámetro de salida. De hecho, las funciones de
Definición de procedimientos salida tienen sentido como clase de subprograma
Se utilizará la sintaxis propia del lenguaje de diferente a los procedimientos en que calculan un
programación que se esté utilizando. valor, valor que se asigna al parámetro de salida y al
que desde fuera de la función se accede usando el
identificador de la propia función empleado en la
llamada. Es por ello que en la llamada a una función
el parámetro de salida no debe aparecer en la lista de
parámetros. Esta estructura, además de facilitar la
escritura de las aplicaciones, evita efectos laterales
indeseados que se pueden producir cuando se usan
parámetros de e/s típicos de los procedimientos.
4
IBM SkillsBuild | Introducción a Python
5
IBM SkillsBuild | Introducción a Python
Recursividad
• NO FINAL: El resultado obtenido de la llamada
recursiva se combina para dar lugar al resultado
de la función que realiza la llamada.
• Un objeto es recursivo si su definición requiere la
definición previa del objeto en un caso más
sencillo.
• Una función es recursiva si su resolución requiere
la solución previa de la función para casos más
sencillos.
Recursión múltiple:
• Un algoritmo A que resuelve un problema P es
recursivo si está basado directa o Si alguna llamada puede generar más de una llamada
indirectamente en sí mismo. adicional.
Recursión lineal:
• Definición del problema.
Si cada llamada recursiva genera, como mucho otra • Análisis de casos. Identificación de la función
llamada recursiva limitadora.
• Trascripción algorítmica y verificación de cada
• FINAL: si la llamada recursiva es la última
caso.
operación que se efectúa, devolviéndose como
• Validación de la inducción: la función limitadora
resultado lo que se haya obtenido de la llamada
decrece estrictamente en las llamadas.
recursiva sin modificación alguna.
6
IBM SkillsBuild | Introducción a Python
7
IBM SkillsBuild | Introducción a Python
8
IBM SkillsBuild | Introducción a Python