Has recorregut les set primeres lliçons aprenent eines: vas muntar l'entorn, vas escriure el teu primer programa, vas conèixer la sintaxi, els tipus, els operadors i les conversions. A cada exemple hi apareixien la Marta, l'Iván i la Lucía, i unes tasques amb títol, prioritat i hores estimades. Ha arribat el moment de presentar formalment el projecte que travessa tot el curs: què és Taller Nómada, quin problema té, quina aplicació construiràs per resoldre'l, quin és el model de dades canònic que faràs servir durant els onze mòduls i quina part construiràs a cadascun. Aquesta lliçó és el mapa del viatge complet.

Contingut

  1. Taller Nómada: el context
  2. El problema que cal resoldre
  3. L'equip: Marta, Iván i Lucía
  4. Què farà Nómada Tasques
  5. El model de dades canònic d'una tasca
  6. L'objecte d'exemple de referència
  7. Regles de negoci del projecte
  8. Mapa del curs: què construeix cada mòdul
  9. L'estructura de fitxers que anirà creixent
  10. Errors Habituals i Consells
  11. Exercicis
  12. Conclusió

  1. Taller Nómada: el context

Taller Nómada és un petit espai de coworking i taller creatiu situat en una nau rehabilitada. És una empresa completament fictícia, creada per a aquest curs, amb dades igualment fictícies.

La seva activitat té dues potes:

  • Coworking: dotze llocs de treball fixos i una sala polivalent que es lloga per hores per a reunions i presentacions.
  • Taller creatiu: un espai amb equipament de serigrafia, enquadernació i petita fusteria, on s'imparteixen cursos i s'acullen projectes de residents.

El negoci funciona, però la gestió interna no. I aquest és el punt de partida.

  1. El problema que cal resoldre

Avui, la feina de Taller Nómada s'organitza així:

  • Una paret de notes adhesives amb les tasques en curs.
  • Un grup de missatgeria on s'acorden coses que ningú no apunta.
  • Un full de càlcul compartit que ningú no actualitza des del març.

Les conseqüències són les esperables:

Símptoma Conseqüència real
Les notes cauen o es desenganxen Tasques que desapareixen sense que ningú no se n'assabenti
Ningú no sap qui fa què Feina duplicada i feina sense fer
Les dates límit són al cap de la Marta Es descobreixen tard, sempre
No hi ha historial És impossible saber quant es va trigar en una cosa semblant
No hi ha visió de càrrega L'Iván acumula tres projectes i la Lucía té l'agenda buida

El que necessiten no és una eina corporativa amb mil opcions. Necessiten una cosa petita, ràpida i seva: una llista de tasques compartida on es vegi qui fa què, amb quina prioritat i per a quan.

Això és Nómada Tasques, i el construiràs tu.

  1. L'equip: Marta, Iván i Lucía

Tres persones que seran les protagonistes de tots els exemples i exercicis del curs.

Persona Rol Què necessita de l'aplicació
Marta Coordinadora Veure l'estat global, repartir la càrrega, controlar dates límit
Iván Dissenyador Veure només les seves tasques, ordenades per urgència, i marcar-les com a fetes
Lucía Desenvolupadora Filtrar per etiqueta, estimar hores i consultar l'històric

Les seves necessitats no són iguals, i això és deliberat: t'obligarà a pensar en filtres, ordenacions i vistes diferents sobre les mateixes dades.

  1. Què farà Nómada Tasques

L'abast complet de l'aplicació, en ordre aproximat de construcció:

  1. Crear tasques amb tots els seus camps, validant les dades d'entrada.
  2. Assignar-les a una persona de l'equip (o deixar-les sense assignar).
  3. Canviar-ne l'estat entre pendent, en-curs i feta.
  4. Editar i eliminar tasques existents.
  5. Filtrar per responsable, estat, prioritat o etiqueta.
  6. Ordenar per data límit, prioritat o hores estimades.
  7. Calcular mètriques: càrrega per persona, percentatge d'avenç, tasques vençudes.
  8. Mostrar tot plegat en una interfície web usable.
  9. Persistir les dades al navegador perquè no es perdin en recarregar.
  10. Sincronitzar amb una API remota.
  11. Provar l'aplicació amb proves automàtiques.
  12. Optimitzar i desplegar la versió final.

Res d'això es fa de cop. Cada mòdul del curs hi afegeix una capa.

  1. El model de dades canònic d'una tasca

Aquí hi ha el cor del projecte. Aquesta taula és la referència oficial de tot el curs: cada vegada que aparegui una tasca en qualsevol lliçó, tindrà exactament aquests camps amb aquests tipus.

Camp Tipus Valors permesos Obligatori Exemple
id number Enter positiu, únic 1
titol string Text no buit, 1-100 caràcters 'Redissenyar la sala polivalent'
responsable string | null 'Marta', 'Iván', 'Lucía' o null No 'Iván'
prioritat string 'alta', 'mitjana', 'baixa' 'alta'
estat string 'pendent', 'en-curs', 'feta' 'en-curs'
etiquetes string[] Array de textos; pot estar buit Sí (pot ser []) ['disseny', 'espai']
horesEstimades number Més gran que 0, màxim 40 12
dataLimit string Format ISO 'yyyy-mm-dd' '2026-09-30'

5.1 Per què cada camp és com és

L'id és un nombre, no un text. És un identificador correlatiu que assigna l'aplicació. Com que és numèric, generar el següent és trivial.

responsable pot ser null. Aquí apliquem el que hem après a Variables i Tipus de Dades: null significa "deliberadament sense assignar". No fem servir '' ni undefined. Una tasca sense responsable és un estat legítim del negoci: la Marta crea la tasca primer i decideix qui la fa després.

prioritat i estat són textos d'un conjunt tancat. Podríem fer servir nombres (1, 2, 3), però 'alta' es llegeix i es depura infinitament millor que 1. El preu és haver de validar que el valor sigui entre els permesos, cosa que ja saps fer amb ===.

etiquetes és sempre un array, mai null. Si una tasca no té etiquetes, el valor és []. Aquesta és una decisió de disseny important: garanteix que tot el codi posterior pugui fer tasca.etiquetes.length sense comprovar res abans. I recorda de Conversió de Tipus i Comparacions: un array buit és truthy, així que cal comprovar-ne la longitud, no l'existència.

horesEstimades admet decimals. Mitja hora és una unitat raonable (7.5). El màxim de 40 correspon a una setmana laboral completa.

dataLimit és un string ISO, no un objecte Date. Aquesta és probablement la decisió més discutible del projecte, i està presa a propòsit per tres motius:

  1. S'ordena sola. '2026-09-30' < '2026-11-05' és true, perquè l'ordre alfabètic del format ISO coincideix amb el cronològic.
  2. Es desa i es transmet sense conversions. Ni l'emmagatzematge del navegador ni una API JSON manegen objectes Date: els converteixen a text de totes maneres.
  3. Evita els paranys de zona horària, que són nombrosos i desagradables per a algú que comença.

Treballarem amb dates com a text durant tot el curs, i només farem servir objectes Date quan calgui calcular diferències entre dates.

5.2 Els estats i el seu cicle de vida

Una tasca recorre sempre aquest camí:

stateDiagram-v2
    [*] --> pendent: la Marta la crea
    pendent --> en_curs: algú comença
    en_curs --> feta: es finalitza
    en_curs --> pendent: queda aparcada
    feta --> en_curs: cal retocar-la
    feta --> [*]

Només aquestes transicions són vàlides. Una tasca no pot passar directament de pendent a feta: algú l'ha d'haver començada. Aquesta regla la implementaràs al Mòdul 2, quan aprenguis condicionals.

  1. L'objecte d'exemple de referència

Aquest és l'objecte que reapareixerà una vegada i una altra al llarg del curs. Encara no has estudiat la sintaxi d'objectes —això és Introducció als Objectes—, però el pots llegir perfectament: és l'agrupació de les mateixes vuit variables que ja saps declarar.

// La tasca de referència de Nómada Tasques.
// Cada línia és un camp del model canònic.
const tascaExemple = {
  id: 1,
  titol: 'Redissenyar la sala polivalent',
  responsable: 'Iván',
  prioritat: 'alta',
  estat: 'en-curs',
  etiquetes: ['disseny', 'espai'],
  horesEstimades: 12,
  dataLimit: '2026-09-30'
};

I aquest és el mateix conjunt de dades expressat amb el que que saps fer avui: variables soltes.

'use strict';

// --- Tasca 1: les mateixes dades, en variables independents -------
const id1 = 1;
const titol1 = 'Redissenyar la sala polivalent';
const responsable1 = 'Iván';
const prioritat1 = 'alta';
let estat1 = 'en-curs';
const etiquetes1 = ['disseny', 'espai'];
const horesEstimades1 = 12;
const dataLimit1 = '2026-09-30';

console.log(`[${id1}] ${titol1} — ${responsable1} (${prioritat1})`);

Compara les dues versions. Amb una tasca, les variables soltes són manejables. Amb tres, ja comences a numerar variables (titol1, titol2, titol3), cosa que és un senyal inequívoc que falta una estructura. Amb quaranta tasques, seria inviable.

Aquesta incomoditat és intencionada: la sentiràs a l'exercici final d'aquesta lliçó, i és exactament la motivació dels objectes i arrays del Mòdul 4.

  1. Regles de negoci del projecte

A més del model de dades, el projecte té un conjunt de regles fixes que s'aplicaran durant tot el curs:

Regla Descripció
R1 L'id és únic i correlatiu; l'assigna l'aplicació, mai l'usuari
R2 El titol no pot estar buit ni contenir només espais
R3 horesEstimades ha de ser més gran que 0 i no superar 40
R4 dataLimit no pot ser anterior a la data de creació
R5 Una tasca nova neix sempre en estat 'pendent'
R6 Només es permeten les transicions d'estat del diagrama anterior
R7 Ningú no pot superar 40 hores estimades assignades en la mateixa setmana
R8 Una tasca sense responsable té responsable: null, mai ''
R9 Les etiquetes es desen en minúscules i sense duplicats
R10 Una tasca vençuda (dataLimit passada i estat diferent de 'feta') es destaca

Aquestes regles apareixeran progressivament. En aquest mòdul ja has aplicat sense saber-ho la R2, la R3 i la R8 en validar el formulari de la lliçó anterior.

  1. Mapa del curs: què construeix cada mòdul

Aquest diagrama mostra quina part de Nómada Tasques construeix cada mòdul i com es donen suport els uns als altres.

flowchart TD
    M1["Mòdul 1 · Fonaments<br/>Les dades d'una tasca<br/>en variables i tipus"]
    M2["Mòdul 2 · Control de flux<br/>Validar estats i recórrer<br/>diverses tasques"]
    M3["Mòdul 3 · Funcions<br/>crearTasca, validarTasca,<br/>calcularCarrega"]
    M4["Mòdul 4 · Objectes i arrays<br/>La tasca com a objecte<br/>i la llista de tasques"]
    M5["Mòdul 5 · Avançat<br/>Classe Tasca, mòduls<br/>i asincronia"]
    M6["Mòdul 6 · DOM<br/>La interfície: llista,<br/>formulari i esdeveniments"]
    M7["Mòdul 7 · APIs<br/>Desar al navegador<br/>i sincronitzar amb l'API"]
    M8["Mòdul 8 · Proves<br/>Depurar i provar<br/>tota la lògica"]
    M9["Mòdul 9 · Rendiment<br/>Que respongui bé<br/>amb moltes tasques"]
    M10["Mòdul 10 · Frameworks<br/>Com seria amb<br/>React, Vue o Angular"]
    M11["Mòdul 11 · Projecte final<br/>Nómada Tasques<br/>complet i desplegat"]

    M1 --> M2 --> M3 --> M4 --> M5 --> M6 --> M7 --> M8 --> M9 --> M10 --> M11

Amb més detall, mòdul a mòdul:

Mòdul Què construeixes a Nómada Tasques
1. Introducció Les dades d'una tasca en variables del tipus correcte; validació bàsica d'un formulari
2. Estructures de control Decidir la prioritat, validar transicions d'estat, recórrer diverses tasques, capturar errors
3. Funcions Agrupar la lògica: crearTasca(), esTascaValida(), calcularCarrega(), formatarResum()
4. Objectes i arrays La tasca com a objecte i la llista completa com a array; filtrar, ordenar i agregar amb filter, sort i reduce
5. Avançat Una classe Tasca amb validació encapsulada; separar el codi en mòduls; carregar dades de manera asíncrona
6. El DOM La interfície real: pintar la llista, el formulari d'alta, els botons d'estat, els filtres
7. APIs del navegador Desar a localStorage per no perdre les dades; sincronitzar amb una API mitjançant fetch
8. Proves Depurar amb les DevTools; proves unitàries de la lògica de tasques amb Jest; proves d'extrem a extrem amb Cypress
9. Rendiment Que la llista continuï sent fluida amb centenars de tasques; renderitzat eficient
10. Frameworks Com es veuria la mateixa llista de tasques en React, Vue i Angular
11. Projecte final Acoblar, polir, provar i desplegar l'aplicació completa

Un detall important sobre com llegir aquest mapa: cada mòdul reescriu part de l'anterior amb millors eines. Les vuit variables soltes d'avui es convertiran en un objecte al Mòdul 4 i en una instància de classe al Mòdul 5. No és que el d'avui estigui malament: és que aprens la bastida abans que l'edifici.

  1. L'estructura de fitxers que anirà creixent

nomada-tasques/
├── index.html
├── css/
│   └── estils.css
└── js/
    └── app.js

Així quedarà al final del curs:

nomada-tasques/
├── index.html
├── css/
│   └── estils.css
├── js/
│   ├── app.js              ← punt d'entrada
│   ├── model/
│   │   ├── tasca.js        ← la classe Tasca (Mòdul 5)
│   │   └── validacio.js    ← regles R1-R10 (Mòduls 2-3)
│   ├── dades/
│   │   ├── magatzem.js     ← localStorage (Mòdul 7)
│   │   └── api.js          ← fetch a l'API (Mòdul 7)
│   ├── vista/
│   │   ├── llista.js       ← renderitzat de la llista (Mòdul 6)
│   │   ├── formulari.js    ← alta i edició (Mòdul 6)
│   │   └── filtres.js      ← filtres i ordre (Mòdul 6)
│   └── util/
│       └── dates.js        ← utilitats de data (Mòdul 3)
├── test/
│   └── tasca.test.js       ← proves amb Jest (Mòdul 8)
└── package.json            ← dependències (Mòdul 8)

No cal crear res d'això ara. Es mostra perquè vegis cap a on vas i entenguis la lògica de l'organització: el model (què és una tasca i quines regles compleix), les dades (d'on vénen i on es desen), la vista (com es mostren) i les utilitats. Aquesta separació en capes és un principi de disseny que s'aplica en projectes de qualsevol mida.

Errors Habituals i Consells

Errors habituals en abordar un projecte llarg

  • Voler construir-ho tot de cop. L'impuls natural és obrir l'editor i començar per la interfície. No funciona: sense lògica validada al darrere, la interfície només amaga els problemes.
  • Canviar el model de dades sobre la marxa. Si al Mòdul 4 decideixes anomenar owner el responsable, tots els exemples posteriors deixaran d'encaixar. Respecta la taula de l'apartat 5 durant tot el curs.
  • Saltar-se el projecte i fer només els exercicis solts. El que consolida l'aprenentatge és el fil: veure com el mateix problema es resol millor cada vegada que aprens alguna cosa nova.
  • Fer servir '' en lloc de null per a un responsable sense assignar. Trenca la R8 i provoca comprovacions incoherents per tot el codi.
  • Desar les dates en format dd/mm/yyyy. Deixen de poder ordenar-se com a text i ho compliquen tot.
  • Frustrar-se perquè el codi d'avui és "primitiu". Vuit variables soltes per a una tasca són incòmodes, i han de ser-ho: aquesta incomoditat és el que dona sentit al que aprendràs després.

Consells

  • Tingues aquesta lliçó a mà. La taula del model de dades és la referència que consultaràs durant els onze mòduls.
  • Crea una carpeta per mòdul dins del projecte mentre practiques (practica/modul-01/), i deixa js/ per al codi definitiu.
  • Fes un commit de Git en acabar cada mòdul. Veuràs el teu progrés i podràs tornar enrere.
  • Quan aprenguis alguna cosa nova, pregunta't: "quina part de Nómada Tasques millora això?" És la millor manera de fixar un concepte.
  • Inventa les teves pròpies tasques per a l'equip de Taller Nómada. Com més juguis amb les dades, més natural et resultarà el domini.
  • No avancis matèria. Si un mòdul posterior et tempta, resisteix: l'ordre està pensat perquè cada peça es recolzi en l'anterior.

Exercicis

Exercici 1: Valida tres tasques contra el model

Per a cadascuna d'aquestes tres tasques proposades, indica quines regles del model de dades o de l'apartat 7 incompleix i com la corregiries:

Tasca A

id: '3'
titol: '   '
responsable: ''
prioritat: 'urgent'
estat: 'pendent'
etiquetes: null
horesEstimades: 0
dataLimit: '15/10/2026'

Tasca B

id: 4
titol: 'Inventari del magatzem de serigrafia'
responsable: 'Lucía'
prioritat: 'baixa'
estat: 'feta'
etiquetes: ['Taller', 'taller', 'INVENTARI']
horesEstimades: 55
dataLimit: '2026-12-01'

Tasca C

id: 5
titol: 'Preparar la jornada de portes obertes'
responsable: null
prioritat: 'alta'
estat: 'en-curs'
etiquetes: []
horesEstimades: 9.5
dataLimit: '2026-11-20'

Exercici 2: Tres tasques i un resum

Escriu un script que declari tres tasques de Taller Nómada fent servir només el que has après en aquest mòdul (variables, tipus, operadors, conversions, template literals). Res d'objectes, arrays d'objectes, funcions ni bucles.

Les tres tasques:

Camp Tasca 1 Tasca 2 Tasca 3
id 1 2 3
titol Redissenyar la sala polivalent Cartelleria del taller de serigrafia Actualitzar el web de reserves
responsable Iván Marta Lucía
prioritat alta mitjana alta
estat en-curs pendent pendent
etiquetes disseny, espai disseny, comunicació web, desenvolupament
horesEstimades 12 6 14
dataLimit 2026-09-30 2026-10-15 2026-10-02

L'script ha d'imprimir:

  1. Una capçalera amb el nom del projecte.
  2. Una línia de resum per tasca amb el format: [1] Redissenyar la sala polivalent · Iván · alta · en-curs · 12 h · venç 2026-09-30
  3. El total d'hores estimades de l'equip.
  4. La mitjana d'hores per tasca, arrodonida a un decimal.
  5. Quantes tasques són de prioritat alta.
  6. La tasca amb la data límit més propera (comparant les dates ISO com a text).
  7. Un avís amb console.warn si el total supera les 30 hores.

Exercici 3: Reflexiona sobre el model

Respon raonadament en tres o quatre línies cada pregunta:

  1. Per què etiquetes és sempre un array ([] quan està buit) en lloc de null? Quin problema evita aquesta decisió, tenint en compte el que saps sobre valors truthy?
  2. Quin avantatge concret aporta desar dataLimit com a '2026-09-30' en lloc de '30/09/2026'?
  3. En escriure l'exercici 2 hauràs notat una incomoditat. Quina és exactament, i què creus que la resoldrà?

Solucions

Exercici 1

Tasca A — incompleix set regles:

Camp Problema Correcció
id: '3' És un string; ha de ser number id: 3
titol: ' ' Només espais: buit després de trim() (R2) Un títol real
responsable: '' Ha de ser null si no hi ha responsable (R8) responsable: null
prioritat: 'urgent' No és entre els tres valors permesos prioritat: 'alta'
etiquetes: null Ha de ser sempre un array etiquetes: []
horesEstimades: 0 Ha de ser més gran que 0 (R3) horesEstimades: 4
dataLimit: '15/10/2026' No és format ISO dataLimit: '2026-10-15'

Tasca B — incompleix dues regles:

  • horesEstimades: 55 supera el màxim de 40 (R3). Si la feina són realment 55 hores, cal partir-la en diverses tasques: és el que la regla pretén forçar.
  • etiquetes: ['Taller', 'taller', 'INVENTARI'] incompleix la R9 per partida doble: hi ha majúscules i hi ha un duplicat ('Taller' i 'taller' són la mateixa etiqueta un cop normalitzades). El correcte seria ['taller', 'inventari'].

Tasca Cés vàlida. Val la pena repassar per què cada camp dubtós està bé:

  • responsable: null és correcte: la tasca existeix però encara no s'ha assignat (R8).
  • etiquetes: [] és correcte: una llista buida, no null.
  • horesEstimades: 9.5 és correcte: el camp admet decimals i és dins del rang.
  • estat: 'en-curs' amb responsable: null és estrany des del punt de vista del negoci (algú l'ha començada però no consta qui), però no incompleix cap regla escrita. És just el tipus de detall que es descobreix construint, i que en un projecte real portaria a afegir una regla nova.

Exercici 2

'use strict';

// ===================================================================
// Nómada Tasques · Mòdul 1 · Resum de les tasques de Taller Nómada
// Només amb variables, operadors i template literals.
// ===================================================================

// --- Tasca 1 -------------------------------------------------------
const id1 = 1;
const titol1 = 'Redissenyar la sala polivalent';
const responsable1 = 'Iván';
const prioritat1 = 'alta';
let estat1 = 'en-curs';
const etiquetes1 = 'disseny, espai';
const horesEstimades1 = 12;
const dataLimit1 = '2026-09-30';

// --- Tasca 2 -------------------------------------------------------
const id2 = 2;
const titol2 = 'Cartelleria del taller de serigrafia';
const responsable2 = 'Marta';
const prioritat2 = 'mitjana';
let estat2 = 'pendent';
const etiquetes2 = 'disseny, comunicació';
const horesEstimades2 = 6;
const dataLimit2 = '2026-10-15';

// --- Tasca 3 -------------------------------------------------------
const id3 = 3;
const titol3 = 'Actualitzar el web de reserves';
const responsable3 = 'Lucía';
const prioritat3 = 'alta';
let estat3 = 'pendent';
const etiquetes3 = 'web, desenvolupament';
const horesEstimades3 = 14;
const dataLimit3 = '2026-10-02';

// --- Càlculs -------------------------------------------------------

// Total d'hores
const totalHores = horesEstimades1 + horesEstimades2 + horesEstimades3;

// Mitjana arrodonida a un decimal: multipliquem per 10, arrodonim i dividim
const NUM_TASQUES = 3;
const mitjanaHores = Math.round((totalHores / NUM_TASQUES) * 10) / 10;

// Tasques de prioritat alta: cada comparació val true (1) o false (0)
const tasquesAlta =
  Number(prioritat1 === 'alta') +
  Number(prioritat2 === 'alta') +
  Number(prioritat3 === 'alta');

// Data més propera: les dates ISO es comparen com a text
const dataMesPropera1 = dataLimit1 < dataLimit2 ? dataLimit1 : dataLimit2;
const dataMesPropera = dataMesPropera1 < dataLimit3 ? dataMesPropera1 : dataLimit3;

// Títol corresponent a aquesta data
const titolMesUrgent =
  dataMesPropera === dataLimit1 ? titol1 :
  dataMesPropera === dataLimit2 ? titol2 :
                                  titol3;

// --- Sortida -------------------------------------------------------
console.log('=========================================');
console.log(' NÓMADA TASQUES · Taller Nómada');
console.log('=========================================');

console.log(
  `[${id1}] ${titol1} · ${responsable1} · ${prioritat1} · ${estat1} · ${horesEstimades1} h · venç ${dataLimit1}`
);
console.log(
  `[${id2}] ${titol2} · ${responsable2} · ${prioritat2} · ${estat2} · ${horesEstimades2} h · venç ${dataLimit2}`
);
console.log(
  `[${id3}] ${titol3} · ${responsable3} · ${prioritat3} · ${estat3} · ${horesEstimades3} h · venç ${dataLimit3}`
);

console.log('-----------------------------------------');
console.log(`Total d'hores estimades:    ${totalHores} h`);
console.log(`Mitjana per tasca:          ${mitjanaHores} h`);
console.log(`Tasques de prioritat alta:  ${tasquesAlta} de ${NUM_TASQUES}`);
console.log(`Venç abans:                 ${titolMesUrgent} (${dataMesPropera})`);

const LIMIT_AVIS = 30;
totalHores > LIMIT_AVIS &&
  console.warn(`Atenció: l'equip acumula ${totalHores} h estimades.`);

Sortida:

=========================================
 NÓMADA TASQUES · Taller Nómada
=========================================
[1] Redissenyar la sala polivalent · Iván · alta · en-curs · 12 h · venç 2026-09-30
[2] Cartelleria del taller de serigrafia · Marta · mitjana · pendent · 6 h · venç 2026-10-15
[3] Actualitzar el web de reserves · Lucía · alta · pendent · 14 h · venç 2026-10-02
-----------------------------------------
Total d'hores estimades:    32 h
Mitjana per tasca:          10.7 h
Tasques de prioritat alta:  2 de 3
Venç abans:                 Redissenyar la sala polivalent (2026-09-30)
⚠ Atenció: l'equip acumula 32 h estimades.

Tècniques del mòdul que apareixen aquí:

  • Number(prioritat === 'alta') converteix un booleà a 1 o 0 per poder sumar-los. És una aplicació directa de la conversió explícita de Conversió de Tipus i Comparacions.
  • Math.round(x * 10) / 10 arrodoneix a un decimal sense fer servir toFixed, que retornaria un string.
  • La comparació de dates ISO com a text funciona perquè l'ordre alfabètic coincideix amb el cronològic.
  • Els ternaris encadenats trien la data menor i el títol associat.
  • El curtcircuit && dispara l'avís només quan se supera el llindar.

Exercici 3

1. Per què etiquetes és sempre un array?

Perquè permet que tot el codi posterior tracti el camp de la mateixa manera, sense comprovacions prèvies: etiquetes.length funciona sempre, tant si hi ha tres etiquetes com si no n'hi ha cap. Si el valor fos null quan està buit, cada lloc que consultés el camp hauria de preguntar abans si existeix, i oblidar-ho provocaria un TypeError. A més, com vas aprendre a la lliçó anterior, un array buit és truthy, de manera que if (etiquetes) no distingeix una llista plena d'una de buida: la comprovació correcta és sempre etiquetes.length === 0, i aquesta comprovació només és possible si el camp és sempre un array.

2. Quin avantatge aporta el format ISO?

Que el seu ordre alfabètic coincideix amb el seu ordre cronològic, perquè els components van de més a menys magnitud (any, mes, dia) i porten zeros a l'esquerra. Això permet ordenar i comparar dates amb els operadors < i > sense cap conversió ni llibreria, tal com es fa a l'exercici 2. Amb '30/09/2026' la comparació de text seria absurda: '30/09/2026' < '15/10/2026' seria false, perquè compararia '3' amb '1'. El format ISO també és l'estàndard internacional, el que fan servir les APIs JSON i el que espera el camp <input type="date"> del navegador.

3. Quina incomoditat has notat?

Que cada tasca necessita vuit variables numerades (titol1, titol2, titol3...), i que qualsevol càlcul sobre el conjunt —sumar hores, comptar prioritats, buscar la més urgent— cal escriure'l repetint manualment els tres casos. Amb tres tasques és tediós; amb quaranta seria impossible. Falten dues coses: una manera d'agrupar els vuit camps d'una tasca en una sola unitat (els objectes, Mòdul 4), una manera d'agrupar totes les tasques en una sola col·lecció (els arrays, Mòdul 4), i una manera de repetir una operació sobre totes elles sense copiar i enganxar (els bucles, Mòdul 2). Aquesta necessitat, sentida amb les teves pròpies mans, és exactament el motiu pel qual existeixen aquestes eines.

Conclusió

Ja coneixes el projecte complet. Saps què és Taller Nómada, quin és el seu problema real i què necessiten la Marta, l'Iván i la Lucía de l'aplicació. Tens el model de dades canònic d'una tasca, amb els seus vuit camps, els seus tipus i els seus valors permesos, i entens les decisions de disseny que hi ha al darrere: per què responsable pot ser null, per què etiquetes és sempre un array i per què dataLimit és un text en format ISO. Coneixes les deu regles de negoci que aniràs implementant, el cicle de vida d'una tasca, el mapa del que construeix cada mòdul i l'estructura de fitxers cap a la qual avances.

Amb això tanques el Mòdul 1. Vas començar sense haver escrit ni una línia de JavaScript i acabes amb un entorn de desenvolupament muntat, un projecte en marxa i la capacitat de declarar, calcular, convertir i comparar les dades d'una tasca real. No és poc.

Però has acabat el mòdul amb una frustració molt concreta i molt productiva: pots descriure tres tasques, però no pots decidir ni repetir. No saps fer que el programa comprovi per si mateix si una transició d'estat és vàlida, ni recórrer una llista de quaranta tasques sense escriure quaranta vegades el mateix. Tot el teu codi s'executa de dalt a baix, en línia recta, sense prendre ni una sola decisió.

Això canvia al Mòdul 2: Estructures de Control. Començaràs amb Sentències Condicionals, on aprendràs a fer que el programa triï un camí o un altre —classificar la prioritat d'una tasca, detectar si està vençuda, permetre o rebutjar un canvi d'estat—, i continuaràs amb els bucles, que et permetran aplicar aquesta lògica a totes les tasques de Taller Nómada d'una sola vegada. És el moment en què el teu codi deixa de ser una llista d'instruccions i comença a comportar-se com un programa.

Curs de JavaScript: De Principiant a Avançat

Mòdul 1: Introducció a JavaScript

Mòdul 2: Estructures de Control

Mòdul 3: Funcions

Mòdul 4: Objectes i Arrays

Mòdul 5: Objectes i Funcions Avançades

Mòdul 6: El Model d'Objectes del Document (DOM)

Mòdul 7: APIs del Navegador i Temes Avançats

Mòdul 8: Proves i Depuració

Mòdul 9: Rendiment i Optimització

Mòdul 10: Frameworks i Llibreries de JavaScript

Mòdul 11: Projecte Final

© Copyright 2026. Tots els drets reservats