Capítulo 4: Descomposición


Como una forma de ilustrar más el poder que viene con poder definir nuevas funciones, es útil que Karel haga algo un poco más práctico que moverse a cono de un lugar a otro. Las carreteras a menudo parecen necesitar reparación, y podría ser divertido ver si Karel puede llenar los baches en su mundo abstracto. Por ejemplo, imagina que Karel está parado en el "camino" que se muestra en la figura de la izquierda, una esquina a la izquierda de un bache en el camino. El trabajo de Karel es llenar el agujero con un cono y pasar a la siguiente esquina. El diagrama de la derecha ilustra cómo debería verse el mundo después de la ejecución del programa.

Antes de:
Después:

Si está limitado a los cuatro comandos predefinidos, el main() La función para resolver este problema se vería así:

def main():
moverse()
girar_izquierda()
girar_izquierda()
girar_izquierda()
moverse()
poner_cono()
girar_izquierda()
girar_izquierda()
moverse()
girar_izquierda()
girar_izquierda()
girar_izquierda()
moverse()

La motivación inicial para definir el girar_derecha() función era que era engorroso seguir repitiendo tres girar_izquierda() comandos para realizar un giro a la derecha. La definición de nuevas funciones tiene otro propósito importante más allá de permitirle evitar repetir las mismas secuencias de comandos cada vez que desee realizar una tarea en particular. El poder para definir funciones desbloquea la estrategia más importante en la programación: el proceso de dividir un gran problema en partes más pequeñas que son más fáciles de resolver. El proceso de dividir un programa en partes más pequeñas se llama descomposición , y los componentes de un gran problema se denominan subproblemas .

Como ejemplo, el problema de rellenar el agujero en la carretera se puede descomponer en los siguientes subproblemas:

  1. Subir al hoyo
  2. Llene el agujero dejando caer un cono en él
  3. Pasa a la siguiente esquina

Si piensa en el problema de esta manera, puede usar definiciones de funciones para crear un programa que refleje su concepción de la estructura del programa. La función main se vería así:

def main():
moverse()
llenar_baches()
moverse()

La correspondencia con el esquema es inmediatamente clara, y todo sería genial si solo pudiera lograr que Karel entendiera lo que quiere decir con llenar_baches() . Dado el poder de definir funciones, implementar llenar_baches() es extremadamente simple. Todo lo que tienes que hacer es definir un llenar_baches() función cuyo cuerpo consta de los comandos que ya ha escrito para hacer el trabajo, así:

def llenar_baches():
girar_derecha()
moverse()
poner_cono()
media_vuelta()
moverse()
girar_derecha()

Aquí está el programa completo. Observe cómo puede comprender la intención del programador simplemente leyendo el main() función. Cuando run el programa, la línea resaltada muestra cómo lo ejecutará una computadora, paso a paso. Sin embargo, debido a que el programa está muy bien desglosado, podemos entenderlo a nivel de pensamiento humano:


Siguiente capítulo