Universidad de Costa Rica |
Gr02: L 10-11:50 / J 9-11:50, 201-IF. |
Recurso | Peso | Descripción |
---|---|---|
— |
Contrato sobre el curso entre la universidad, docentes, y estudiantes |
|
— |
En Mediación Virtual |
|
— |
Videos y recursos |
|
— |
Ejemplos de programas realizados durante las lecciones |
|
25% |
Problemas en el juez en línea (HackerRank) o en control de versiones |
|
20% |
Dos proyectos programación en parejas y uno opcional (+5%) |
|
25% |
Robot dibujante [25-may 9:00 - 12:00] |
|
30% |
A definir [27-jul 11 a.m.] |
- Generalidades
- Programación procedimental
- Entrada y salida de C
- Diseño procedimental: algoritmos
- Compilación y pruebas (build automation)
- Optimización
- Bibliotecas de código
- Indirección (punteros)
- Arreglos y aritmética de punteros
- Memoria dinámica y matrices
- Taller de doxygen y makefile
- Registros de memoria (records)
- Cadenas de caracteres de terminadas en nulo
- Programación genérica
- Programación orientada a objetos (parte 1)
- Programación orientada a objetos genérica
- Programación orientada a objetos (parte 2)
Generalidades
Recursos
-
Documentación de la biblioteca estándar de C y C++: CPlusPlus y CppReference.
Paradigmas de programación
J14-mar | Video |
---|---|
Filosofía de la computación, matemática, ciencia e ingeniería |
|
Ejercicios vs problemas |
|
Métodos de resolución de problemas: prueba y error, descomposición, analogía |
|
Proceso de resolución de problemas: análisis, diseño, implementación, pruebas |
|
Recursos de la máquina: procesamiento, almacenamiento, y comunicación |
|
Paradigmas de programación |
Programación procedimental
Entrada y salida de C
L11-mar | Video |
---|---|
Abrir una sección de ejercicios en el juez en línea |
|
Tutorial de uso de la interfaz del juez en línea HackerRank |
|
Funciones (subrutinas) libres en C. Comentarios |
|
Biblioteca estándar de C. Leer un carácter con |
|
Archivos. Entrada estándar. Cursores |
|
Concepto de archivo. Final de archivo (EOF, end-of-file) |
|
Valor de retorno de |
|
Inicializar todas las variables. |
|
Leer varios valores con |
Diseño procedimental: algoritmos
L01-abr | Video |
---|---|
Fase de análisis: comprender el problema |
|
Diseño procedimental: algoritmos. Diagramas de flujo. Pseudocódigo |
|
Los ocho tipos de instrucciones procedimentales |
|
Algoritmo para el índice de masa corporal. Abstracción. Prueba de corrección y completitud |
|
Descomposición en subtareas. Subrutinas con múltiples puntos de retorno |
|
Prueba del algoritmo: rastreo de procesamiento, memoria, y comunicación |
|
Convertir pseudocódigo en comentarios. Expresiones regulares |
|
Implementación del algoritmo en C. Reglas de estilo. Preferir constantes a variables. |
|
Errores de implementación y de diseño |
Compilación y pruebas (build automation)
L01-abr | Video |
---|---|
Completar la implementación del algoritmo en C (para el grupo 04) |
|
Probar el algoritmo/código mediante rastreo |
|
Aridad, precedencia, y asociatividad de los operadores |
|
Corregir error de análisis y diseño en el algoritmo |
|
Corregir el error en código. Variables lo más locales posibles |
|
Preparar archivos para el ambiente local: código fuente |
|
Compilar en línea de comandos. Ejecución interactiva |
|
Redirigir la entrada, salida, y error estándar |
|
Comparar la salida del programa con la esperada usando icdiff |
|
Campos en la salida con formato ( |
|
Makefile. Sintaxis. Regla para compilar |
|
Makefile: Reglas para pruebas de software y limpieza |
|
Un Makefile genérico para proyectos en C/C++ |
|
Makefile genérico: instalar dependencias. Linter de C/C++ (reglas de estilo) |
Optimización
J04-abr | Video |
---|---|
Análisis del problema de combinaciones y permutaciones |
|
Algoritmo solución en pseudocódigo |
|
Implementación de la solución en C |
|
Ejecución de la solución |
|
Desbordamiento en complemento a dos. Renombrar tipos ( |
|
Aritmética de precisión arbitraria (ej.: GMP). Optimización |
|
Optimización para calcular permutaciones sin reemplazo |
|
Optimizaciones para las combinaciones. Error de precisión flotante con potencias enteras |
|
Corregir entrada en cero como un remiendo (mala práctica) |
|
Motivación: necesidad de bibliotecas |
Bibliotecas de código
J04-abr | Video |
---|---|
Optimización de las permutaciones y combinaciones, remiendo de la entrada en cero (para grupo 04) |
|
Ejemplos de uso de bibliotecas (OpenSSL) |
|
Modularización de código fuente en archivos |
|
Archivos fuente ( |
|
Arquitectura del compilador. El preprocesador de C |
|
El compilador de C. El enlazador (linker) |
|
Unidades de traducción. Enlazado de múltiples archivos fuente |
|
Evitar la múltiple inclusión |
|
Reutilizar código compartido entre encabezados |
|
Compilar todos los fuentes en un solo comando (no recomendable) |
|
Bibliotecas estáticas vs dinámicas |
|
Crear una biblioteca dinámica de código |
|
Crear un ejecutable que usa la biblioteca dinámica |
Indirección (punteros)
L08-abr | Video |
---|---|
Análisis del problema del rango |
|
Cargado del programa. Segmentos de memoria. Segmento de código (texto) |
|
Segmento de datos. Variables globales y estáticas |
|
Segmento de heap (memoria dinámica). Hilo de ejecución |
|
Invocación de subrutinas. Parámetros vs argumentos |
|
Llamado por copia (copia de los argumentos) |
|
Variables vs punteros. Metáfora de puntero |
|
"Desreferenciar" un puntero (obtener el valor apuntado) |
|
Corregir con punteros la implementación del problema del rango |
|
Rastreo de memoria de la implementación con punteros |
|
Enteros sin signo del tamaño de la arquitectura ( |
|
Arreglos de alojamiento estático. Argumentos de línea de comando. Arreglos de longitud variable |
|
Vulnerabilidad por desborde de pila |
|
Arreglo de alojamiento dinámico (en segmento de heap) |
Arreglos y aritmética de punteros
J11-abr | Video |
---|---|
Análisis del problema de la mediana |
|
Diseño de la solución en pseudocódigo |
|
Tipo de datos |
|
Manejo de errores en C. Constantes en C. Enumeraciones |
|
Error: retornar dirección de una variable |
|
Tipos de asignación de memoria: código, estática, automática, y dinámica. Inicialización de arreglos |
|
Pasar arreglos por parámetro |
|
C pasa y retorna los arreglos como punteros, nunca por copia. |
|
Indexación de arreglos a través de punteros |
|
Aritmética de punteros. |
|
Desreferenciar con aritmética de punteros. Cambiarle la dirección al puntero |
|
Ordenar un arreglo. Punteros |
|
Terminar la implementación de la mediana y ejecución de la solución |
|
Datos apuntados constantes (sólo lectura). Direcciones constantes |
|
Preguntas: Matrices. Arreglos terminados en nulo. Concuso de código ofuscado en C |
Memoria dinámica y matrices
J18-abr | Video |
---|---|
Repaso: solución al problema de la mediana |
|
Google Sanitizers. Instrumentalización de código. Address Sanitizer. |
|
Vulnerabilidad por desbordamiento de pila (stack overflow) |
|
Alojamiento dinámico de memoria. malloc(). |
|
Reaccionar al fallo de alojamiento dinámico. Dirección cero o nula ( |
|
Concepto de fuga de memoria |
|
Corregir la fuga de memoria. Subrutina |
|
Matrices de tamaño constante |
|
Crear una matriz en memoria dinámica (heap). |
|
Destruir/liberar una matriz de la memoria dinámica |
|
Subrutinas genéricas para crear y destruir matrices con |
Taller de doxygen y makefile
Parte 1: Doxygen
L15-abr | Taller |
---|---|
Propósito de la documentación. Ejemplo: documentación de Qt |
|
Documentación de Doxygen: cómo documentar y cómo configurarlo |
|
Generar un archivo de configuration de proyecto ( |
|
Configurar Doxygen. Exportar/generar documentación |
|
Página principal de la documentación. Referencias a otros archivos y símbolos |
|
Qué agregar de Doxygen a control de cambios |
Parte 2: Makefile
L15-abr | Taller |
---|---|
Comandos para compilar la biblioteca y el programa en un shell script |
|
Sintaxis de un Makefile: reglas, dependencias (prerrequisitos), comandos |
|
Cómo |
|
Regla |
|
Reglas reusables. Variables automáticas de |
|
Variables automáticas en todas las reglas |
|
Evitar la múltiple creación del mismo directorio con requisitos de orden |
|
Declarar y usar variables |
|
Vistazo del Makefile genérico provisto |
|
Ayuda del Makefile provisto. Linting ( |
Registros de memoria (records)
L22abr | Video |
---|---|
Problema de la mediana sin conocer la cantidad de datos |
|
Concepto de registro de memoria. Declaración de tipos de registros en C (structs) |
|
Tamaño en bytes de un registro. Alineamiento de palabra (world alignment). Relleno (padding) |
|
Los registros son valores, no direcciones. Subrutinas que modifican registros |
|
Acceso a los campos de un registro (operador |
|
Interfaz del arreglo dinámico para resolver el problema de la mediana. Acceso a los campos de un registro a través de un puntero (operador |
|
Implementación del arreglo dinámico (inicio). Supuestos ( |
|
Inicialización del arreglo dinámico. Rastreo de memoria |
|
Agregar un elemento al arreglo dinámico: versión con error por desborde |
|
Encontrar error con análisis dinámico de código: Address Sanitizer |
|
Incrementar la capacidad del arreglo |
|
Implementación del incremento de capacitdy |
|
Detectar fuga de memoria con MemCheck de Valgrind |
|
Implementación de array_uninit() y corregir la fuga de memoria |
|
Preguntas. Reusar arreglos dinámicos en C |
Cadenas de caracteres de terminadas en nulo
J25-abr | Video |
---|---|
Mediana v4: recibe nombres de archivo como argumentos de línea de comandos |
|
Argumentos de línea de comandos |
|
Manejo de archivos en C. |
|
Estructura interna de un registro |
|
Calcular la mediana de archivos nombrados |
|
Reutilizar el código para calcular la mediana desde la entrada estándar |
|
Los archivos de texto son archivos binarios limitados |
|
Herramienta conversión de archivos de texto a binarios. Modo de apertura binaria |
|
Implementación de |
|
Concepto de cadenas de caracteres terminadas en nulo |
|
Implementación de la concatenación de cadenas. |
|
Linter. |
|
Longitud de cadena. La capacidad de una cadena es su longitud más 1 |
|
Invocación ineficiente de |
|
Calcular la longitud de caden usando aritmética de punteros. La biblioteca estándar de cadenas de C |
|
Escribir datos binarios a un archivo: |
|
Análisis de argumentos. Comparar cadenas de caracteres: |
Programación genérica
Entrada y salida de C++
L29-abr | Video |
---|---|
Repaso del convertidor de archivos de texto a binario |
|
Interfaz del analizador de argumentos para archivos binarios |
|
Interfaz del analizador de argumentos. Inicialización. Destrucción |
|
Implementación del análisis de argumentos. Leer de archivos binarios |
|
Importancia de los warnings del compilador. Error de comparar cadenas literales |
|
Función para comparar cadenas de caracteres usando indexación |
|
Detectar argumentos inválidos. Biblioteca estándar de cadenas de C |
L29-abr | Video |
---|---|
Reseña histórica de Unix, C, C++ y otros lenguajes |
|
El paradigma de programación genérica |
|
C++ es un (casi) superconjunto de C. Compilar código C con el compilador de C++ |
|
Encabezados de la biblioteca estándar de C para C++. Los flujos (streams) son archivos genéricos |
|
Espacios de nombres (namespaces). Operador de resolución de alcance ( |
|
Imprimir en la salida estándar ( |
|
Mala práctica: |
|
Sobrecarga de subrutinas. Name mangling |
Plantillas de subrutinas
J02-may | Video |
---|---|
Repaso: E/S de C++, espacios de nombres, sobrecarga de subrutinas |
|
Repaso: Manejo de archivos en mediana v5 está hecho con E/S de C |
|
Entrada estándar en C++ ( |
|
Leer hasta encontrar el fin de archivo con |
|
Leer de archivos nombrados con flujos en C++: |
|
Conversión de tipos en C++: |
|
Mecanismo que permite sobrecarga de subrutinas: name mangling. Identificadores que inician con guión bajo |
|
El paradigma de programación genérica. Pasar tipo de datos como parámetro. Plantillas |
|
Corregir el warning de parámetros no usados en C++. Significado de subrutinas sin parámetros |
|
Las plantillas que no son usadas, son descartadas por el compilador |
|
Cómo las plantillas son expandidas |
|
Qué pasa si se definen subrutinas con el mismo identificador que una plantilla |
|
Inferencia del tipo de datos a partir de los argumentos. Pasar el tipo de datos como un argumento |
|
Mecanismo de matching de subrutinas. Abrumante reporte de errores de plantillas |
|
Tipos de datos genéricos y referencias |
|
Repaso: biblioteca de combinatoria. Pruebas de caja negra |
|
Modificaciones al |
|
Programa casero de pruebas de caja blanca |
|
Macros del preprocesador para evitar la redundancia de código de prueba |
Sobrecarga de operadores
L06-may | Video |
---|---|
Repaso de plantillas |
|
Referencias de memoria en C++ (alias) |
|
Experimentos y ejemplos con referencias |
|
Variables, copias, punteros, y referencias |
|
Plantillas de registros. Arreglo dinámico genérico |
|
Por qué el linker no encuentra las definiciones de subrutinas de plantillas |
|
Plantillas en el archivo de encabezado |
|
Ejemplos de instanciar la plantilla de arreglo dinámico |
|
Un registro genérico para representar fracciones |
|
Argumentos por defecto |
|
Programa para sumar fracciones. Subrutina para imprmir una fracción |
|
Cómo encadenar invocaciones de impresión |
|
Notación de la sobrecarga de operadores |
|
Reglas de sobrecarga de operadores |
|
Sobrecarga del operador de entrada de flujo |
|
Sobrecarga del operador de suma binaria. Suma de fracciones |
Programación orientada a objetos (parte 1)
Clase Fracción
J09-may | Video |
---|---|
Repaso de sobrcarga de operadores: Fracciones |
|
Algoritmo de Euclides para obtener el máximo común divisor. Bibliotecas de aritmética de precisión arbitraria |
|
Simplificar la fracción. Direcciones de referencias |
|
Normalizar negativos en la fracción. Diferencia entre módulo y residuo |
|
Sugerencias de ejercicios con la Fracción |
|
El paradigma de programación orientado a objetos. UML. Modularización. Herencia de registros. Polimorfismo de subrutinas |
|
Diseño orientado a objetos. UML. Clase. Miembros. Encapsulación |
|
Diferencia entre |
|
Convención de estilo de Google. |
|
Concepto de método. Puntero oculto |
|
Métodos estáticos (sin puntero |
L13-may | Video |
---|---|
Repaso del ejemplo de fracciones y programación orientada a objetos |
|
Deshabilitar las plantillas temporalmente (No se hizo en grupo 02) |
|
Especificadores de acceso para: variables locales, miembros, y globales. Notación húngara |
|
Método constructor |
|
Diferencia entre asignación e inicialización. Correcta inicialización de atributos en constructores |
|
Violación de encapsulación. Atributos privados (buena práctica) |
|
Cuándo implementar métodos get y set |
|
Implementar un méodo get. Métodos constantes |
|
Retornar referencias en lugar de copias |
|
Subrutinas en línea ( |
|
Manejo de excepciones: |
|
Subrutinas amigas al registro |
|
Sobrecarga de operadores con métodos (subrutinas miembro). |
|
Sobrecarga de los operadores de flujo. Funciones amigas en línea ( |
Clase String
Atributos, construcción/destrucción
J16-may | Video |
---|---|
Motivación para la clase |
|
Biblioteca ECCI. Espacio de nombres |
|
Actualizar |
|
Inclusión de encabezados con rutas relativas. Argumento |
|
Atributos de la clase. Operador de flujo de impresión |
|
Constructor por defecto. Constante |
|
Constructor por defecto crea cadena vacía |
|
Constructor de conversión de |
|
Definición de métodos en archivos |
|
Google Sanitizers no funcionan con bibliotecas dinámicas. Corrección de heap-buffer-overflow error |
|
Método destructor |
|
Preguntas. Motivación de calidad de código en el proyecto. Rodeo para ASan en Makefile |
Regla de los 5
L20-may | Video |
---|---|
Repaso: clase String |
|
Error por crear copias de objetos |
|
Rastreo de memoria del constructor de copia por defecto de C++ |
|
Sobrescribir el constructor de copia para crear copias que no comparten memoria |
|
Operador de asignación de copia por defecto |
|
Sobrescribir el operador de asignación de copia para copiar objetos sin compartir recursos |
|
Regla de los tres: constructor de copia, destructor, operador de asignación de copia |
|
Copia de objetos vs traslado de recursos. Constructor de traslado |
|
Operador de asignación de traslado |
|
Regla de los cinco |
Lectura, concatenación
J23-may | Video |
---|---|
Makefile: cambiar la biblioteca dinámica por estática para instrumentalizar con ASan |
|
Repaso: regla de los cinco |
|
Implementación del operador de flujo de entrada ( |
|
Concatenación usando el operador de suma ( |
|
Constructor de capacidad |
|
Explicación de la concatenación. Forzar a invocar todos los constructores ( |
|
Constructores de conversión |
|
Constructores explícitos ( |
Métodos de acceso
L27-may | Video |
---|---|
Repaso de la clase |
|
Declaración de la sobrecarga del operador |
|
Implementación de la sobrecarga del operador |
|
Manejo de excepciones. Seguridad del código |
|
Acceder a caracteres: versión mutable del |
|
Subrutinas en línea ( |
|
El |
|
Método de acceso |
|
Acceder a caracteres: versión inmutable del |
|
Versión inmutable del método |
|
Constructor de conversión de carácter a |
No quedó grabado de la clase String
:
-
Métodos
getText()
yc_str()
-
Operadores de conversión implícitos y explícitos (ej. de uso con
fopen()
) -
Contador de instancias para pruebas. Atributos estáticos (declaración y definición). Acceso a métodos y atributos estáticos a través de
this
y el nombre de la clase.
Programación orientada a objetos genérica
Arreglo dinámico genérico orientado a objetos
J30-may | Video |
---|---|
Proyecto 02: grafo genérico |
|
Mediana v6 con objetos genéricos. Interfaz pública del objeto arreglo dinámico |
|
Diferencia entre los operadores |
|
Constructor por defecto del arreglo dinámico |
|
Diferencia entre los operadores |
|
Agregar la aplicación de la mediana v6 al Makefile |
|
Atrapar excepciones |
|
Agregar elementos al arreglo. Incrementar la capacidad del arreglo. Elementos en el arreglo son copias de los originales. |
|
Imprimir los elementos del arreglo |
L03-jun | Video |
---|---|
Repaso de construcción y destrucción del arreglo dinámico |
|
Método |
|
Incrementar la capacidad del arreglo |
|
Imprimir los elementos del arreglo. Obtener la cantidad de elementos del arreglo. Subrutinas en línea ( |
|
Operador corchetes ( |
|
Rastreo de memoria del constructor de copia por defecto |
|
Sobrescribir el constructor de copia para evitar que arreglos compartan elementos |
|
Sobrescribir el operador de asignación de copia para evitar fuga de memoria y que arreglos compartan elementos (completa regla de los 3) |
|
Implementación del constructor de traslado |
|
Implementación del operador de asignación de traslado (completa regla de los 5) |
|
Convertir la clase |
|
Expandir una plantilla para generar registros |
|
Plantillas de subrutinas: el compilador puede inferir los parámetros de la plantilla |
|
Parámetros de plantillas que no son tipos de datos |
|
|
Pendiente de grabar de la clase Array
:
-
Constructor de capacidad explícito: con un count inicial de elementos y un elemento modelo.
-
Método
resize(count)
: para incremento y decremento de la cantidad de elementos. ModificarincreaseCapacity(newCapacity=0)
. -
Método
reserve(count)
: sólo incrementa la capacidad, si es necesario (opcional).
Lista doblemente enlazada
J06-jun | Video |
---|---|
Comparación entre arreglos y listas |
|
|
|
Declaración del nodo de la lista. Campos puntero hacia el registro mismo. Diferencias entre Java y C++ |
|
Declaraciones anidadas de registros. El nodo declarado dentro de la clase lista |
|
Atributos de la lista: first/head y last/tail |
|
Constructor por defecto de lista. Agregar a la lista vacía |
|
Métodos de acceso: |
|
Aplicación para usar la list: extractor de palabras. Actualizar el |
|
Imprimir la lista. Recorrido usando un puntero |
|
Agregar a una lista no vacía. Constructor por defecto de |
|
Ejemplo de ejecución de la lista |
|
Explicación del recorrido usando un puntero |
|
Preguntas: diseño UML de plantillas, destrucción de objetos cuando ocurre excepciones (RAII) |
Iteradores
L10-jun | Video |
---|---|
Repaso del contenedor lista doblemente enlazada |
|
Destructor de la lista. Limpiar la lista |
|
Paréntesis: ¿exámenes en papel o computadora? |
|
Prioridades de programación: 1. corrección, 2. seguridad, 3. optimización |
|
Discusión: la regla de los cinco para la lista y el nodo |
|
Concepto de iterador y su necesidad |
|
Interfaz de un iterador para permitir el recorrido por un contenedor |
|
Obtener un iterador hacia primer elemento de la lista: |
|
Obtener un iterador hacia un elemento no válido: |
|
Acceder al dato apuntado sobrecargando el operador asterisco unario |
|
Sobrecargar el operador de preincremento para mover el iterador hacia el próximo elemento |
|
Ejecución del programa. Iteradores y algoritmos. Ciclo por contenedor ( |
|
Sobrecargar el operador de post-incremento |
|
Convertir la clase |
Arreglo asociativo (mapa o diccionario)
J13-jun | Video |
---|---|
Árboles: acceso en tiempo logarítmico |
|
Nodos de las listas, árboles, y grafos. Árboles binarios, ternarios, n-arios. |
|
Arreglo asociativo (mapa o diccionario) |
|
Declaración de la plantilla |
|
Declaración del nodo. Invariante de orden |
|
Constructor por defecto de |
|
Atributos del mapa. Constructor por defecto |
|
Declaración del método |
|
Inserción en un árbol vacío |
|
Inserción de un elemento hijo de la raíz |
|
Inserción usando ciclos en lugar de recursión |
|
Permitir duplicados dentro del árbol? Conjunto vs bolsa ( |
|
Reutilizar el código para crear el nodo |
|
Operador |
|
Versión pública y privada del método |
|
Imprimir los elementos del árbol. Recorrido de árboles: pre-orden, en-orden, post-orden |
|
Destructores recursivos |
|
Pruebas unitarias (caja blanca) con Catch2 |
J17-jun | Video |
---|---|
Repaso del arreglo asociativo construido con árbol binario de búsqueda |
|
Eliminación del código de impresión ( |
|
Código que usa iteradores para imprimir en |
|
Implementación de |
|
Comparación de iteradores. Acceso a la llave y valor a través del iterador. |
|
Encontrar el nodo mínimo de un subárbol |
|
Encontrar el nodo siguiente sin utilizar pilas: código |
|
Encontrar el nodo siguiente sin utilizar pilas: explicación |
|
Macros para deshabilitar la copia de registros (objetos) |
|
Functor (objetos que se comportan como funciones): la primitiva que permite implementar programación funcional en C++ |
|
Pasar un parámetro a la plantilla para cambiar el orden de almacenamiento de los elementos en el árbol |
|
Sesión de preguntas sobre el segundo proyecto |
J20-jun | Video |
---|---|
Corregido error de establecer el nodo padre al insertar uno nuevo en el árbol |
|
Cuándo usar arreglos normales y cuándo arreglos asociativos |
|
Imprimir las palabras más usadas en la entrada estándar |
|
Problema de imprimir la tabla de notas |
|
Cargar los valores en el arreglo asociativo |
|
Recorrer (iterar por) arreglos asociativos: imprimir la tabla de notas |
|
Palabra reservada |
Programación orientada a objetos (parte 2)
Análisis y diseño orientado a objetos
L24-jun | Video |
---|---|
Problema del juego Trivia |
|
UML. Análisis orientado a objeto. Casos de uso (guiones de teatro). Diagrama de casos de uso |
|
Ideas sobre análisis de requerimientos |
|
Diseño orientado a objetos. Identificación de objetos candidatos (sustantivos) |
|
Diagrama de clases. Diagramas de interacción: diagrama de secuencia |
|
Relación de composición vs agregación. Mutiplicidad de la asociación. Generación de código e ingeniería inversaa |
|
Patrón de diseño modelo-vista-controlador (MVC) |
|
El controlador general de la aplicación. La función |
|
Archivos fuente con mayúsculas para clases, minúsculas sin clases. Deshabilitar copias de objetos |