Temario ED
Temario ED
Temario ED
Proceso que implica la creación, diseño, implementación, prueba y mantenimiento de programas informáticos y sistemas.
Se puede dividir en varias etapas y sigue prácticas y metodologías específicas para garantizar la calidad y eficiencia del
software.
Concepto software conjunto de instrucciones lógicas y directivas que una computadora sigue para realizar una tarea o
función específica. Están escritos en lenguajes de programación y pueden variar en complejidad
Código Fuente:
● Definición: conjunto de instrucciones escritas en un lenguaje de programación específico
● Formato: Java, C++, Python, etc
● Ejemplo: En Java, extensión .java.
Código Objeto:
● Definición: resultado de la compilación del código fuente. representación intermedia del programa,no es
ejecutable directamente
● Formato: código intermedio (bytecode en Java) o de máquina (instrucciones específicas de la arquitectura
de la máquina).
● Ejemplo: En Java, el código objeto es el bytecode compilado extensión .class.
Código Ejecutable:
● Definición: puede ser ejecutado por la máquina. resultado de la compilación y enlace de códigos fuente y
objeto.
● Formato: SO Windows, puede ser un archivo .exe, en Linux un binario ejecutable, etc.
● Ejemplo: En Java, después de compilar y vincular, el código ejecutable podría ser el archivo .jar (archivo de
Java) o el código de máquina nativo generado en tiempo de ejecución por la máquina virtual Java (JVM).
Máquinas Virtuales:
● Definición: Una máquina virtual es un software que simula el comportamiento de una máquina física y
permite la ejecución de programas escritos para esa máquina virtual.
● Propósito: Proporciona portabilidad al permitir que el mismo código fuente sea ejecutado en diferentes
sistemas operativos y arquitecturas de hardware.
● Ejemplo: En Java, la Máquina Virtual de Java (JVM) ejecuta el bytecode generado por el compilador Java.
En .NET, el Common Language Runtime (CLR) ejecuta programas escritos para el Common Intermediate
Language (CIL).
● Lenguaje de Máquina:
o Compuesto por instrucciones directamente ejecutables por la CPU. Representa el nivel más bajo de
abstracción.
● Ensamblador:
o Utiliza mnemónicos y abreviaturas para representar las instrucciones de máquina. Proporciona un nivel de
abstracción más alto que el lenguaje de máquina.
● C#:
o Combina características de lenguajes de bajo y alto nivel. Desarrollado por Microsoft.
● Portabilidad: Diseñado para ser independiente de la plataforma, lo que significa que el código Java puede
ejecutarse en diferentes sistemas operativos sin modificaciones.
● Orientado a Objetos: Se basa en un paradigma de programación orientado a objetos, facilitando la organización y
estructuración del código.
2. Python:
● Sintaxis Clara y Concisa: Su sintaxis es legible y fácil de aprender, lo que facilita la escritura de código rápido y
eficiente.
● Diversidad de Aplicaciones: Utilizado en desarrollo web, ciencia de datos, inteligencia artificial, automatización,
entre otros.
3. JavaScript:
● Lenguaje de Script del Lado del Cliente: Utilizado principalmente para desarrollo web y ejecutado en el navegador
del cliente.
● Asincronía: Soporta operaciones asíncronas, lo que es crucial para el desarrollo web interactivo.
4. C++:
● Eficiencia de Bajo Nivel: Combina características de bajo y alto nivel, permitiendo un control cercano del hardware
mientras ofrece abstracciones de alto nivel.
● Orientado a Objetos: Soporta programación orientada a objetos, lo que facilita la creación y manipulación de
objetos.
5. C#:
● Diseñado para la Plataforma .NET: Integra estrechamente con el entorno .NET de Microsoft y se utiliza
principalmente para desarrollo de aplicaciones Windows y web.
● Orientado a Objetos: Proporciona un enfoque orientado a objetos similar a Java.
6. PHP:
● Lenguaje del Lado del Servidor: Diseñado específicamente para el desarrollo web del lado del servidor.
● Integración con Bases de Datos: Ofrece integración fácil con bases de datos, como MySQL.
7. Ruby:
● Filosofía de la Convención sobre la Configuración: Se adhiere al principio de que las convenciones predefinidas son
preferibles a la configuración manual.
● Sintaxis Elegante: Con un enfoque en la legibilidad y la simplicidad, Ruby tiene una sintaxis elegante.
● La aplicación se construye como una sola unidad. Todos los componentes están interconectados y desplegados
juntos.
● Es fácil de entender y desarrollar, pero puede volverse difícil de mantener a medida que la aplicación crece.
2. Arquitectura de Microservicios:
● Divide la aplicación en servicios independientes y distribuibles. Cada servicio es autónomo y puede comunicarse
con otros a través de API.
● Favorece la escalabilidad y la independencia de desarrollo, pero introduce la complejidad de gestionar múltiples
servicios.
● Los servicios son componentes independientes que se comunican a través de mensajes. Cada servicio realiza una
función específica.
● Favorece la reutilización y la flexibilidad, pero también puede ser compleja de gestionar.
● La lógica de la aplicación se ejecuta en entornos sin servidor. Los desarrolladores se centran en el código, mientras
que la infraestructura es gestionada por el proveedor de servicios en la nube.
● Facilita la escalabilidad automática, pero puede tener limitaciones en términos de tiempo de ejecución y
dependencias.
5. Arquitectura de Capas:
● Organiza la aplicación en capas lógicas, como la capa de presentación, la capa de lógica de negocio y la capa de
acceso a datos (Patron Model View Controller).
● Facilita la modularidad y el mantenimiento, pero puede introducir dependencias entre capas.
● Divide la aplicación en núcleo (dominio) y adaptadores (interfaz de usuario, bases de datos). Los adaptadores se
conectan al núcleo a través de puertos.
● Promueve la independencia de la interfaz de usuario y las tecnologías de persistencia.
-Patrones Diseño.
Los patrones de diseño son soluciones probadas para problemas de diseño comunes. Algunos patrones
importantes incluyen:
1. Patrón Singleton:
● Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a ella.
2. Patrón Factory:
● Define una interfaz para crear objetos, pero permite a las subclases alterar el tipo de objetos que se crearán.
3. Patrón Observer:
● Define una dependencia uno a muchos entre objetos, de modo que cuando un objeto cambia su estado, todos sus
dependientes son notificados y actualizados automáticamente.
4. Patrón Strategy:
● Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el cliente
elija el algoritmo apropiado en tiempo de ejecución.
5. Patrón Decorator:
● Añade nuevas funcionalidades a un objeto existente sin alterar su estructura. Utiliza la composición en lugar de la
herencia.
● Divide una aplicación en tres componentes principales: el Modelo (lógica y datos), la Vista (interfaz de usuario) y el
Controlador (manejo de eventos y lógica).
● Permite pasar solicitudes a lo largo de una cadena de manejadores. Cada manejador decide si procesa la solicitud o
la pasa al siguiente en la cadena.
8. Patrón Command:
● Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con operaciones, encolar solicitudes y
soportar operaciones que pueden deshacerse.
Estos son solo algunos ejemplos de patrones de diseño comunes. La elección de la arquitectura y los patrones de
diseño dependerá de los requisitos específicos del proyecto y las necesidades del desarrollo.
● Utilizando el compilador de Java (javac), el código fuente (.java) se compila en archivos de bytecode (.class). Este
bytecode es ejecutable en la máquina virtual Java (JVM).
bash
javac MiPrograma.java
Esto generará el archivo MiPrograma.class.
3. Empaquetado (Opcional):
● Si la aplicación es compleja y consta de varios archivos de clase, se puede empaquetar en un archivo JAR (Java
Archive) para facilitar la distribución y ejecución.
bash
jar cvf MiPrograma.jar MiPrograma.class
Esto creará un archivo JAR llamado MiPrograma.jar que puede ejecutarse en una JVM.
● El código bytecode generado se ejecuta en la Máquina Virtual Java (JVM). Para ejecutar la aplicación, se utiliza el
comando java seguido del nombre de la clase principal (que contiene el método main).
bash
java MiPrograma
Esto inicia la JVM y ejecuta la aplicación Java.
5. Pruebas y Depuración:
● Antes de distribuir la aplicación, es fundamental realizar pruebas y depuración para garantizar su correcto
funcionamiento.
● Se puede utilizar Javadoc para generar documentación a partir del código fuente Java, facilitando la comprensión y
el mantenimiento.
bash
javadoc -d docs MiPrograma.java
Esto creará documentación en el directorio docs.
Este es un resumen básico del proceso. Es importante señalar que la máquina virtual Java (JVM) es esencial para
la ejecución de aplicaciones Java y proporciona portabilidad, ya que permite que el mismo código bytecode se
ejecute en diferentes plataformas que tienen una JVM compatible.
1. Editor de Código:
o Proporciona un editor de texto avanzado con funciones como resaltado de sintaxis,
autocompletado y formato de código.
o Facilita la escritura y edición de código fuente.
2. Compilación y Construcción:
o Permite compilar y construir proyectos de software.
o Proporciona herramientas para gestionar dependencias y generar ejecutables.
3. Depuración:
o Ofrece herramientas de depuración para detectar y corregir errores en el código.
o Permite establecer puntos de interrupción, inspeccionar variables y seguir la ejecución del
programa paso a paso.
4. Gestión de Proyectos:
o Facilita la creación, apertura y gestión de proyectos de software.
o Proporciona herramientas para organizar y gestionar archivos y recursos.
5. Control de Versiones:
o Integración con sistemas de control de versiones como Git, SVN, etc.
o Permite realizar operaciones como commit, push, pull y fusionar ramas.
6. Navegador Integrado:
o Proporciona un explorador de archivos y una interfaz para navegar por la estructura del proyecto.
o Facilita la búsqueda y apertura de archivos.
7. Herramientas de Refactorización:
o Ofrece funciones de refactorización para mejorar la estructura del código sin cambiar su
comportamiento.
o Ejemplos incluyen la extracción de métodos, renombrar variables, etc.
8. Integración de Pruebas:
o Facilita la ejecución de pruebas unitarias y la integración con marcos de pruebas.
o Proporciona informes de resultados de pruebas.
9. Autocompletado y Ayuda Contextual:
o Ofrece sugerencias automáticas de código mientras se escribe.
o Proporciona información contextual y documentación sobre funciones y clases.
10. Generación de Documentación:
o Facilita la generación de documentación del código fuente.
o Puede integrarse con herramientas de generación de documentación como Javadoc.
11. Soporte para Lenguajes y Frameworks Específicos:
o Ofrece soporte específico para diferentes lenguajes de programación y frameworks.
o Puede incluir integración con herramientas específicas del ecosistema de desarrollo.
12. Personalización y Extensiones:
o Permite la personalización del entorno según las preferencias del programador.
o Ofrece soporte para la instalación de extensiones y complementos.
3. En la ventana de Eclipse Marketplace, puedes buscar y seleccionar los plugins que deseas instalar.
5. Busca el plugin que deseas instalar, y haz clic en el botón "Go to the full listing" para obtener más
información.
6. Haz clic en "Install" para iniciar el proceso de instalación.
3. En la ventana de Eclipse Marketplace, busca y anota el nombre del plugin que deseas instalar.
5. En la ventana "Available Software", haz clic en el enlace "Add..." para agregar un nuevo repositorio de
software.
6. Ingresa un nombre para el repositorio y en la dirección, coloca la URL del sitio del plugin o del repositorio.
7. Haz clic en "OK" y espera a que Eclipse cargue el contenido del nuevo repositorio.
Recuerda que algunos plugins pueden tener dependencias específicas o requerir versiones específicas de Eclipse,
así que asegúrate de leer la documentación del plugin antes de intentar la instalación.
1. Abre Eclipse.
2. Ve a File > New > Java Project.
3. Ingresa un nombre para tu proyecto, por ejemplo, "MiPrimerProyectoJava".
4. Haz clic en "Finish" para crear el proyecto.
1. En la ventana "Package Explorer" de Eclipse, haz clic derecho en la carpeta "src" dentro de tu proyecto.
2. Selecciona New > Class.
3. Ingresa un nombre para tu clase, por ejemplo, "MiClaseJava".
4. Marca la opción "public static void main(String[] args)" para agregar el método main.
5. Haz clic en "Finish" para crear la clase.
● Generación de ejecutables.
En Eclipse, no generas un ejecutable directamente como lo harías con algunos lenguajes compilados, como C o
C++. En Java, el código fuente se compila en archivos de bytecode, que se ejecutan en la máquina virtual Java
(JVM). Sin embargo, puedes exportar tu proyecto Java en un formato que pueda ser ejecutado de manera
independiente en una máquina que tenga instalada la JVM. A continuación, te explico cómo hacerlo:
Después de completar estos pasos, tendrás un archivo JAR ejecutable que puede ser ejecutado en cualquier
máquina con la JVM instalada. Puedes ejecutar el JAR desde la línea de comandos usando el comando java -jar
TuArchivo.jar.
Recuerda que para que tu aplicación sea verdaderamente portátil, cualquier biblioteca externa que estés
utilizando debe estar disponible en la máquina de destino. Además, es posible que debas proporcionar
instrucciones adicionales para ejecutar tu aplicación según la configuración específica de tu proyecto.
● Determinar los tipos de pruebas necesarios (pruebas funcionales, no funcionales, de rendimiento, de seguridad,
etc.).
● Priorizar las pruebas según la criticidad y los riesgos asociados.
● Crear casos de prueba detallados que cubran todos los escenarios relevantes.
● Asegurarse de que los casos de prueba sean repetibles y verificables.
6. Estrategia de Ejecución:
9. Ejecución de Pruebas:
● Planificar pruebas de regresión para garantizar que las nuevas funciones no afecten las existentes.
16. Documentación:
Recuerda que la planificación de pruebas debe ser flexible y adaptarse según las necesidades y cambios en el
proyecto. Además, la colaboración con otros equipos y partes interesadas es esencial para una planificación de
pruebas efectiva.
2. Alcance:
● Módulos incluidos: Catálogo de productos, Carrito de compras, Proceso de pago, Gestión de pedidos.
● No incluido en esta fase: Integración con sistemas de envío externos.
3. Tipos de Pruebas:
● Pruebas Funcionales
o Pruebas de Casos de Uso
o Pruebas de Interfaz de Usuario
o Pruebas de Integración
o Pruebas de Aceptación del Usuario (UAT)
● Pruebas No Funcionales
o Pruebas de Rendimiento
o Pruebas de Seguridad
o Pruebas de Compatibilidad de Navegadores y Dispositivos
o Pruebas de Estrés
4. Cronograma:
5. Recursos:
● Personal:
o Un Líder de Pruebas.
o Cuatro Ingenieros de Pruebas.
● Herramientas:
o Selenium y TestNG para pruebas de interfaz de usuario.
o Apache JMeter para pruebas de rendimiento.
o OWASP ZAP para pruebas de seguridad.
6. Ambiente de Pruebas:
7. Criterios de Éxito:
8. Riesgos y Mitigaciones:
● Riesgo: Variaciones en la carga del servidor.
3. Pruebas de Regresión:
Las pruebas de regresión se centran en asegurar que las nuevas modificaciones o adiciones al software no hayan
introducido errores en las funcionalidades existentes. Estas pruebas son críticas cuando se realizan
actualizaciones o cambios en el código. Algunos tipos de pruebas de regresión son:
● Pruebas de Regresión Automatizadas: Utilizan scripts automáticos para volver a ejecutar casos de prueba
existentes después de cambios en el código.
● Pruebas de Retroceso (Backward Compatibility): Verifican que las nuevas versiones del software sean
compatibles con versiones anteriores.
● Pruebas de Impacto: Evalúan cómo los cambios afectan otras áreas del sistema.
La combinación de estos tipos de pruebas es esencial para garantizar un software de calidad. La elección de qué
pruebas aplicar depende de la naturaleza del proyecto y los requisitos específicos del software.
Procedimientos:
● Objetivo: Verificar que los usuarios pueden añadir productos al carrito correctamente.
● Procedimiento:
1. Navegar a la página de un producto.
2. Hacer clic en el botón "Añadir al Carrito".
3. Verificar que el producto se añade al carrito.
4. Confirmar que la cantidad en el icono del carrito se actualiza.
2. Modificar Cantidad en el Carrito:
● Objetivo: Confirmar que los usuarios pueden ajustar la cantidad de productos en el carrito.
● Procedimiento:
1. Ir al carrito de compras.
2. Modificar la cantidad de un producto.
3. Verificar que el total del carrito se actualiza correctamente.
● Objetivo: Asegurar que los usuarios pueden eliminar productos del carrito.
● Procedimiento:
1. Ir al carrito de compras.
2. Eliminar un producto.
3. Verificar que el producto se elimina del carrito.
Casos de Prueba:
● Herramientas de depuración.
● Pruebas de Código: Cubrimiento, valores límite, clases de
equivalencia, entre otras.
1. Pruebas de Cubrimiento:
● Objetivo: Asegurarse de que todas las líneas de código sean ejecutadas durante las pruebas.
Caso de Prueba:
● Criterios de Aceptación:
o Utilizar herramientas de análisis de cubrimiento como JaCoCo o Cobertura.
o Verificar que al menos el 90% de las líneas de código están cubiertas por las pruebas.
o Identificar y corregir áreas no cubiertas.
Caso de Prueba:
● Escenario:
o Para una función que acepta números enteros entre 1 y 100, probar con valores 1, 50, 100.
o Verificar que el software maneje correctamente los límites inferior y superior.
o Probar con valores fuera de este rango y verificar la respuesta del software.
● Objetivo: Dividir el conjunto de datos de entrada en clases de equivalencia y probar representantes de cada clase.
Caso de Prueba:
● Escenario:
o Para una función que acepta números enteros, dividir los números en clases de equivalencia (negativos,
cero, positivos).
o Seleccionar un representante de cada clase para realizar pruebas.
o Verificar que el software maneje adecuadamente cada clase.
● Normas de calidad.
Existen diversas normas y estándares de calidad de software que son reconocidos internacionalmente. Estas
normas establecen pautas y buenas prácticas para el desarrollo, mantenimiento y evaluación de la calidad del
software. Aquí hay algunas de las normas más relevantes:
● Objetivo:
o Proporcionar un marco para la calidad del software con enfoque en características como funcionalidad,
fiabilidad, usabilidad, eficiencia, mantenibilidad y portabilidad.
● Notas:
o La norma ISO/IEC 9126 ha sido reemplazada por la norma ISO/IEC 25010, que proporciona una estructura
más actualizada y aborda nuevas tecnologías y prácticas de desarrollo.
● Objetivo:
o Establecer un modelo de calidad para el software y sistemas de información, considerando características
de calidad y subcaracterísticas.
● Notas:
o Se centra en características como la funcionalidad, la seguridad, la usabilidad, la eficiencia y otras.
● Objetivo:
o Establecer procesos para el ciclo de vida del software, incluyendo adquisición, suministro, desarrollo,
operación y mantenimiento.
● Notas:
o Proporciona una estructura para la gestión de procesos y actividades a lo largo del ciclo de vida del
software.
● Objetivo:
o Proporcionar un marco para la evaluación y mejora de procesos de software.
● Notas:
o Ayuda a las organizaciones a evaluar la capacidad de sus procesos y mejorar la eficacia y eficiencia del
desarrollo de software.
● Objetivo:
o Proporcionar un conjunto de mejores prácticas para mejorar los procesos de desarrollo y mantenimiento de
software.
● Notas:
o Divide la mejora del proceso en niveles de madurez, desde inicial hasta optimizado.
● Objetivo:
o Establecer estándares para la gestión de la calidad del software, incluyendo la planificación, supervisión y
evaluación.
● Notas:
o Proporciona directrices para el desarrollo de planes de gestión de calidad del software.
● Objetivo:
o Establecer estándares para la documentación de pruebas de software, incluyendo planes de prueba, casos
de prueba y procedimientos de prueba.
● Notas:
o Proporciona pautas para la documentación efectiva de actividades de prueba.
Estas normas son utilizadas en la industria del software para garantizar la calidad y eficiencia en los procesos de
desarrollo. La elección de una norma específica puede depender de la industria, los requisitos del cliente y la
naturaleza del proyecto.
NUnit (.NET):
● Descripción:
o NUnit es un marco de prueba unitaria para aplicaciones .NET (C# y otros lenguajes de .NET).
● Características:
o Anotaciones y atributos para definir pruebas.
o Asserts para validar resultados.
o Soporte para pruebas parametrizadas.
Pytest (Python):
● Descripción:
o Pytest es un marco de prueba para aplicaciones Python.
● Características:
o Sintaxis sencilla y fácil de aprender.
o Detección automática de pruebas.
o Soporte para fixtures y mocks.
Mocha (JavaScript):
● Descripción:
o Mocha es un marco de prueba para JavaScript (Node.js y el navegador).
● Características:
o Soporte para pruebas asíncronas.
o Configuración fácil y flexible.
o Integración con bibliotecas como Chai y Sinon.
PHPUnit (PHP):
● Descripción:
o PHPUnit es un marco de prueba unitaria para aplicaciones PHP.
● Características:
o Soporte para pruebas de unidades y pruebas de integración.
o Integración con herramientas de CI/CD.
● Automatización de pruebas.
Selenium:
● Uso:
o Automatización de pruebas de navegadores web.
● Características:
o Soporte para múltiples navegadores.
o Integración con varios lenguajes de programación.
Appium:
● Uso:
o Automatización de pruebas de aplicaciones móviles (iOS, Android).
● Características:
o Soporte para pruebas nativas, híbridas y basadas en web.
JUnit y TestNG:
● Uso:
o Automatización de pruebas unitarias en Java.
● Características:
o Anotaciones para definir pruebas.
o Integración con IDEs y herramientas de construcción.
Robot Framework:
● Uso:
o Automatización de pruebas de aceptación y pruebas de robot.
● Características:
o Sintaxis fácil de leer.
o Soporte para pruebas web, móviles y de API.
● Documentación de pruebas.
La documentación de pruebas de software es esencial para registrar y comunicar información sobre las pruebas
realizadas en un proyecto. Proporciona una referencia clave para el equipo de desarrollo, los probadores y otros
interesados, ayudando a comprender el alcance, los resultados y los detalles de las pruebas realizadas. Esta es la
estructura general de la documentación de pruebas de software:
1. Plan de Pruebas:
● Descripción:
o Un documento que describe la estrategia general de pruebas para el proyecto.
● Contenido:
o Objetivos de las pruebas.
o Alcance y exclusión.
o Recursos necesarios.
o Cronograma de pruebas.
o Estrategia de pruebas (pruebas unitarias, de integración, etc.).
o Criterios de aceptación.
2. Casos de Prueba:
● Descripción:
o Documentos individuales que describen escenarios de prueba específicos.
● Contenido:
o Título y descripción del caso de prueba.
o Pasos de prueba detallados.
o Datos de entrada.
o Resultados esperados.
o Condiciones previas y posteriores.
3. Suite de Pruebas:
● Descripción:
o Un conjunto de casos de prueba relacionados que se ejecutan conjuntamente.
● Contenido:
o Lista de casos de prueba incluidos.
o Propósito de la suite de pruebas.
o Información sobre la configuración necesaria.
● Descripción:
o Un resumen de los resultados de las pruebas ejecutadas.
● Contenido:
o Resumen general de resultados (éxito, falla, no ejecutado).
o Descripciones detalladas de los problemas encontrados.
o Estadísticas de cobertura.
o Información sobre la configuración de prueba utilizada.
5. Registro de Defectos:
● Descripción:
o Documento que registra los problemas encontrados durante las pruebas.
● Contenido:
o Identificación única del defecto.
o Descripción del defecto.
o Pasos para reproducir el defecto.
o Prioridad y gravedad.
o Estado del defecto (abierto, asignado, cerrado, etc.).
● Descripción:
o Un documento que muestra la relación entre los requisitos y los casos de prueba.
● Contenido:
o Lista de requisitos.
o Enlaces a los casos de prueba que prueban cada requisito.
● Descripción:
o Detalles sobre la configuración del entorno de prueba.
● Contenido:
o Hardware y software requeridos.
o Configuración de red.
o Configuración del sistema operativo.
9. Documentación de Rendimiento:
● Descripción:
o Información detallada sobre las pruebas de rendimiento realizadas.
● Contenido:
o Resultados de las pruebas de carga.
o Información sobre la escalabilidad del sistema.
● Descripción:
o Información detallada sobre las pruebas de seguridad realizadas.
● Contenido:
o Resultados de las pruebas de penetración.
o Identificación de posibles vulnerabilidades.
Extracción de métodos:
// Antes
void procesarDatos() {
// código extenso
}
// Después
void procesarDatos() {
procesarParte1();
procesarParte2();
}
void procesarParte1() {
// código específico de la parte 1
}
void procesarParte2() {
// código específico de la parte 2
}
Eliminación de código duplicado:
● Objetivo: Reducir la duplicación de código para mejorar la coherencia y facilitar futuras modificaciones.
● Beneficios: Menos propenso a errores y cambios más rápidos.
// Antes
void operacion1() {
// código común
// operación específica 1
}
void operacion2() {
// código común
// operación específica 2
}
// Después
void operacionComun() {
// código común
}
void operacion1() {
operacionComun();
// operación específica 1
}
void operacion2() {
operacionComun();
// operación específica 2
}
// Antes
int x = 10;
// Después
int numeroIntentos = 10;
● Objetivo: Aplicar patrones de diseño para mejorar la estructura y la flexibilidad del código.
● Beneficios: Mejora la modularidad y facilita la expansión futura.
-Limitaciones de la Refactorización
Costo de tiempo y recursos:
● Descripción: La refactorización puede ser un proceso que consume tiempo y recursos. A veces, la presión
del tiempo en un proyecto puede limitar la cantidad de refactorización que se puede realizar.
● Consideración: Es importante equilibrar el beneficio a largo plazo de una base de código más limpia con
las restricciones de tiempo y recursos del proyecto.
Requerimientos de conocimiento:
● Descripción: La refactorización efectiva requiere un conocimiento profundo del sistema existente. Los
desarrolladores deben entender cómo interactúan diferentes partes del código para realizar cambios
seguros y significativos.
● Consideración: Se debe fomentar la documentación adecuada y el intercambio de conocimientos entre
miembros del equipo para facilitar la refactorización.
● Descripción: La refactorización puede interferir con los plazos de lanzamiento del producto si no se
planifica cuidadosamente. Los cambios significativos en el código pueden requerir tiempo adicional de
prueba.
● Consideración: La planificación cuidadosa, la identificación de áreas críticas y la priorización de la
refactorización pueden ayudar a minimizar el impacto en los plazos de lanzamiento.
Extract Method:
Inline Method:
● Descripción: Contrario a "Extract Method", este patrón implica eliminar un método y colocar su lógica
directamente en el lugar donde se llama.
● Cuándo usarlo: Cuando un método es tan simple que no agrega claridad y su existencia solo complica el
código.
Move Method:
● Descripción: Mover un método de una clase a otra para mejorar la cohesión y reducir la dependencia.
● Cuándo usarlo: Cuando un método se relaciona más con otra clase que con la clase actual.
Rename Method:
-Analizadores de código
Los analizadores de software son herramientas que examinan el código fuente de un programa para identificar
patrones, errores, inconsistencias y otras características que pueden afectar la calidad, el rendimiento y la
seguridad del software. Estos analizadores pueden automatizar la detección de problemas potenciales y
proporcionar retroalimentación a los desarrolladores. Aquí hay algunos tipos comunes de analizadores de
software:
● Control de versiones.
Instalar VisualSVNServer
https://www.visualsvn.com/server/download/
Instalar SVN Subversion y su conector
https://eclipse.dev/subversive/installation-instructions.php
Alternativa, instalar Subclipse. Subclipse proporciona integración de SVN en el entorno de desarrollo Eclipse. Aquí
tienes los pasos básicos para instalar Subclipse:
1. Abrir Eclipse:
o Inicia Eclipse en tu sistema.
2. Instalar Subclipse:
o Ve a Help -> Eclipse Marketplace en la barra de menú.
3. Buscar Subclipse:
o En el cuadro de diálogo del Marketplace, busca "Subclipse" en el cuadro de búsqueda.
4. Instalar Subclipse:
o En los resultados de la búsqueda, deberías encontrar "Subclipse" en la lista. Haz clic en Go to the full
listing y luego haz clic en el botón Go to the Subclipse Installation para instalar Subclipse.
5. Seleccionar Componentes:
o En la página de instalación, selecciona los componentes que deseas instalar. Asegúrate de
seleccionar "Subclipse" y "SVNKit" (o "JavaHL" si prefieres usar la biblioteca nativa de JavaHL).
6. Aceptar Términos de Licencia:
o Acepta los términos de licencia y haz clic en Finish para completar la instalación.
7. Reiniciar Eclipse:
o Después de la instalación, Eclipse te pedirá que reinicies la aplicación. Acepta reiniciar para aplicar
los cambios.
8. Configurar Repositorios SVN:
o Una vez reiniciado Eclipse, puedes configurar tus repositorios SVN:
▪ Abre la perspectiva SVN Perspective seleccionando Window -> Perspective -> Open Perspective ->
Other... -> SVN Repository Exploring.
9. Agregar Repositorio SVN:
o Haz clic derecho en el área SVN Repositories y selecciona New -> Repository Location.
o Ingresa la URL de tu repositorio SVN y sigue los pasos para agregarlo.
Después de estos pasos, deberías tener Subclipse instalado y configurado en tu entorno Eclipse. Puedes utilizar la
perspectiva SVN Repository Exploring para acceder y gestionar tus repositorios SVN directamente desde Eclipse.
Además, podrás realizar operaciones como commit, update, merge y otras funciones de SVN directamente desde
la interfaz de Eclipse.
● Descripción: Es el almacenamiento centralizado que contiene la historia completa del proyecto, incluidas todas las
versiones y cambios realizados a lo largo del tiempo.
2. Tronco (Trunk):
● Descripción: Representa la línea principal de desarrollo en el repositorio. Contiene la versión principal del proyecto
y es el punto de partida para ramas y desarrollo.
3. Ramas (Branches):
● Descripción: Son copias independientes del tronco o de otras ramas. Se utilizan para el desarrollo de características
aisladas o para abordar problemas específicos sin afectar directamente al código en el tronco.
4. Etiquetas (Tags):
● Descripción: Son puntos específicos en la historia del proyecto que se utilizan para marcar versiones importantes o
estables. A diferencia de las ramas, las etiquetas suelen ser inmutables y se utilizan para referenciar versiones
específicas del código.
● Descripción: Es una copia local de una parte del repositorio, que puede incluir el tronco, ramas o etiquetas. Los
desarrolladores trabajan en sus copias locales y realizan cambios antes de enviarlos de vuelta al repositorio central.
6. Commit (Confirmar):
● Descripción: Representa un conjunto de cambios realizados por un usuario en su copia de trabajo local. Cada
commit crea una nueva revisión en el historial del repositorio.
7. Update (Actualizar):
● Descripción: Actualiza la copia de trabajo local con los cambios más recientes del repositorio central. Es utilizado
para sincronizar el trabajo local con la versión más reciente del código en el repositorio.
● Descripción: Crea una copia de trabajo local descargando una versión específica del código desde el repositorio. Es
la acción inicial que se realiza al comenzar a trabajar en un proyecto.
9. Conflictos:
● Descripción: Ocurren cuando dos o más usuarios realizan cambios en la misma parte de un archivo. Resolver
conflictos implica reconciliar manualmente las diferencias para que la versión resultante sea coherente.
● Descripción: Mantiene un registro detallado de todos los cambios realizados en el repositorio, incluyendo quién
hizo el cambio, cuándo y qué archivos se modificaron.
11. Merge (Mezcla):
● Descripción: Combina los cambios realizados en una rama de vuelta al tronco principal. Es utilizado para consolidar
el trabajo realizado en diferentes ramas.
Documentación:
1. Comentarios en el Código:
o Propósito: Los comentarios en el código son anotaciones que explican el propósito de ciertas secciones de
código.
o Uso adecuado: Deben ser claros y concisos, proporcionando información útil sin redundancias innecesarias.
2. Documentación de Clases:
o Propósito: La documentación de clases describe el propósito, la funcionalidad y el uso de una clase en
particular.
o Uso adecuado: Debe incluir una descripción general, detalles de los métodos, atributos y ejemplos de uso.
Uso de Comentarios:
Comentarios de una Línea:
// Este es un comentario de una línea en Java
Comentarios de Múltiples Líneas:
/*
* Este es un comentario
* de múltiples líneas en Java
*/
Comentarios para Javadoc:
/**
* Descripción detallada de la clase o método.
* Puede incluir etiquetas Javadoc específicas.
*/
● /** */: Este comentario especial se coloca encima de la declaración de la clase o método y es reconocido
por la herramienta Javadoc.
● @author: Indica el autor de la clase o del método.
● @version: Especifica la versión de la clase o del método.
Elementos clave para variables, en constructores y métodos.
1. Documentación Externa:
o Utilizar documentos externos, como archivos README o documentos de diseño, para explicar el propósito y
uso general del código.
import java.util.List;
/**
* La clase GestorProyectos representa un sistema para gestionar proyectos. Permite la creación, modificación y visualización de
proyectos.
* @author Tu Nombre
* @version 1.0
*/
/**
*/
/**
*/
public GestorProyectos() {
/**
*/
this.listaProyectos.add(nuevoProyecto);
/**
*/
if (proyecto.getNombre().equals(nombre)) {
return proyecto;
return null;
}
/**
*/
if (proyecto.getNombre().equals(nombre)) {
proyecto.setDescripcion(nuevaDescripcion);
return true;
return false;
/**
*/
System.out.println("Lista de Proyectos:");
System.out.println(proyecto);
Ejercicio: dadas las siguientes clases java, crear un package con vuestros datos nombre.apellido1.apellido2, declara el package dentro de
la clase y realiza los comentarios JavaDoc, genera después la documentación JavaDoc. Para generar el JavaDoc en eclipse, botón
derecho, export, JavaDoc. Después sube las clases al repositorio SVN del profesor, https://172.30.105.11/svn/repo
Clases
Las clases son el elemento principal del diagrama y representa, como su nombre indica, una clase dentro del
paradigma de la orientación a objetos. Este tipo de elementos normalmente se utilizan para representar
conceptos o entidades del «negocio». Una clase define un grupo de objetos que comparten características,
condiciones y significado. La manera más rápida para encontrar clases sobre un enunciado, sobre una idea de
negocio o, en general, sobre un tema concreto es buscar los sustantivos que aparecen en el mismo. Por poner
algún ejemplo, algunas clases podrían ser: Animal, Persona, Mensaje, Expediente… Es un concepto muy amplio
y resulta fundamental identificar de forma efectiva estas clases, en caso de no hacerlo correctamente se
obtendrán una serie de problemas en etapas posteriores, teniendo que volver a hacer el análisis y perdiendo
parte o todo el trabajo que se ha hecho hasta ese momento.
Bajando de nivel una clase está compuesta por tres elementos: nombre de la clase, atributos, funciones. Estos
elementos se incluyen en la representación (o no, dependiendo del nivel de análisis).
Para representar la clase con estos elementos se utiliza una caja que es dividida en tres zonas utilizando para ello
lineas horizontales:
● La primera de ellas se utiliza para el nombre de la clase. En caso de que la clase sea abstracta se utilizará su
nombre en cursiva.
● La segunda, por otra parte, se utiliza para escribir los atributos de la clase, uno por línea y utilizando el
siguiente formato:
Aunque esta es la forma «oficial» de escribirlas, es común simplificando únicamente poniendo el nombre y el
tipo o únicamente el nombre.
● La última de las zonas incluye cada una de las funciones que ofrece la clase. De forma parecida a los
atributos, sigue el siguiente formato:
visibilidad nombre_funcion { parametros } : tipo-devuelto { propiedades }
De la misma manera que con los atributos, se suele simplificar indicando únicamente el nombre de la función y,
en ocasiones, el tipo devuelto.
Tanto los atributos como las funciones incluyen al principio de su descripción la visibilidad que tendrá. Esta
visibilidad se identifica escribiendo un símbolo y podrá ser:
● (+) Pública. Representa que se puede acceder al atributo o función desde cualquier lugar de la aplicación.
● (-) Privada. Representa que se puede acceder al atributo o función únicamente desde la misma clase.
● (#) Protegida. Representa que el atributo o función puede ser accedida únicamente desde la misma clase o
desde las clases que hereden de ella (clases derivadas).
En caso de que un atributo o función sea estático, se representa en el diagrama subrayando su nombre. Una
característica estática se define como aquella que es compartida por cada clase y no instanciada para cada uno
de los objetos de esa clase. Es un concepto muy común.
Relaciones
Una relación identifica una dependencia. Esta dependencia puede ser entre dos o más clases (más común) o una
clase hacía sí misma (menos común, pero existen), este último tipo de dependencia se denomina dependencia
reflexiva. Las relaciones se representan con una linea que une las clases, esta línea variará dependiendo del tipo
de relación
Relación reflexiva
Las relaciones en el diagrama de clases tienen varias propiedades, que dependiendo la profundidad que se quiera
dar al diagrama se representarán o no. Estas propiedades son las siguientes:
● Multiplicidad. Es decir, el número de elementos de una clase que participan en una relación. Se puede
indicar un número, un rango… Se utiliza n o * para identificar un número cualquiera.
● Nombre de la asociación. En ocasiones se escribe una indicación de la asociación que ayuda a entender la
relación que tienen dos clases. Suelen utilizarse verbos como por ejemplo: «Una empresa contrata a n
empleados»
Tipos de relaciones
● Asociación.
● Agregación.
● Composición.
● Dependencia.
● Herencia.
Asociación
Este tipo de relación es el más común y se utiliza para representar dependencia semántica. Se representa con
una simple linea continua que une las clases que están incluidas en la asociación.
Agregación
Es una representación jerárquica que indica a un objeto y las partes que componen ese objeto. Es decir,
representa relaciones en las que un objeto es parte de otro, pero aun así debe tener existencia en sí mismo.
Se representa con una línea que tiene un rombo en la parte de la clase que es una agregación de la otra clase (es
decir, en la clase que contiene las otras).
Un ejemplo de esta relación podría ser: «Las mesas están formadas por tablas de madera y tornillos o, dicho de
otra manera, los tornillos y las tablas forman parte de una mesa». Como ves, el tornillo podría formar parte de
más objetos, por lo que interesa especialmente su abstracción en otra clase.
Ejemplo de agregación
Composición
La composición es similar a la agregación, representa una relación jerárquica entre un objeto y las partes que lo
componen, pero de una forma más fuerte. En este caso, los elementos que forman parte no tienen sentido de
existencia cuando el primero no existe. Es decir, cuando el elemento que contiene los otros desaparece, deben
desaparecer todos ya que no tienen sentido por sí mismos sino que dependen del elemento que componen.
Además, suelen tener los mismos tiempo de vida. Los componentes no se comparten entre varios elementos,
esta es otra de las diferencias con la agregación.
Se representa con una linea continua con un rombo relleno en la clase que es compuesta.
Un ejemplo de esta relación sería: «Un vuelo de una compañía aerea está compuesto por pasajeros, que es lo
mismo que decir que un pasajero está asignado a un vuelo»
Ejemplo de composición
Dependencia
Se utiliza este tipo de relación para representar que una clase requiere de otra para ofrecer sus funcionalidades.
Es muy sencilla y se representa con una flecha discontinua que va desde la clase que necesita la utilidad de la
otra flecha hasta esta misma.
Ejemplo de dependencia
Herencia
Otra relación muy común en el diagrama de clases es la herencia. Este tipo de relaciones permiten que una
clase (clase hija o subclase) reciba los atributos y métodos de otra clase (clase padre o superclase). Estos
atributos y métodos recibidos se suman a los que la clase tiene por sí misma. Se utiliza en relaciones «es un».
Un ejemplo de esta relación podría ser la siguiente: Un pez, un perro y un gato son animales.
Ejemplo de herencia
En este ejemplo, las tres clases (Pez, Perro, Gato) podrán utilizar la función respirar, ya que lo heredan de la clase
animal, pero solamente la clase Pez podrá nadar, la clase Perro ladrar y la clase Gato maullar. La clase Animal
podría plantearse ser definida abstracta, aunque no es necesario.
Interfaces
Una interfaz es una entidad que declara una serie de atributos, funciones y obligaciones. Es una especie de
contrato donde toda instancia asociada a una interfaz debe de implementar los servicios que indica aquella
interfaz.
Las interfaces se asocian a clases. Una asociación entre una clase y una interfaz representa que esa clase cumple
con el contrato que indica la interfaz, es decir, incluye aquellas funciones y atributos que indica la interfaz.
Este tipo de diagramas son solicitados cuando se está describiendo la vista estática del sistema o sus
funcionalidades. Los pasos a seguir para construir estos diagramas son los siguientes:
Ejemplo:
-Una aplicación necesita almacenar información sobre empresas, sus empleados y sus clientes.
-Los empleados que son directivos tienen una categoría y un conjunto de empleados subordinados.
// Constructor
public Libro(String titulo, String autor, int añoPublicacion) {
this.titulo = titulo;
this.autor = autor;
this.añoPublicacion = añoPublicacion;
}
Ejercicio 2: Se desea diseñar un diagrama de clases sobre la información de las reservas de una empresa
dedicada al alquiler de automóviles, teniendo en cuenta que:
• De cada cliente se desean almacenar su DNI, nombre, dirección y teléfono. Además dos clientes se diferencian
por un código único.
• Cada cliente puede ser avalado por otro cliente de la empresa.
• Una reserva la realiza un único cliente pero puede involucrar varios coches.
• Es importante registrar la fecha de inicio y final de la reserva, el precio del alquiler de cada uno de los coches,
los litros de gasolina en el depósito en el momento de realizar la reserva, el precio total de la reserva y un
indicador de si el coche o los coches han sido entregados.
• Todo coche tiene siempre asignado un determinado garaje que no puede cambiar. De cada coche se requiere la
matricula, el modelo el color y la marca.
• El hotel tiene un nombre y un número de estrellas. Posee tres tipos de habitaciones: sencilla, doble y suit y dos
tipos de clientes: habituales y esporádicos. Cada reserva almacena: la fecha de entrada y el número de días que
será ocupada la habitación.
• Al cliente se le toman los siguientes datos: el nombre, la dirección y
su teléfono.
• Las habitaciones tienen distinto precio y distinto número, y además es posible mostrar una foto de cada una de
ellas al cliente.
• En la habitación sencilla el cliente puede elegir si es exterior o no, en la habitación doble si la cama es de
matrimonio o sencilla y en la suit la posibilidad de bañera, sauna y mirador.
• Los clientes que son habituales reciben un trato especial, es decir, una reducción en el precio de la habitación
con respecto al cliente esporádico.
• A los esporádicos el hotel les ofrece la posibilidad de darles información sobre las ofertas.
Análisis y Diseño Orientado a Objetos. Elaboración de diagramas
de comportamiento:
● Tipos. Campo de aplicación.
● Diagramas de casos de uso. Actores, escenario, relación de comunicación.
● Diagramas de secuencia. Línea de vida de un objeto, activación, envío de mensajes.
● Diagramas de colaboración. Objetos, mensajes.
● Diagramas de actividades. Actividades, transiciones, decisiones y combinaciones.
● Diagramas de estado. Estados, eventos, señales, transiciones.