El objetivo de esta práctica es seguir profundizando en los conceptos fundamentales de JavaScript. En concreto, trataremos sobre los arrays y funciones avanzadas.
El repositorio base de la práctica está disponible en: https://github.com/pedroprieto/practica_dwec_gestor_presupuesto
Se supone que ya está configurado el repositorio personal y el remoto secundario (profesor
). Si no es así, revisa las instrucciones de las prácticas anteriores. En el apartado de Preparación se indica cómo proceder.
Para poder realizar esta práctica y que funcione adecuadamente el entorno de test será necesario instalar el siguiente software en el equipo:
Para realizar la práctica se seguirán los principios del Desarrollo Guiado por Test. Para ello se proporciona en el repositorio una serie de ficheros que permiten ejecutar tests. Dichos tests comprobarán que el programa cumple con algunos de los requisitos de la práctica.
El repositorio se ha configurado para que se ejecuten los tests automáticamente en la nube de GitHub cuando se realice un push o una pull request. Para ello se hará uso del servicio GitHub Actions.
- Instalar los requisitos de software indicados
- Abrir un terminal
- Situarse en la carpeta del repositorio personal de la práctica
- Incorporar a tu repositorio personal los cambios realizados por el profesor correspondientes a los archivos de esta práctica. Para ello hay que ejecutar:
git pull profesor master
- Este comando descarga los cambios que ha realizado el profesor en el repositorio base y los integra en tu repositorio personal. Tras realizar este paso, seguramente git abra el editor configurado por defecto para que introduzcas un mensaje para crear un nuevo commit que integre tus cambios y los cambios del profesor. Debes introducir el texto y guardar los cambios.
- En principio no deben producirse conflictos. En caso de que se produzcan (por ejemplo, porque has editado el fichero
.gitignore
y yo también porque lo exigía la práctica), resuélvelos y notifícamelo a través de un Issue. - Ejecuta el comando
git push
para subir los cambios a tu repositorio personal (el remoto principal) en GitHub y que queden guardados ahí también. - Ejecutar el comando
npm install
. Este comando instalará todas las librerías de Node necesarias para ejecutar los tests. Dichas librerías se guardarán en una carpeta con nombrenode_modules
dentro del repositorio. Nótese que dicha carpeta está excluida del repositorio en el archivo.gitignore
. - Ejecutar el comando
npm run test2
para lanzar los tests de esta práctica. Este comando podrá ejecutarse tantas veces como sea necesario. Por pantalla se mostrarán los tests que se pasan y los que no, de manera que se tendrá información sobre las acciones que hay que realizar. Los tests también se ejecutarán automáticamente en GitHub Actions al subir los cambios al repositorio y al realizar la pull request. - Si se está utilizando VS Code se puede lanzar la ejecución de los tests desde el propio editor y utilizar breakpoints para interrumpir la ejecución y depurar el programa. Las configuraciones de lanzamiento creadas para ello están en el archivo
.vscode/launch.json
. - Opcionalmente (recomendable), ejecutar el comando
npm test
para lanzar todos los tests presentes en el repositorio. Se deberá comprobar que se pasan los tests de las prácticas anteriores a la que se esté realizando. Lógicamente, si el repositorio incluye los tests de prácticas posteriores a la que se esté realizando, dichos tests no se pasarán (ya que el trabajo está todavía por hacer). Este último caso puede darse si la persona no está realizando la práctica propuesta en la semana actual (va con “retraso”, por así decirlo). En GitHub Actions se ejecutarán todos los tests en tareas independientes: así se podrá comprobar si el test de la práctica que se está realizando se ha pasado.
Lee atentamente los siguientes artículos y sus correspondientes subsecciones en caso de que las tengan:
- https://es.javascript.info/array
- https://es.javascript.info/array-methods
- https://es.javascript.info/iterable
- https://es.javascript.info/keys-values-entries
- https://es.javascript.info/destructuring-assignment
- https://es.javascript.info/date
- https://es.javascript.info/json
- https://es.javascript.info/advanced-functions (Bastante denso, pero muy interesante para conocer los entresijos del lenguaje. Las secciones “Decoradores y redirecciones, call/apply” y “Función bind: vinculación de funciones” tienen cierta complejidad: no hace falta que se comprenda todo, simplemente tener una idea muy general)
Utilizaremos el fichero llamado gestionPresupuesto.js
en la carpeta js
del repositorio. A no ser que se indique lo contrario, todo el código que se cree deberá guardarse en este fichero.
Añade las siguientes variables globales:
gastos
- Almacenará el listado de gastos que vaya introduciendo el usuario. Inicialmente contendrá un array vacío.idGasto
- Se utilizará para almacenar el identificador actual de cada gasto que se vaya añadiendo. Su valor inicial será 0. Se irá incrementando con cada gasto que se añada.
Añade las funciones listarGastos
, anyadirGasto
, borrarGasto
, calcularTotalGastos
y calcularBalance
al objeto export
del final del fichero.
Define las funciones vacías (sin parámetros y sin cuerpo) en el fichero gestionPresupuesto.js
para que los tests no den error de sintaxis y se puedan ir comprobando conforme se vaya avanzando en la práctica.
Función sin parámetros que devolverá la variable global gastos
.
Actualiza la función constructora para que incluya la fecha y las etiquetas (ver apartado de Objeto gasto
). Los parámetros adicionales de la función deben ir a continuación de los existentes.
- Si no se indican los parámetros de
etiquetas
, se almacenará en la propiedadetiquetas
un array vacío. - Si no se indica el parámetro
fecha
, se almacenará en la propiedadfecha
la fecha actual. - El parámetro
fecha
deberá ser unstring
con formato válido que pueda entender la funciónDate.parse
. Si la fecha no es válida (no sigue el formato indicado), se deberá almacenar la fecha actual en su lugar. - Tal como se indica en la sección de objeto
gasto
, la fecha se almacenará en formatotimestamp
. - Las etiquetas se pasarán como una lista de parámetros de número indeterminado.
- Para añadir las etiquetas se utilizará el método
anyadirEtiquetas
explicado en la sección de objetogasto
.
Algunos ejemplos de llamadas de función CrearGasto
podrían ser:
let gasto1 = new CrearGasto("Gasto 1");
let gasto2 = new CrearGasto("Gasto 2", 23.55);
let gasto3 = new CrearGasto("Gasto 3", 23.55, "2021-10-06T13:10" );
let gasto4 = new CrearGasto("Gasto 4", 23.55, "2021-10-06T13:10", "casa" );
let gasto5 = new CrearGasto("Gasto 5", 23.55, "2021-10-06T13:10", "casa", "supermercado" );
let gasto6 = new CrearGasto("Gasto 6", 23.55, "2021-10-06T13:10", "casa", "supermercado", "comida" );
Función de 1 parámetro que realizará tres tareas:
- Añadir al objeto gasto pasado como parámetro una propiedad
id
cuyo valor será el valor actual de la variable globalidGasto
. - Incrementar el valor de la variable global
idGasto
. - Añadir el objeto gasto pasado como parámetro a la variable global
gastos
. El gasto se debe añadir al final del array.
Función de 1 parámetro que eliminará de la variable global gastos
el objeto gasto cuyo id
haya sido pasado como parámetro. Si no existe un gasto con el id
proporcionado, no hará nada.
Función sin parámetros que devuelva la suma de todos los gastos creados en la variable global gastos
. De momento no los agruparemos por período temporal (lo haremos en sucesivas prácticas).
Función sin paràmetros que devuelva el balance (presupuesto - gastos totales) disponible. De momento no lo obtendremos por período temporal (lo haremos en sucesivas prácticas). Puede utilizar a su vez la función calcularTotalGastos
.
Añade las siguientes propiedades al objeto gasto
:
fecha
- Almacenará la fecha en que se crea el gasto en forma de timestamp (ver https://es.javascript.info/date#creacion).etiquetas
- Almacenará en un array el listado de etiquetas (categorías) asociadas al gasto.
Añade o modifica los siguientes métodos del objeto gasto
:
mostrarGastoCompleto
- Función sin parámetros que devuelva el texto multilínea siguiente (ejemplo para un gasto con tres etiquetas):Gasto correspondiente a DESCRIPCION con valor VALOR €. Fecha: FECHA_EN_FORMATO_LOCALIZADO Etiquetas: - ETIQUETA 1 - ETIQUETA 2 - ETIQUETA 3
Para mostrar la fecha en formato localizado puedes utilizar el método
toLocaleString()
(referencia de toLocaleString()).actualizarFecha
- Función de 1 parámetro que actualizará la propiedadfecha
del objeto. Deberá recibir la fecha en formatostring
que sea entendible por la funciónDate.parse
. Si la fecha no es válida, se dejará sin modificar.anyadirEtiquetas
- Función de un número indeterminado de parámetros que añadirá las etiquetas pasadas como parámetro a la propiedadetiquetas
del objeto. Deberá comprobar que no se creen duplicados.borrarEtiquetas
- Función de un número indeterminado de parámetros que recibirá uno o varios nombres de etiquetas y procederá a eliminarlas (si existen) de la propiedadetiquetas
del objeto.
- Cada persona trabajará en su repositorio personal que habrá creado tras realizar el fork del repositorio base.
- Todos los archivos de la práctica se guardarán en el repositorio y se subirán a GitHub periódicamente. Es conveniente ir subiendo los cambios aunque no sean definitivos. No se admitirán entregas de tareas que tengan un solo commit.
- Como mínimo se debe realizar un commit por cada elemento de la lista de tareas a realizar (si es que estas exigen crear código, claro está).
- Para cualquier tipo de duda o consulta se pueden abrir
Issues
haciendo referencia al profesor mediante el texto@pedroprieto
dentro del texto delIssue
. Losissues
deben crearse en tu repositorio: si no se muestra la pestaña deIssues
puedes activarla en losSettings
de tu repositorio. - Una vez finalizada la tarea se debe realizar una
Pull Request
al repositorio base indicando tu nombre y apellidos en el mensaje.