a) Refactoring in software design typically involves making small, iterative changes to improve the overall quality of the code, without altering its external behavior. It is often done to improve the design of a system or to make it easier to understand and maintain. While refactoring may involve modifying entire sections of code, it does not necessarily mean that the entire design is being modified iteratively.
b) The four elements of a design model are abstraction, encapsulation, modularity, and hierarchy.
Abstraction refers to the process of identifying and focusing on the essential characteristics of a system or component, while ignoring the irrelevant details.
Encapsulation involves grouping related data and behavior into a single unit, or module, and hiding the implementation details from the rest of the system.
Modularity is the practice of dividing a system into smaller, independent components that can be developed and tested separately, and then combined to create the final product.
Hierarchy refers to the organization of a system or component into a hierarchical structure of subsystems, each of which has a well-defined role and interacts with other subsystems in a well-defined way.
a. Refactorizar no significa que se modifique todo el diseño de manera iterativa. La refactorización se refiere al proceso de mejorar la estructura y organización del diseño de un sistema de software sin cambiar su comportamiento externo. Esta se realiza para mejorar la calidad, la eficiencia y la facilidad de mantenimiento del sistema de software. Durante la refactorización del diseño, se pueden aplicar técnicas como la simplificación de la arquitectura, la mejora de la modularidad, la identificación y eliminación de duplicados, la mejora de la cohesión y el acoplamiento, y la mejora de la legibilidad y la organización del código. Puede ser una tarea compleja que requiere un conocimiento profundo del sistema de software y de las mejores prácticas de diseño. A menudo, se realiza en ciclos iterativos, donde se realizan pequeñas mejoras en el diseño en cada ciclo. Esto permite a los diseñadores de software centrarse en un aspecto del diseño a la vez, sin hacer cambios grandes y arriesgados de una sola vez.
b. Los cuatro elementos de un modelo de diseño son conceptos esenciales en el diseño de software que ayudan a lograr la mantenibilidad, escalabilidad y reutilización del sistema de software. Cada elemento tiene técnicas y prácticas específicas asociadas con él, y su uso efectivo puede conducir a un software de alta calidad que sea fácil de entender, modificar y mantener.
Abstracción: La abstracción es una técnica utilizada para identificar y centrarse en los aspectos esenciales de un sistema, ignorando detalles irrelevantes o innecesarios. Ayuda a comprender la estructura y el comportamiento del sistema al descomponerlo en sus componentes esenciales. La abstracción se utiliza en varias áreas del diseño de software, como la programación orientada a objetos, donde se utiliza para identificar clases y sus relaciones.
Encapsulamiento: El encapsulamiento es una técnica utilizada para ocultar los detalles internos de un componente del mundo exterior y exponer solo una interfaz simplificada para interactuar con él. Ayuda a lograr la modularidad y proteger el componente de cambios no deseados que podrían romper su funcionalidad. El encapsulamiento es un concepto crucial en la programación orientada a objetos, donde los objetos encapsulan sus datos y comportamiento.
Modularización: La modularización es el proceso de descomponer un sistema en partes más pequeñas y manejables o módulos. Cada módulo tiene una función o responsabilidad específica y se comunica con otros módulos a través de una interfaz bien definida. La modularización ayuda a lograr la mantenibilidad, reutilización y escalabilidad del sistema. Se utiliza ampliamente en el diseño y desarrollo de software para manejar la complejidad y mejorar la calidad del software.
Jerarquía: La jerarquía es una forma de organizar los módulos de un sistema en una estructura jerárquica que describe sus relaciones. Los módulos en los niveles más bajos proporcionan servicios a los módulos en los niveles más altos, y los módulos en los niveles más altos dependen de los servicios proporcionados por los módulos de niveles inferiores. La jerarquía ayuda a lograr una mejor comprensión de la estructura y el comportamiento del sistema y se utiliza en diversas áreas del diseño de software, como la arquitectura de redes, el diseño de bases de datos y la ingeniería de software.
El objetivo de la refactorización es simplificar el diseño sin cambiar su comportamiento externo, lo que resulta en software que es más fácil de integrar, probar y mantener, esta se realiza típicamente en pequeños pasos incrementales, con cada paso mejorando la calidad del diseño o código, lo cual no significa que haya que cambiar todo el diseño de forma iterativa, sino solo aquellas partes que tengan redundancia, o elementos de diseño no utilizados, algoritmos ineficientes o innecesarios, estructuras de datos mal construidas o inapropiadas, o cualquier otra falla de diseño que se pueda corregir para obtener un mejor diseño
El modelo de diseño de software es equivalente a los planos del arquitecto para una casa. Comienza representando la totalidad de lo que se va a construir (por ejemplo, una representación tridimensional de la casa) y se perfecciona lentamente para proporcionar orientación para construir cada detalle (por ejemplo, la distribución de la fontanería). De manera similar, el modelo de diseño creado para el software proporciona una variedad de vistas diferentes del sistema.
Se plantean además 4 tipos de elementos del modelo de diseño, que podemos agrupar en: Elementos de arquitectura, elementos de interfaz, elementos a nivel de componente, elementos a nivel de implementación.(Architecture elements, Interface elements, Component-level elements, Deployment-level elements)