3. Functioneel gedrag
Dit hoofdstuk beschrijft het functionele gedrag van de module vanuit docent- en leerlingperspectief. De generieke OefenHub-engine blijft verantwoordelijk voor autorisatie, opslag, navigatie, voortgang, geschiedenis, resultaten, delen en live meekijken.
3.1 Functionele afbakening
| Onderdeel | Verantwoordelijkheid generieke OefenHub-engine | Verantwoordelijkheid module Optellen & Aftrekken (simpel) |
|---|---|---|
| Modulebeschikbaarheid | Tonen van beschikbare ExerciseModules op basis van IsActive, IsVisibleForTesting en rolcontext. | Aanleveren van beschrijving en configuratiecomponent zodra de module gekozen is. |
| Oefening aanmaken | Aanmaken van Exercises, koppeling aan niveau/categorie en vastleggen van status. | Valideren en serialiseren van modulespecifieke configuratie. |
| Vraaggeneratie | Starten van een run en aanbieden van generation context. | Genereren van vraagdata die past binnen de configuratie. |
| Vraagweergave | Tonen van generieke playercontainer, voortgang en navigatie. | Renderen van de som, antwoordinvoer en feedbackstate. |
| Antwoordverwerking | Server-side opslaan van voortgang, timing, totalen en afgeronde vragen. | Interpreteren van invoer, bepalen van correctheid en bijgewerkte vraagstate. |
| Hervatten | Ophalen van bestaande run en progressieregels. | Opnieuw kunnen renderen op basis van opgeslagen vraagstate. |
| Geschiedenis en resultaten | Tonen van uniforme statistieken, totalen en runcontext. | Leveren van modulespecifieke detailrepresentatie wanneer nodig. |
| Live meekijken | Distribueren van actuele runstatus via generieke voortgangsbron. | Renderbare vraagstate beschikbaar houden via de opgeslagen modulepayload. |
3.2 Docentgedrag
De docentweergave wordt geopend binnen de generieke configuratiecontainer Module configureren. De container toont welke technische module gekozen is; de concrete configuratievelden worden door de module geleverd via het modulecontract. De docent configureert hiermee een concrete oefening, niet de technische module zelf.
De bovenste kaart bevat generieke oefeninggegevens: de naam van de oefening, het icoon en de keuze welke somtypen beschikbaar zijn. Naam en icoon horen bij Exercises; de keuze voor somtype hoort bij de modulespecifieke configuratiepayload. De zichtbare voorbeeldwaarden in de mockup, zoals Optellen en aftrekken t/m 20, zijn invoervoorbeelden en mogen niet als vaste productiegegevens worden geïnterpreteerd.
Daarna toont de module de getalposities. De labels getal 1 en getal 2 verwijzen naar de positie in de som: getal 1 + getal 2 of getal 1 - getal 2. Deze uitleg is nodig omdat de docent bij optellen en aftrekken dezelfde veldnamen ziet, terwijl de betekenis voor uitkomstvalidatie verschilt.
Voor Optellen configureren kan de docent voor getal 1 en getal 2 kiezen tussen een min/max-bereik of exacte toegestane waarden. Per getal is steeds precies één invoermodus actief. De niet-actieve modus wordt visueel gedimd en mag server-side niet worden meegenomen alsof die actief is. De uitkomstconfiguratie begrenst de toegestane somuitkomst.
Voor Aftrekken configureren gelden dezelfde keuzemogelijkheden. Aanvullend toont de module een waarschuwing dat een minimale uitkomst van ten minste 0 voorkomt dat negatieve uitkomsten worden gegenereerd. Dit is een functionele hulptekst; de echte geldigheid van een gegenereerde vraag wordt door de modulevalidatie en vraaggeneratie afgedwongen.
De sectie Optellen en Aftrekken balans configureren is alleen functioneel relevant wanneer OperationMode = Both. De sliders leggen een minimale ondergrens vast voor het aandeel optel- en aftreksommen. Het restant wordt door de module random ingevuld binnen de overige configuratieregels. Per somtype geldt in de mockup een bovengrens van 50%, zodat altijd ruimte blijft voor random opvulling of voor het andere somtype.
De sectie Oefening instellingen bevat oefeningbrede generatie- en runtime-instellingen. De docent kan beperkingen instellen voor veelvoorkomende patronen, zoals sommen met 1 als operand of hele tientallen. Daarnaast kan de docent standaard, minimum en maximum aantal vragen vastleggen. De leerling mag bij het starten van een run een aantal vragen kiezen binnen die grenzen; het systeemmaximum is 100. De opties Geen idee en Toon antwoord direct na vraag beïnvloeden de runtimeweergave bij leerlingen.
De knop Terug naar overzicht sluit de configuratie zonder opslag en keert terug naar de generieke modulekeuze. De knop Opslaan en toevoegen voert eerst generieke autorisatie en modulespecifieke validatie uit. Pas bij succesvolle validatie wordt de concrete oefening opgeslagen, gekoppeld aan de huidige categoriecontext en aangemaakt in status In onderhoud.
3.3 Leerlinggedrag
De leerlingweergave toont één vraag tegelijk binnen de generieke oefenplayer. In de default state wordt een som getoond met twee operanden, een operator en een antwoordinvoer. De zichtbare mockupwaarde 17 + 9 = ? is gegenereerde voorbeelddata. In productie worden operandwaarden, operator en correcte uitkomst bepaald door de module op basis van de opgeslagen configuratiepayload van de concrete oefening.
De leerling vult het antwoord in en kiest Volgende vraag. Bij die actie wordt het antwoord server-side verwerkt. De module interpreteert de invoer, bepaalt of het antwoord correct is en levert de bijgewerkte vraagstate terug. De generieke engine schrijft de voortgang weg in ExerciseRunProgress, werkt uniforme totalen op ExerciseRuns bij en bepaalt of de volgende vraag of de afrondingsflow wordt getoond.
Wanneer ShowAnswerAfterSubmit = true, kan de module direct na beantwoording een feedbackstate tonen. De state correct antwoord toont het gegeven antwoord groen met de tekst Goed gedaan!. De state fout antwoord toont het gegeven antwoord rood met de tekst Helaas het antwoord was niet goed. Deze feedbackstates zijn geen aparte routes en geen aparte oefenruns; zij zijn weergavestates van dezelfde vraag binnen dezelfde run.
Wanneer ShowAnswerAfterSubmit = false, wordt na beantwoording direct doorgegaan volgens de generieke runflow en ziet de leerling de samenvattende resultaten pas in de resultaatcontext. De module moet in beide gevallen de juiste correctheidswaarde en vraagstate aan de generieke engine teruggeven.
De rechterkolom is generiek en toont voortgangsinformatie: de naam/context van de oefening, het aantal beantwoorde vragen, de visuele voortgangsbalk en een tip over opslag en hervatten. Deze waarden komen niet uit de module zelf, maar uit de runcontext en de generieke voortgangsberekening.
Als AllowMarkAsDunno = true, mag de generieke player of de modulecomponent een Geen idee-actie beschikbaar maken. Deze actie markeert de vraag als afgerond met IsDunno = true en telt functioneel als niet-correct antwoord, maar blijft herkenbaar in resultaten en analyse.