Saltar al contenido
Introducción a la Programación Sistemática – Locales y Abstracción (Semana 7)

Introducción a la Programación Sistemática – Locales y Abstracción (Semana 7)

En la semana 7 se introdujeron los conceptos de expresiones locales y abstractas. Como parece ser mi caso, esta semana fue la mitad de un repaso de otros cursos que fue agradable y refrescante, y luego BAM, un nuevo concepto que me descolocó por completo.

9min read

En la semana 7 se introdujeron los conceptos de expresiones locales y abstractas. Como parece ser mi caso, esta semana fue la mitad de un repaso de otros cursos que fue agradable y refrescante, y luego BAM, un nuevo concepto que me descolocó por completo.

No me quejo de esto per se, porque creo que es una excelente manera de agregar cosas a mi caja de herramientas conceptuales (revisando cosas viejas y luego agregando algo nuevo), pero *es* un poco como una montaña rusa.

Lección 1: Introducción a las expresiones locales

¡El primer elemento emocionante de esta semana es otra actualización de idioma! Ahora nos estamos moviendo hacia el Idioma del Estudiante Intermedio. Puntuación.

En cuanto a las expresiones locales, aprendemos en esta lección introductoria que las expresiones locales son expresiones que tienen funciones y constantes que solo funcionan en una parte de un programa. Eso es todo lo que tenemos aquí. Más sobre esto más adelante...

Lección 2: Expresiones Locales – Formación e Intuición

Actualizar nuestras vidas al Idioma Estudiantil Intermedio nos da la capacidad de utilizar expresiones locales, como se define vagamente en la lección 1. Básicamente, las expresiones locales son expresiones pequeñas y empaquetadas con sus propias funciones y variables que no pueden interactuar con el resto del programa, fuera de su contenedor local. Esta es la anatomía de un local:

En este ejemplo, ambas "definiciones" son definiciones para variables que solo existirán dentro de este contenedor local, lo que significa que si se hace referencia a "a" en el nivel superior del programa, es decir, fuera de este local, lo que sea que hagamos con a dentro de este local NO IMPORTA a las otras instancias de "a". ¿Por qué? Porque si se usa "a" en un local, SOLO existe dentro de ese local y no tiene interacción con ninguna otra "a" que pueda estar dentro del programa. Esto significa que también puedes usar "a" en todos tus locales, y no pasará nada entre ellos, siempre y cuando estructures tu local correctamente.

Lección 3: Expresiones Locales – Alcance Léxico

Los contornos de ámbito responden a sus preguntas sobre dónde puede acceder a las definiciones locales. El ámbito léxico establece, esencialmente, que se utiliza la definición de una función o variable que se encuentra dentro del área de contorno más interna donde se está evaluando la expresión.

Lección 4: Expresiones Locales – Reglas de Evaluación

Como se mencionó anteriormente, los locales son expresiones, no afectan las cosas fuera de su ámbito. ¡Estos son los pasos para la evaluación!

  1. Cambio de nombre: tome las definiciones en el local, encuentre todas las referencias a ellas, invente nuevos nombres únicos a nivel mundial para ellos y reemplace todas las instancias del nombre anterior con este nuevo y único.
  2. Elevación: mueva las definiciones renombradas al nivel superior.
  3. Reemplazar: reemplace todo el local solo con su cuerpo, con las definiciones renombradas.

Es interesante notar que al evaluar tu expresión local de esta manera, en realidad estás eliminando su existencia como local, y por lo tanto, tu programa teóricamente podría haber sido escrito en el Idioma Básico del Estudiante.

Lección 5: Expresiones Locales – Encapsulación

La encapsulación consiste en tomar cada parte de un programa y convertirla en un pequeño paquete que solo interactúa con unos pocos elementos pequeños en el nivel superior. Esencialmente, está haciendo funciones individuales con locales dentro de ellas. Al encapsular una función, es importante recordar que ya no se puede acceder a ella globalmente. SIN EMBARGO, esto también significa que, al ser una función encapsulada, no tienes que escribir firmas y pruebas, lo que acabará ahorrándote mucho tiempo. PERO, es posible que aún desee probarlos, ¡así que no se olvide de hacerlo!

¿Cómo se puede saber si una función es una buena candidata para la encapsulación? POZO....

  • ¿Existe como una función con ayudantes estrechamente vinculados?
  • ¿El programa externo REALMENTE solo necesita llamar a la función principal, no a los ayudantes?

Si has respondido afirmativamente a ambas preguntas, es probable que estés ante un gran candidato para la encapsulación.

How do you encapsulate a function?

  1. Agrupe todas las funciones que desee encapsular.
  2. Abra la definición con un nuevo nombre de función global y los parámetros necesarios.
  3. Abra una expresión local y, a continuación, la parte de definición de la función local con [, justo antes de la definición de la función original.
  4. Cierre la parte de definición con un ] después de la definición de la función original.
  5. Agregue una llamada de trampolín de la función, definida en el local, al final.
  6. Elimine pruebas, firmas y códigos auxiliares innecesarios.
  7. Cambiar el nombre de las pruebas y los códigos auxiliares necesarios
  8. RUN FREE! YOU GOT IT!

También es importante tener en cuenta que puede tener encapsulación en sus plantillas, pero tenga en cuenta que si lo hace, no permitirá su capacidad para probar un caso base.

Notas adicionales de esta lección:

Otro tema que se trata en esta lección es la refactorización, que es un cambio estructural en un programa que NO cambia el comportamiento del programa. Sin embargo, puede refactorizar algo y TAMBIÉN cambiar su comportamiento, pero no se recomienda hacer ambos cambios al mismo tiempo (¡es más fácil cometer errores tratando de hacer demasiado a la vez!).

Lección 6: Expresiones locales: evitar la repetición del cálculo

FINALMENTE, estamos llegando al concepto de eficiencia del código en esta clase. Esta lección comienza con la idea de que debes preocuparte por la eficiencia del código DESPUÉS de que tu programa funcione. En cierto modo estoy de acuerdo con esto, sobre todo para los principiantes, pero también estoy un poco en desacuerdo. Creo que la eficiencia del código debe estar arraigada desde el principio de tu carrera de codificación, para que se convierta en una forma natural de pensar, en lugar de una ocurrencia tardía. Dicho esto, esta lección se centra en eliminar el crecimiento exponencial. Esencialmente, la solución aquí es muy situacional, así que no quiero entrar demasiado en ella. Sin embargo, la conclusión es que cuando se trabaja con árboles de arity, si se puede localizar la búsqueda, el código será más sucinto y eficiente. J

Lección 7: Introducción a la abstracción

La abstracción, en programación, es la forma de gestionar la complejidad en tu programa. #IAbstractedThatLessonForYou

Lección 8: Abstracción de Ejemplos, Parte 1

Cuando se realiza una abstracción, es necesario extraer las partes comunes de las funciones en funciones abstractas. (Nota: las diferentes porciones se denominan "puntos de varianza").

En una función, se le cambia el nombre a más general, se coloca un parámetro para representar el punto de variación y se reemplaza el punto de variación con el parámetro que se ha cambiado el nombre (¡recuerde pasar también el parámetro en las recursividades!).

¿Por qué querrías abstraer funciones?

¡POZO!

Una función de orden superior puede consumir más de una función. También puede producir una función.

Así que, acostúmbrate. Es mejor. Prometer.

Lección 9: Abstracción de Ejemplos, Parte 2

La Lección 9 funciona principalmente a través de un ejemplo continuo de la Lección 8, así que voy a operar como de costumbre y me desharé del repaso del ejemplo y les daré las conclusiones importantes:

  1. Las funciones pueden consumir otras funciones como argumentos.
  2. La abstracción existe y funciona en la mayoría de los lenguajes de programación.
  3. En el caso de las abstracciones, las declaraciones de propósito son muy difíciles de escribir, así que empieza a practicar.

Lección 10: Abstracción de Ejemplos, Parte 3

Escribir la firma es lo último cuando se hace una abstracción, porque es incluso más difícil que escribir una declaración de propósito. He aquí un consejo sobre cómo resolverlo: ¡Usa la inferencia de tipos! La inferencia de tipos es más o menos así:

  1. Encuentra lo más básico que produce una función, que se convierte en el resultado de la firma.
  2. Busque los argumentos que se pasan o son obligatorios. Esos son los tipos de argumentos para la firma.

Suena fácil, pero están sucediendo tantas cosas con la abstracción que puede ser bastante desconcertante. No te desanimes, solo trata de concentrarte en simplificar lo que estás trabajando, como lo haces con toda la teoría de la receta de diseño, y estarás bien.

Notas adicionales de esta lección:

  1. Cuando se pasa una función como argumento, escriba su firma en () en la firma más grande.
  2. Las listas se pueden escribir de forma alternativa. Ahora puede usar (listof X) en lugar de ListOfX

Lección 11: Uso de funciones abstractas integradas

Mapa y Filtro son dos de las funciones abstractas integradas más utilizadas, y la página de idioma en el curso de Coursera enumera todas ellas. (Si no estás tomando la clase de Coursera, aquí tienes un enlace externo que puedes consultar con la misma información: Funciones abstractas incorporadas de BSL).

Los resúmenes incorporados son bastante dulces, y la realidad es que, si se trata de una sensación bastante genérica, confíe en su iniciativa y consulte la lista, ¡probablemente sea incorporada!

Lesson 12: Closures

A veces, la función que está pasando como argumento a una función abstracta aún no existe.... Si este es el caso, siempre puedes definirlo con un local.

HOWEVER

En algunos casos, no tienes otra opción. DEBES detenerte y definirlo.

¿Cuándo es eso?

Cuando el cuerpo de una función que desea pasar a una función abstracta se refiere a un parámetro en la función externa. Por lo tanto, la definición de la función externa se cierra ALREDEDOR de la interna, convirtiéndola en un cierre. (¿Recuerdas ese alcance léxico? ¡SÍ!)

Lección 13: Funciones de plegado abstracto

Esta lección ofrece una visión general rápida sobre cómo pasar directamente de las plantillas a las funciones abstractas, eliminando literalmente toda la sustancia pegajosa del medio, optimizando tu tiempo escribiendo tu código. YAY. En resumen, una función de plegado es una función abstracta basada directamente en la plantilla.

Week 7 Summary

Como mencioné al principio, esta lección fue muuuy loca en la segunda mitad, porque gran parte de ella era nueva para mí. Si tienes algún consejo o truco relacionado con las funciones abstractas, ¡házmelo saber! ¡Además! La semana 8 es la última semana de clase, por lo que el próximo blog será el último de la serie. Pero no os preocupéis, tengo muchos planes para las próximas entradas.

Solicitar una demostración