← Back to CoursesStemExpert
StemExpert
Expert · Oplossingen · 35. Objectgericht programmeren en softwareontwerp
StemExpert · Brecht Corbeel · schoolium.me
StemExpert
E35. Objectgericht programmeren en softwareontwerp — oplossingen
EExpert · deel E7 · Informatica

Oplossingen · hoofdstuk 35Objectgericht programmeren en softwareontwerp

Software groeit door duidelijke contracten, vervangbare onderdelen en aantoonbaar gedrag

Uitgewerkte oplossingen bij de 9 opdrachten van het werkboek. Voor de leerkracht, en voor wie zichzelf wil verbeteren nadat hij het eerst zelf probeerde.

3× oefenen3× toepassen3× uitdagen± 290 min
Een softwaregrens maakt een sensor verwisselbaar zonder de regelwet te herschrijven.
Een softwaregrens maakt een sensor verwisselbaar zonder de regelwet te herschrijven.
Voor de leerkrachtDeze pagina bevat de antwoorden. Druk het werkboek af zonder deze pagina.
Oefenen

Oefenen

één stap, direct toepassen
35.1

Twee objecten, één foutlijst

Oefenen6Analyseren25 min
Een klasse definieert fouten=[] buiten __init__.
  1. a
    Leg uit wat er gebeurt als s1.fouten.append('oud') wordt uitgevoerd. Herstel het ontwerp.
    s1 en s2 vinden dezelfde klasse-lijst; s2 ziet 'oud' ook. Zet self.fouten=[] in __init__, zodat elke instantie een eigen lijst krijgt. Als een collectief alarmregister bedoeld is, benoem het expliciet als apart registerobject met eigenaar.
35.2

Een eenheid in het contract

Oefenen6Rekenen25 min
De sensor levert 291,15 K; de regelaar verwacht graden Celsius en setpoint 20 °C, Kp 200 W/K.
  1. a
    Bereken de correcte vraag en toon de fout bij blind doorgeven.
    291,15−273,15=18,00 °C, dus e=2 K en u=400 W. Blind: e=20−291,15=−271,15 en de begrenzing maakt u=0 W. De fout is een interfacefout, geen PID-afstelling.
35.3

Is of heeft

Oefenen6Begrijpen25 min
Een kamerregelaar gebruikt een SHT31 en een SSR.
  1. a
    Kies overerving of samenstelling en motiveer met het substitutiecontract.
    Samenstelling: Regelaar heeft Sensor en Actuator. Hij kan niet zelf als SHT31 gebruikt worden; zijn stap() produceert een warmtevraag, geen meetrecord. Verschillende adapters kunnen wel dezelfde Sensor-interface implementeren.
Toepassen

Toepassen

meerdere stappen, in een context
35.4

Leeftijd exact op de grens

Toepassen7Programmeren25 min
Het contract staat leeftijden van 0 tot en met 5 s toe.
  1. a
    Schrijf tests op −0,1; 0; 5; 5,1 s en voor NaN. Geef het verwacht gedrag.
    Maak vaste meetrecords en kies nu=10. Leeftijd −0,1 betekent toekomsttijd: ValueError. 0 en 5 zijn toegestaan: bij 18 °C 400 W. 5,1 wordt geweigerd. NaN wordt door isfinite geweigerd. Gebruik assertRaises voor fouten en assertEqual voor 400 W; test desgewenst aparte kalendertijd zonder deze monotone klok te vermengen.
35.5

Een methode blokkeert

Toepassen7Analyseren25 min
Een wifi-sensor duurt soms 800 ms; lees() had maximaal 5 ms beloofd.
  1. a
    Beschrijf hoe de contractbreuk de regeling raakt en herstel de architectuur.
    Een vervanging houdt de methodenaam maar niet de timingbelofte: de regelaar mist zijn deadline. Lees netwerkdata in een afzonderlijke begrensde taak, bewaar een immutable laatste record en laat lees() dat record snel leveren. Oude data wordt expliciet geweigerd. Een langere timeout binnen de regelaar maakt de deadline nog slechter.
35.6

Wat zit in de commit?

Toepassen7Begrijpen25 min
Je voert git add model.py uit, wijzigt model.py opnieuw en doet git commit.
  1. a
    Welke versie wordt vastgelegd? Geef een veilige reviewvolgorde.
    De versie op het moment van git add zit in de index en wordt gecommit; latere edits blijven in de werkmap. Bekijk git diff, selecteer opnieuw met git add als nodig, inspecteer git diff --staged, draai tests op de bedoelde versie en commit. git status toont resterende wijzigingen. Een commit kan dus geslaagd zijn terwijl de werkmap nog verschilt.
Uitdagen

Uitdagen

transfer, open problemen, leerlijnen combineren
35.7

Van lange functie naar ontwerp

Uitdagen9Ontwerpen55 min
Een functie leest I²C, rekent PID, stuurt MQTT, schrijft een SD-kaart en schakelt de pomp.
  1. a
    Verdeel verantwoordelijkheden en leg ten minste vier interfacecontracten vast. Toon welke integratietest een unit test aanvult.
    Adapters leveren immutable Meting met eenheid/tijd/kwaliteit. Regelaar.stap(r,m,dt) levert begrensde W. Supervisor verwerkt alarmbits en bepaalt modus; één actuatoradapter schrijft het fysieke bevel. Logger accepteert record plus manifest-ID; transport levert berichten met ontvangst, verval en sequence. Integratietest: een oude MQTT-setpoint wordt geweigerd, lokaal alarm verhindert pompen en de logger registreert weigering met juiste versie. De unit test van PID bewijst dit signaalpad niet.
Zo wordt dit beoordeeld
grenzenHardware, beslislogica en opslag onafhankelijk.
contractEenheid, tijd, fouten en eigenaar benoemd.
bewijsIntegratietest verbindt minstens twee onderdelen.
35.8

Stationssoftware vrijgeven

Uitdagen9Habitat60 min
De predictor wordt vervangen, terwijl de klimaatmodule moet blijven regelen.
  1. a
    Ontwerp een release- en terugrolprocedure met manifest, toetsing en actor-eigenaarschap.
    Leg modelchecksum, codecommit, configuratie en kalibratie vast. Draai tests en replay op bevroren data, vervolgens schaduwmodus: nieuwe voorspellingen loggen zonder actuatoren. Vergelijk fout en deadlines met acceptatiecriteria. Installeer met atomair wisselen van een versiereferentie; behoud vorige combinatie. De supervisor begrenst voorstellen; Mega blijft lokale eigenaar. Bij ontbrekende of ongeldige voorspelling werkt de vaste regelstrategie verder. Test terugrol met dataformaten en stuur geen dubbel pompbevel. Log wie en welke release is geactiveerd.
Zo wordt dit beoordeeld
reproduceerbaarheidAlle code-, data-, model- en configuratieversies vast.
veiligheidLokale sturing blijft eigenaar en begrenst.
terugrolVorige versie en migratiepad aantoonbaar getest.
35.9

Een groene testset tegenspreken

Uitdagen9Onderzoeken25 min
Alle tests slagen, maar elke test berekent verwacht vermogen met precies dezelfde functie als productie.
  1. a
    Leg uit waarom dit zwak bewijs is en ontwerp onafhankelijke orakels en minstens één mutatietest.
    Verwacht en werkelijk delen dezelfde fout: de vergelijking is tautologisch. Gebruik handberekende gevallen: 18 °C → 400 W, 23 °C → 0 W, 0 °C → 2000 W. Gebruik procesinvarianten: 0≤u≤2000 en stijgende y mag de P-vraag niet verhogen. Verander tijdelijk het min/max of de leeftijdsgrens in een kopie; minstens een test moet falen. Een niet gedetecteerde mutatie toont een gat. Test ook een echte adapter apart met bekende sensorinvoer.