Skip to main content

1. Moduleplatform en contract

1.1 Doel van dit hoofdstuk

Dit hoofdstuk beschrijft de generieke uitgangspunten voor technische oefenmodules binnen OefenHub. De afzonderlijke moduledossiers, zoals Optellen & Aftrekken (simpel), beschrijven daarna alleen nog de module-specifieke configuratie, leerlingweergave, states en JSON-invulling.

Technische modules zijn uitbreidbare oefencomponenten. Zij leveren de inhoudelijke logica voor een oefening, terwijl de generieke OefenHub-engine verantwoordelijk blijft voor autorisatie, opslag, navigatie, voortgang, geschiedenis, resultaten, PDF-export en live meekijken.

Dit hoofdstuk voorkomt dat dezelfde basisregels per module opnieuw worden uitgewerkt.

1.2 Afbakening

Een technische module is niet hetzelfde als een concrete oefening.

BegripBetekenis
Technische moduleHerbruikbare codecomponent/library die configuratie, vraaggeneratie, validatie en rendering levert.
Concrete oefeningDoor een docent aangemaakte oefening op basis van precies één technische module.
Practice / exercise runEén door een leerling of docent gestarte uitvoering van een concrete oefening.
ConfiguratiepayloadModule-specifieke instellingen van een concrete oefening, generiek opgeslagen bij de oefening.
VraagpayloadModule-specifieke vraag- en antwoorddata binnen een exercise run.

1.3 Generieke uitgangspunten

Voor alle technische modules gelden de volgende uitgangspunten:

  • Een concrete oefening verwijst altijd naar precies één ExerciseModules-record.
  • Beschikbare modules worden administratief beheerd via ExerciseModules.
  • De modulelijst in de docentflow is databasegedreven.
  • De modulebeschrijving, configuratiecomponent en modulespecifieke leerlingweergave komen runtime uit de technische module/library.
  • De generieke applicatie slaat configuratie en vraagdata op als payload, zonder alle modulevelden relationeel uit te splitsen.
  • Modules leveren inhoudelijke validatie; de generieke engine verzorgt opslag, voortgang, navigatie en autorisatie.
  • Een nieuw aangemaakte oefening start standaard in status In onderhoud.
  • Moduleconfiguraties moeten versieerbaar zijn, zodat latere migratie of backwards compatibility mogelijk blijft.

1.4 Relatie met docentflow Nieuwe oefening

De docentflow Nieuwe oefening toevoegen bestaat generiek uit twee stappen:

  1. Module kiezen
    De docent kiest een technische module uit de databasegedreven lijst met beschikbare modules.

  2. Module configureren
    De generieke container opent de configuratiecomponent van de gekozen module. De inhoud van deze configuratie is module-specifiek, maar opslaan verloopt via dezelfde generieke opslagactie.

Deze opzet betekent dat de generieke docentflow niet aangepast hoeft te worden voor iedere nieuwe oefenmodule, zolang de module voldoet aan het centrale modulecontract.

1.5 Verantwoordelijkheden

1.5.1 Verantwoordelijkheid technische module

Een technische module levert minimaal:

  • een stabiele technische sleutel;
  • een configuratieschemaversie;
  • een beschrijvingscomponent voor de modulekeuze;
  • een docentconfiguratiecomponent;
  • een configuratie-DTO of schema;
  • validatie van de configuratie;
  • vraaggeneratie op basis van configuratie;
  • antwoordvalidatie;
  • leerling-rendering voor de vraag;
  • feedbackstate voor correct en fout;
  • optioneel renderhulp voor resultaatweergave, history en PDF-export.

1.5.2 Verantwoordelijkheid generieke OefenHub-engine

De generieke engine levert minimaal:

  • ophalen van beschikbare modules uit ExerciseModules;
  • openen van de juiste modulecomponent via strategy/factory;
  • centrale opslag van Exercises;
  • koppeling van oefening aan niveau/categorie;
  • opslag van configuratiepayload;
  • starten en hervatten van ExerciseRuns;
  • opslag van vraagvoortgang na iedere bevestigde stap;
  • berekening en opslag van uniforme runstatistieken;
  • geschiedenis, resultaatweergave, PDF-export en live meekijken;
  • autorisatiecontrole voor docent, collaborator, leerling en meekijker.

1.6 Modulecontract

Elke technische module moet functioneel voldoen aan een generiek contract. De exacte technische interface kan later in code worden uitgewerkt, maar functioneel moet minimaal onderstaande informatie beschikbaar zijn.

OnderdeelVerantwoordelijke laagDoel
Module metadataModule + ExerciseModulesModule herkenbaar en selecteerbaar maken.
BeschrijvingModuleDocent informeren vóór configuratie.
Configuratie UIModuleDocent laat module-specifieke instellingen invullen.
ConfiguratievalidatieModuleControleren of instellingen inhoudelijk uitvoerbaar zijn.
ConfiguratieopslagEnginePayload opslaan bij concrete oefening.
VraaggeneratieModuleVragen maken op basis van configuratie.
VraagopslagEngineGegenereerde vraagdata bewaren in runpayload.
AntwoordvalidatieModuleAntwoord beoordelen als goed, fout of eventueel geen idee.
VoortgangEngineVraagstatus, runstatus en totalen bijwerken.
FeedbackrenderingModule + EngineState correct/fout tonen binnen generieke player.
Resultaat/historyEngine + optionele module renderhulpHistorische resultaten reproduceerbaar tonen.

1.7 Strategy pattern en runtime laden

OefenHub gebruikt functioneel een strategy/factory-achtige opzet om technische modules dynamisch te laden.

De database bepaalt welke module beschikbaar is en welke technische sleutel daarbij hoort. De module-library bepaalt hoe die module zich gedraagt.

Minimale flow:

  1. De docent kiest een record uit ExerciseModules.
  2. De generieke engine gebruikt de technische referentie om de juiste module-strategy te vinden.
  3. De module levert de beschrijving en configuratiecomponent.
  4. Bij opslaan valideert de module de configuratie.
  5. De engine slaat de concrete oefening en configuratiepayload op.
  6. Bij starten van een run laadt de engine opnieuw de module-strategy.
  7. De module genereert vragen en valideert antwoorden.
  8. De engine bewaart voortgang en uniforme totalen.

Modules mogen de generieke autorisatie-, opslag- en navigatieregels niet omzeilen.

1.8 Configuratiepayload

Modulespecifieke configuratie wordt generiek opgeslagen als payload bij de concrete oefening. Deze payload moet versieerbaar en uitbreidbaar zijn.

Minimale structuur:

{
"moduleKey": "VoorbeeldModule_v1",
"schemaVersion": "1.0",
"display": {
"exerciseName": "Voorbeeld oefening",
"icon": "example"
},
"configuration": {},
"runtimeOptions": {
"allowMarkAsDunno": true,
"showAnswerAfterSubmit": true
}
}

De exacte inhoud van configuration is eigendom van de technische module. De generieke engine hoeft deze inhoud niet relationeel te begrijpen, maar moet de payload wel kunnen opslaan, teruggeven, historisch bewaren en aan de juiste module aanbieden.

1.9 Leerling runtime model

De leerlingweergave van modules werkt state-based. Alternatieve weergaven zoals input, correct antwoord en fout antwoord zijn states binnen dezelfde view en geen aparte schermroutes.

Minimale states:

StateBetekenis
InputVraag wordt getoond en leerling kan antwoord invullen.
CorrectAntwoord is bevestigd en goed beoordeeld.
IncorrectAntwoord is bevestigd en fout beoordeeld.
DunnoLeerling gebruikt Geen idee, wanneer toegestaan.
CompletedLaatste vraag is afgerond en resultaat kan worden geopend.

De generieke player regelt de overgang tussen states, maar de module levert de inhoudelijke vraagweergave en validatie.

1.10 Opslag en voortgang

Na iedere bevestigde antwoordstap moet de voortgang server-side worden opgeslagen. Dit is nodig voor:

  • hervatten van onderbroken oefeningen;
  • geschiedenis;
  • resultaatweergave;
  • PDF-export;
  • live meekijken;
  • betrouwbare runstatistieken.

De uniforme runvelden blijven leidend voor snelle uitlezing. Modulepayloads blijven beschikbaar voor detailweergave, reconstructie en module-specifieke rendering.

1.11 UI-elementen en velddefinities

Element-IDTypeGUI-verwijzingOmschrijvingZichtbaar labelOpmerkingTechnische naam
SCH-MOD-00-01-S01SModulekeuzeGenerieke sectie waarin beschikbare technische modules worden getoond.Beschikbare modulesDatabasegedreven lijst.ModuleSelectionSection
SCH-MOD-00-01-T01TModulekeuzeTabel/lijst met selecteerbare modules.Beschikbare modulesGebaseerd op ExerciseModules.AvailableModulesList
SCH-MOD-00-01-F01FModulelijstTechnische referentie van module.Technische referentieRead-only.ModuleCodeReference
SCH-MOD-00-01-F02FModulelijstFunctionele weergavenaam.WeergavenaamRead-only.ModuleDisplayName
SCH-MOD-00-01-A01AModulelijstSelecteert module.Module selecterenRuntime selectie.SelectModuleAction
SCH-MOD-00-01-S02SModuledetailBeschrijving van geselecteerde module.Detailoverzicht geselecteerde moduleKomt uit module-library.ModuleDescriptionSection
SCH-MOD-00-01-B01BModuledetailOpent configuratiecontainer.Selecteer en configureerAlleen actief na modulekeuze.OpenModuleConfigurationButton
SCH-MOD-00-01-MOD01MODConfiguratiecontainerGenerieke container waarin moduleconfiguratie wordt geladen.Module configurerenInhoud is module-specifiek.ModuleConfigurationContainer
SCH-MOD-00-01-FORM01FORMConfiguratiecontainerModule-specifieke configuratiecontext.n.v.t.Wordt geleverd door module.ModuleConfigurationForm
SCH-MOD-00-01-B02BConfiguratiecontainerTerug naar moduleoverzicht.Terug naar overzichtSluit zonder opslaan.BackToModuleOverviewButton
SCH-MOD-00-01-B03BConfiguratiecontainerSlaat oefening op.Opslaan en toevoegenCentrale opslagactie.SaveExerciseButton
SCH-MOD-00-01-S03SLeerlingplayerGenerieke oefencontainer voor leerling.OefeningEnginecontainer.StudentExercisePlayer
SCH-MOD-00-01-F03FLeerlingplayerModulevraagweergave.Module-afhankelijkKomt uit module.ModuleQuestionRenderOutput
SCH-MOD-00-01-F04FLeerlingplayerAntwoordinvoer.Module-afhankelijkKomt uit module of generieke inputcomponent.StudentAnswerInput
SCH-MOD-00-01-M01MLeerlingplayerFeedback na beantwoording.Goed / fout / geen ideeState-afhankelijk.AnswerFeedbackMessage
SCH-MOD-00-01-B04BLeerlingplayerBevestigt antwoord of navigeert verder.Volgende vraag / Toon antwoord / Bekijk resultaatTekst afhankelijk van runstate.NextStepButton

1.12 Waardelagen

Element-IDGUI-verwijzingZichtbaar labelTechnische naamDatabronWaardebronDatatypeBewerkbaarValidatie / regel
SCH-MOD-00-01-T01ModulekeuzeBeschikbare modulesAvailableModulesListExerciseModulesQuery op actieve/beschikbare technische modulesCollectieNee, selectie welAlleen modules die functioneel beschikbaar zijn mogen worden getoond.
SCH-MOD-00-01-F01ModulelijstTechnische referentieModuleCodeReferenceExerciseModules.CodeReferenceDatabasewaardeStringNeeMoet uniek genoeg zijn voor strategy-resolutie.
SCH-MOD-00-01-F02ModulelijstWeergavenaamModuleDisplayNameExerciseModules.DisplayNameDatabasewaardeStringNeeFunctionele naam voor docent.
SCH-MOD-00-01-S02ModuledetailDetailoverzicht geselecteerde moduleModuleDescriptionSectionGeen primaire databasebronRuntime output van module-library / strategyComponent-outputNeeMoet passen bij gekozen module.
SCH-MOD-00-01-MOD01ConfiguratiecontainerModule configurerenModuleConfigurationContainerGeen zelfstandige persistente bronRuntime state op basis van geselecteerde moduleUI-stateNeeMag pas openen na geldige modulekeuze.
SCH-MOD-00-01-FORM01Configuratiecontainern.v.t.ModuleConfigurationFormExercises.ConfigurationPayloadModulecomponent + directe docent-invoerForm object / payloadJaMoet door module gevalideerd worden.
SCH-MOD-00-01-B03ConfiguratiecontainerOpslaan en toevoegenSaveExerciseButtonExercises, TeacherLevelCategoryExercises, ExerciseHistoryCentrale submitactieCommandJaMaakt concrete oefening aan en koppelt deze aan huidige categoriecontext.
SCH-MOD-00-01-S03LeerlingplayerOefeningStudentExercisePlayerExerciseRunsRuntime runcontextUI-containerNeeAlleen toegankelijk bij geldige leerlingautorisatie.
SCH-MOD-00-01-F03LeerlingplayerModule-afhankelijkModuleQuestionRenderOutputExerciseRuns vraagpayloadDoor module gegenereerde vraagdataComponent-outputNeeVraagdata moet historisch reproduceerbaar blijven.
SCH-MOD-00-01-F04LeerlingplayerModule-afhankelijkStudentAnswerInputExerciseRuns voortgangspayloadLeerlinginvoerModule-afhankelijkJaAntwoord moet door module gevalideerd kunnen worden.
SCH-MOD-00-01-M01LeerlingplayerGoed / fout / geen ideeAnswerFeedbackMessageGeen zelfstandige primaire bronValidatieresultaat module + runstateInformatiemeldingNeeAlleen zichtbaar wanneer feedbackstate actief is.
SCH-MOD-00-01-B04LeerlingplayerVolgende vraag / Toon antwoord / Bekijk resultaatNextStepButtonExerciseRuns voortgangCommand op huidige vraagstateActionJaSlaat voortgang op na iedere bevestigde stap.

1.13 Moduleplatform-eisen en SRS-koppeling

Deze tabel bevat bijzondere module-eisen voor het generieke moduleplatform. Zij zijn geen gewone schermrequirements en ook geen extra centrale SRS-*-requirements. De eisen beschrijven het generieke moduleplatform en het contract waaraan iedere technische oefenmodule moet voldoen. De centrale dekking staat in het oefenmodule-eisenregister.

Module-eisClassificatieOmschrijving
REQ-SCH-MOD-00-01Moduleplatform-eisHet systeem moet technische modules administratief kunnen registreren in ExerciseModules.
REQ-SCH-MOD-00-02Moduleplatform-eisHet systeem moet een databasegedreven lijst van beschikbare modules kunnen tonen in de docentflow.
REQ-SCH-MOD-00-03Moduleplatform-eisPer module moeten minimaal technische referentie en functionele weergavenaam beschikbaar zijn.
REQ-SCH-MOD-00-04Moduleplatform-eisHet systeem moet op basis van een gekozen module de juiste strategy/library kunnen laden.
REQ-SCH-MOD-00-05Modulecontract-eisEen technische module moet een beschrijvingscomponent kunnen leveren voor de modulekeuze.
REQ-SCH-MOD-00-06Modulecontract-eisEen technische module moet een docentconfiguratiecomponent kunnen leveren.
REQ-SCH-MOD-00-07Modulecontract-eisEen technische module moet een configuratieschema of configuratie-DTO kunnen leveren.
REQ-SCH-MOD-00-08Modulecontract-eisEen technische module moet module-specifieke configuratie kunnen valideren.
REQ-SCH-MOD-00-09Moduleplatform-eisDe generieke engine moet gevalideerde configuratie als payload kunnen opslaan bij Exercises.
REQ-SCH-MOD-00-10Moduleplatform-eisEen concrete oefening moet altijd verwijzen naar precies één ExerciseModules-record.
REQ-SCH-MOD-00-11Moduleplatform-eisEen nieuwe oefening moet na opslaan gekoppeld worden aan de actuele niveau-/categoriecontext.
REQ-SCH-MOD-00-12Moduleplatform-eisEen nieuw aangemaakte oefening moet standaard starten in status In onderhoud.
REQ-SCH-MOD-00-13Modulecontract-eisEen technische module moet vragen kunnen genereren op basis van de opgeslagen configuratiepayload.
REQ-SCH-MOD-00-14Modulecontract-eisDe generieke engine moet gegenereerde vraagdata kunnen opslaan binnen een exercise run.
REQ-SCH-MOD-00-15Modulecontract-eisEen technische module moet leerlingantwoorden kunnen valideren.
REQ-SCH-MOD-00-16Modulecontract-eisDe leerlingplayer moet input-, correct-, fout- en eventuele geen-idee-states kunnen ondersteunen.
REQ-SCH-MOD-00-17Moduleplatform-eisDe generieke engine moet voortgang server-side opslaan na iedere bevestigde antwoordstap.
REQ-SCH-MOD-00-18Moduleplatform-eisHet systeem moet onderbroken exercise runs kunnen hervatten op basis van opgeslagen voortgang.
REQ-SCH-MOD-00-19Modulecontract-eisModulepayloads moeten historisch beschikbaar blijven voor resultaten, geschiedenis en PDF-export.
REQ-SCH-MOD-00-20Moduleplatform-eisModules mogen de generieke autorisatie-, opslag- en navigatieregels niet omzeilen.
REQ-SCH-MOD-00-21Modulecontract-eisHet modulecontract moet schemaVersion ondersteunen voor backwards compatibility en migratie.
REQ-SCH-MOD-00-22Moduleplatform-eisLive meekijken moet kunnen steunen op server-side opgeslagen voortgang, niet op uitsluitend clientstate.
REQ-SCH-MOD-00-23Moduleplatform-eisDe generieke engine moet uniforme runstatistieken kunnen opslaan onafhankelijk van de modulepayload.
REQ-SCH-MOD-00-24Modulecontract-eisModule-specifieke rendering mag optioneel ondersteuning leveren voor resultaatweergave en PDF-export.