Clase 6 - Codificación Flashcards
¿Qué es la programación estructurada? ¿Para qué fue creada?
¿Qué es?
La programación estructurada es un principio que busca simplificar la estructura de los programas de manera que sea más fácil razonar sobre ellos. Un programa tiene dos tipos de estructuras, en **las cuales, en cada uno se define un para las orden de las sentencias:
- ********Estructura estática:******** orden de las sentencias dentro del código.
- Estructura dinámica: orden en el cual las sentencias se ejecutan.
Para mostrar que un programa es ****correcto**** debemos mostrar que ************el comportamiento dinámico************ del programa ************************es el esperado. Sin embargo, para esto debemos razonar sobre la estructura estática que tiene dicho programa.
Entonces, la programación estructurada propone como ****objetivo****** construir programas cuya estructura dinámica sea la misma (o similar) que su estructura estática.
<aside>
✅ La programación estructurada **********************simplifica********************** el flujo de control, facilitando la **************comprensión************** de los programas, y el razonamiento.
</aside>
****¿Para qué se creo?******
La programación estructurada surge en contra del uso indiscriminado de constructores de control (como los GO TO
).
¿Qué es el principio de ocultamiento de información? ¿Para que sirve?
**¿Qué es?****
Consiste en ocultar la información presente en las estructuras de datos sobre las que los programas trabajan para realizar determinadas funciones, de manera que ******solo queden expuestas****** las funciones de acceso que son las únicas que podrán usar los programas para acceder a los datos ya sea para modificarlos o para obtenerlos.
****¿Para que sirve?****
**Reduce** el **acoplamiento****.
¿En qué consiste el proceso de codificación incremental?
- Se toma un módulo que haya sido especificado.
- Se escribe el código correspondiente a alguna de las funcionalidades que fueron especificadas en el módulo.
- Se hace un el **script** para testear la funcionalidad.
- Se ejecuta el **script** del test y en el caso que existan errores, se corrigen (**fixean**)
- Si hay errores, se vuelve a ejecutar el script.
- Si no hay errores, se pasa al paso 5.
- Se verifica que el código cubra toda la especificación de la funcionalidad planteada en el módulo.
- Si no lo cumple, se vuelve a escribir el código para cumplirla.
- Si lo cumple, se puede avanzar.
¿En qué consiste el proceso de desarrollo dirigido por test?
En el ******Test Driven Development* se realiza primero los **scripts** para los tests y luego el código que pasará los test planteados.
- Se toma la especificación de un módulo.
- Se escriben los **scripts** de ****un test para alguna funcionalidad de ese módulo.
- Se escribe un código con el objetivo de pasar los test planteados y se ejecuta los mismos sobre el código realizado.
- En el caso de encontrar errores, se corrigen y se vuelven a ejecutar los test.
- En caso contrario, se pasa al paso 4.
- Se verifica si el código necesita mejoras.
- En caso de necesitarlas, se hacen y se vuelven a correr los test.
- Cuando no se necesiten más mejoras, se pasa al paso 5.
- Se verifica que toda la especificación de la funcionalidad fue cubierta por el código.
- En caso de que no, se vuelve a escribir o a añadir más test para que lo haga.
- En caso de que sí, terminamos.
¿En qué consiste el proceso de programación de a pares?
Es una técnica de desarrollo de software en la que dos programadores trabajan juntos para crear código. Uno de ellos es el que escribirá el código mientras el otro observa activamente el código creado y le provee **feedback**** al que escribe, estos roles es importante que se alternen así ambos pueden escribir código.
Conjuntamente los programadores, diseñan los algoritmos, estructuras de datos, estrategias y soluciones para los problemas que surgen durante el desarrollo.
<aside>
🚫 La efectividad de este método no es sabida.
</aside>
¿Qué es y para que sirve la refactorización de código?
¿Qué es?
La refactorización es una técnica que forma parte de la codificación, cuyo propósito es: mejorar el diseño interno del código existente que ya está funcionando sin cambiar su comportamiento externo, con el fin de simplificarlo y mejorar su comprensión.
¿Para que sirve?
Con el tiempo, la calidad y la productividad del desarrollo de un software, empieza a decaer. Sin embargo, la refactorización soluciona este problema y además permite que con el tiempo el diseño del software mejore.
Además, una refactorización hace que el código sea más fácil de entender y más barato de modificar.
En conclusión, el objetivo de la refactorización es mejorar el diseño plasmado en el código.
La refactorización intenta uno o más de los siguientes items:
- Reducir acoplamiento.
- Incrementar cohesión.
- Mejorar respuesta al principio de abierto-cerrado.
El principal riesgo de realizar una mejora en el código, es que se puede “romper” la funcionalidad existente. Lo mejor, es disminuir esta posibilidad usando:
- Refactorización en pequeños pasos, dado a que permite identificar errores más fácilmente.
- Disponer de scripts para test automatizados, ya que facilita la verificación de que se mantenga el comportamiento externo.
<aside>
✅ El costo extra de la refactorización se recupera en la reducción del costo en los cambios.
</aside>
¿Cuales son los tipos más comunes de refactorización?
Muchas formas de mejorar el diseño de programas. Siempre con el objetivo de mejorar acoplamiento, cohesión, y el principio de abierto-cerrado.
****Extracción de métodos******
Objetivo: separar un método demasiado largo, en métodos cortos cuya signatura indique lo que el método hace.
Se realiza cuando tenemos un método demasiado largo o un método que retorna un valor y además, cambia el estado de un objeto (en el último caso es preferente dividir el método en dos). En el proceso:
- Variables referenciadas entre estas partes se declaran como parámetros.
- Variable declaradas declaradas en una parte y usadas en otra, deben definirse en el método que se usan.
**Agregar o eliminar parámetros****
Se realiza para simplificar las interfaces.
- Se deben agregar parámetros sólo si los existentes no proveen la información necesaria
- Se deben eliminar parámetros que se agregaron “por las dudas” pero que no se utilizan.
******Desplazamiento de métodos******
Objetivo: mover un método que interactúa demasiado con los objetos de una clase, a esa otra clase.
- En este pasaje, puede ser conveniente dejar un método en la clase inicial para que delegue al nuevo (debería desaparecer).
******Desplazamiento de atributos********
Objetivo: mover un atributo que se use más en otra clase que en la cual está declarado, a esa otra clase.
- Mejora cohesión y acoplamiento.
****Extracción de clases****
****Objetivo:**** separar en clases distintas una clase que agrupa demasiados conceptos.
- Mejora la cohesión.
**Reemplazar valores de datos por objetos****
****Objetivo:**** separar una colección de atributos que conforma una entidad lógica en una clase aparte y definir objetos para accederlos.
Reemplazar condicionales con polimorfismos
****Objetivo:****** explotar el poder de la orientación a objetos.
Se realiza cuando el comportamiento depende de un indicador de tipo, en ese caso, se reemplaza el análisis de casos a través de una jerarquía de clases apropiada.
Subir métodos y atributos
****Objetivo:**** unificar métodos o atributos comunes presenten en subclases, en la superclase de estas.