Objectgericht programmeren (B-KUL-H01P1A)

Doelstellingen
De focus van dit OPO ligt op de belangrijkste methode voor het beheersen van de complexiteit van de ontwikkeling, het onderhoud, en de evolutie van middelgrote en grote softwaresystemen: modulair programmeren. In het modulair programmeren wordt het softwaresysteem opgedeeld in modules, elk voorzien van een duidelijke en abstracte specificatie die de syntax en het gedrag definieert van de programmeerinterface of API die de module aanbiedt aan haar klant-modules, zodanig dat de correctheid van een klant-module nagegaan kan worden louter op basis van de specificatie, niet de implementatie, van de modules die ze gebruikt. Hierdoor kan elke module onafhankelijk van en gelijktijdig met de andere modules ontwikkeld, begrepen, geverifieerd en bijgewerkt worden. De belangrijkste modularisatie-aanpak is abstractie, waarbij de module de programmeertaal uitbreidt met extra bewerkingen (procedurale abstractie) of datatypes (data-abstractie).
De beginselen van het modulair programmeren worden aangebracht in de context van de objectgerichte programmeertaal Java.
Op het einde van de cursus moeten studenten in staat zijn om:
- Een middelgroot softwaresysteem te ontwerpen als een compositie van procedurale abstracties en data-abstracties, desgevallend gebruikmakend van overervingshiërarchieën.
- De nodige documentatie te verzorgen voor de modules van een middelgroot softwaresysteem. Concreet leren studenten hoe zowel informele, natuurlijke talen, als meer formele notaties kunnen gebruikt worden in de documentatie van klassen en methodes.
- De implementatie uit te werken voor een middelgroot softwaresysteem in Java.
- De correctheid van een middelgroot softwaresysteem te verifiëren. Op de eerste plaats leren studenten hoe op een systematische manier kan geredeneerd worden over de correctheid van diverse stukken code. Verder krijgen ze inzicht in strategieën om de correcte werking van een softwaresysteem op een systematische manier te testen.
Aan de cursus is een project gekoppeld waar studenten leren de principes van het modulair objectgericht programmeren correct en rigoreus toe te passen. Daarnaast leren ze om te gaan met een stijgende complexiteit in de ontwikkeling van softwaresystemen, en met niet volledig exact gespecificeerde beschrijvingen.
Begintermen
- Basisbeginselen van imperatief programmeren met inzicht in het iteratief en recursief ontwikkelen van algoritmes.
- Basisbeginselen van eerste-orde logica.
Volgtijdelijkheidsvoorwaarden
Dit opleidingsonderdeel is een voorwaarde voor het opnemen van volgende opleidingsonderdelen:
H01Q3A : P&O Computerwetenschappen, hoofdrichting (Niet meer aangeboden dit academiejaar)
H01Q3C : P&O: computerwetenschappen
Identieke opleidingsonderdelen
Dit opleidingsonderdeel is identiek aan de volgende opleidingsonderdelen:
X0A27A : Objectgericht programmeren
Plaats in het onderwijsaanbod
- Voorbereidingsprogramma: Master in de ingenieurswetenschappen: wiskundige ingenieurstechnieken (Leuven) 29 sp.
- Bachelor in de informatica (Leuven) 180 sp.
- Bachelor in de wiskunde (Leuven) (Minor informatica) 180 sp.
- Bachelor in de wiskunde (Leuven) (Minor onderwijs) 180 sp.
- Bachelor in de fysica (Leuven) (Minor sterrenkunde en informatica) 180 sp.
- Master handelsingenieur in de beleidsinformatica (Leuven) 120 sp.
- Master in de ingenieurswetenschappen: wiskundige ingenieurstechnieken (Leuven) 120 sp.
- Master in de ingenieurswetenschappen: biomedische technologie (Leuven) 120 sp.
- Voorbereidingsprogramma: Master in de ingenieurswetenschappen: computerwetenschappen (Leuven) 61 sp.
- Bachelor handelsingenieur in de beleidsinformatica (Leuven) 180 sp.
- Bachelor handelsingenieur in de beleidsinformatica (Leuven) (Major: Beleidsinformatica) 180 sp.
- Master of Mathematical Engineering (Leuven) 120 sp.
- Educatieve master in de wetenschappen en technologie (Leuven) 120 sp.
- Bachelor in de ingenieurswetenschappen (programma voor studenten gestart vóór 2024-2025) (Leuven) (Hoofdrichting computerwetenschappen) 180 sp.
- Bachelor in de ingenieurswetenschappen (programma voor studenten gestart vóór 2024-2025) (Leuven) (Nevenrichting computerwetenschappen) 180 sp.
- Bachelor in de ingenieurswetenschappen (programma voor studenten gestart in 2024-2025 of later) (Leuven) (Afstudeerrichting computerwetenschappen) 180 sp.
- Bachelor in de ingenieurswetenschappen (programma voor studenten gestart in 2024-2025 of later) (Leuven) (Keuzepakket H) 180 sp.
- Voorbereidingsprogramma: Master in de ingenieurswetenschappen: artificiële intelligentie (Leuven) 46 sp.
Onderwijsleeractiviteiten
4 sp. Objectgericht programmeren: hoorcollege (B-KUL-H01P1a)
Inhoud
De cursus behandelt uitsluitend het objectgerichte paradigma voor het ontwikkelen van softwaresystemen. Daartoe wordt gebruik gemaakt van Java als programmeertaal, gekoppeld aan een kleine subset van de modelleertaal UML voor het visualiseren van het ontwerp. In de documentatie wordt verder gebruik gemaakt van een beperkte vorm van eerst-orde logica om bepaalde aspecten op een meer formele manier te kunnen uitdrukken.
De inhoud van de cursus omvat vier grote delen. Een eerste deel behandelt de definitie van procedurale abstracties alsook de eenvoudigste soort data-abstracties, nl. één-object-abstracties, die gerealiseerd worden door één klasse waarvan elk object overeenkomt met een aparte instantie van de abstractie. Daarbij wordt de nodige aandacht besteed aan het behandelen van randgevallen in de definitie van methodes. In een tweede deel wordt ingegaan op de ontwikkeling van hiërarchieën van klassen. Het principe van behavioral subtyping staat daarin centraal. Het derde deel gaat over graafabstracties, waarbij een graaf van entiteiten uit het probleemdomein met hun relaties voorgesteld wordt door een verzameling van objecten verbonden door middel van bidirectionele associaties. Een laatste deel behandelt de ontwikkeling van geneste klassen en van generische klassen.
1. Eén-object-abstracties
Een essentieel element in de ontwikkeling van grote en middelgrote softwaresystemen is de opdeling in een aantal modules. Klassen spelen daarin een essentiële rol. Ze introduceren een verzameling van objecten samen met een geheel van bewerkingen die op die objecten toepasbaar zijn. In dit deel van de cursus wordt de notie van een klasse uitgediept en worden de concepten bestudeerd hoe ze op het niveau van objectgerichte programmeertalen kunnen worden ontwikkeld. Belangrijke aspecten in deze studie zijn:
- De specificatie van een klasse: het vastleggen van de signatuur van methodes en een omschrijving van de semantiek in termen van precondities, postcondities, uitzonderingen en invarianten.
- De implementatie van een klasse: het bepalen van een geschikte interne representatie en het realiseren van het effect van de gespecificeerde methodes.
- De verificatie van een klasse aan de hand van een studie van diverse strategieën voor het systematisch testen van softwaresystemen.
- Het omgaan met uitzonderlijke omstandigheden via de paradigma's van het defensief programmeren en het contractueel programmeren.
- De encapsulatie van de representatie van een klasse, en de gevaren van de blootstelling van representatie-objecten aan de klant.
2. Overerving
Objectgerichte programmeertalen ondersteunen de definitie van nieuwe klassen als speciale gevallen van bestaande klassen. Dit geeft aanleiding tot een hiërarchische structuur, die ook tijdens de uitvoering van het programma kan worden uitgebuit. Belangrijke aspecten in dit deel zijn:
- Abstracte superklassen ter veralgemening van een stel concrete klassen.
- Polymorfisme en dynamische binding als mechanismen om klantcode te ontkoppelen van de concrete klasse van een object.
- Gedragssubtypering (behavioral subtyping) als een algemene leidraad in de ontwikkeling van hiërarchiëen.
- Implementatie-overerving om een klasse te definiëren als een uitbreiding of aanpassing van een bestaande klasse.
- Meervoudige overerving als middel om een nieuwe klasse af te leiden van één bestaande klasse en een onbeperkt aantal interfaces.
3. Graafabstracties
Zeer dikwijls moet een computerprogramma gegevens verwerken in de vorm van een graaf: een stel entiteiten voorzien van relaties en attributen. In een objectgericht programma wordt een graaf typisch voorgesteld door middel van een stel objecten verbonden door bidirectionele associaties. In dit deel wordt ingegaan op de realisatie van dergelijke graafabstracties. Belangrijke onderwerpen in dit verband zijn:
- Eénklassige graafabstracties, waarbij alle entiteiten van eenzelfde type zijn.
- Meerklassige graafabstracties, en het encapsuleren van meerklassige modules door middel van packages en default accessibility.
- Genestelde abstracties: het opbouwen van abstracties geëncapsuleerd op package-niveau uit abstracties geëncapsuleerd op klasseniveau.
4. Geavanceerde taalconstructies
In moderne programmeertalen kunnen klassen gedefinieerd worden binnen het lichaam van andere klassen, wat resulteert in de notie van geneste klassen. Sinds versie 8 biedt Java ondesteuning voor aspecten van het functioneel programmeren via streams en lambda-uitdrukkingen. Klassen kunnen ook geparameteriseerd worden, wat resulteert in de notie van generische klassen. Meestal beperken argumenten van generische klassen zich tot types. In dit deel worden de typische elementen bestudeerd die aan bod komen in de ontwikkeling van geneste klassen en van generische klassen.
- Studie van iteratoren als generische instrumenten om gegevensstructuren op allerlei manieren te doorlopen.
- Studie van geneste klassen, met de nadruk op de definitie van anonieme klassen.
- Studie van lambda-uitdrukkingen als een middel om functies door te geven aan methodes.
- Definitie en instantiatie van generische klassen.
- Definitie van beperkingen op parameters van generische klassen.
Studiemateriaal
- Handboek: Prof. Jacobs bereidt een nieuwe cursustekst voor, die vanaf academiejaar 2019-2020 gebruikt zal worden.
- Toledo: modeloplossingen van oefeningen, projectopgave, verwijzingen naar softwarewerktuigen en aanvullende literatuur op Toledo.
Toelichting werkvorm
In een 13-tal sessies wordt de behandelde materie doorgenomen aan de hand van een typisch probleem. De oplossing voor het gestelde probleem wordt interactief uitgewerkt in het auditorium. Van de studenten wordt verwacht dat ze vooraf de behandelde materie hebben doorgenomen in de cursustekst. Ieder probleem wordt op het einde van de sessie uitgebreid met een vrijblijvende huistaak. Van ieder probleem (inclusief de huistaak) wordt achteraf een modeloplossing ter beschikking gesteld.
2 sp. Objectgericht programmeren: praktijk (B-KUL-H01P2a)
Toelichting werkvorm
De cursus wordt aangevuld met een project, waarvan de opgave stapsgewijze verspreid wordt. Het project wordt bij voorkeur uitgewerkt in groepjes van 2 studenten, volgens de principes van Extreme Programming. Gedurende het ganse project kunnen studenten voor een vooraf opgegeven aantal uren terecht bij een team van begeleiders. Het project bepaalt, samen met het schriftelijk examen, het resultaat voor het OPO.
- Deel 1: ontwikkeling van één-object-abstracties.
- Deel 2: ontwikkeling van klassenhiërarchieën.
- Deel 3: ontwikkeling van graafabstracties.
De deadlines en het relatieve gewicht van de drie delen wordt bekendgemaakt via Toledo.
Evaluatieactiviteiten
Evaluatie: Objectgericht programmeren (B-KUL-H21P1a)
Toelichting
De evaluatie bestaat uit twee luiken: een project tijdens het semester, en een individueel schriftelijk examen op PC tijdens de examenperiode. Om te slagen voor het OPO moet de student slagen voor het project én voor het schriftelijk examen.
De opgave voor het project wordt in de loop van het semester in 3 opeenvolgende stappen opgegeven. Elke volgende opgave wordt vrijgegeven na de deadline voor indiening van de oplossing van de vorige opgave. De finale oplossing moet ingeleverd worden tegen het einde van het semester.
- Precieze informatie over de timing verschijnt op Toledo en in de opgave van de diverse delen.
- Het project wordt bij voorkeur uitgewerkt in groepjes van 2 studenten. Studenten die ervoor kiezen het project alleen te maken moeten rekening houden met een verhoogde werklast: de opgave wordt voor hen slechts licht of helemaal niet gereduceerd.
- Het resultaat voor het project is het gewogen gemiddelde van een resultaat per deel, met gewichten die worden bekendgemaakt via Toledo.
Het schriftelijk examen is gesloten boek en toetst de kennis van, het inzicht in, en de vaardigheid bij het toepassen van de begrippen en principes van het OPO, aan de hand van verschillende soorten vragen, waaronder bijvoorbeeld:
- invulvragen waarbij de theorie- en terminologiekennis getoetst wordt;
- programmeertaken waarbij de student een handvol bladzijden Java-code en documentatie moet intikken op een PC.
Het resultaat voor het OPO (vóór afronding) is het gemiddelde van het resultaat voor het project en het resultaat voor het schriftelijk examen, behalve als het resultaat voor het project of het resultaat voor het schriftelijk examen (of beide) kleiner is dan 10/20. In dat geval is het resultaat voor het OPO het minimum van het resultaat voor het project en het resultaat voor het schriftelijk examen. (Merk op: enkel het resultaat voor het OPO als geheel wordt afgerond; deelcijfers worden niet afgerond.)
Toelichting bij herkansen
Wie niet geslaagd is voor het OPO in juni, kan deelnemen aan de herkansing van het project, aan de herkansing van het schriftelijk examen, of aan beide, naar keuze.
Merk op: studenten moeten zich inschrijven voor de herkansing voor dit OPO, zelfs als ze enkel deelnemen aan de herkansing van het project.
Voor de septemberzittijd wordt een nieuwe projectopgave ("deel 4") verspreid. De deadline wordt bekendgemaakt via Toledo.
Studenten kunnen voor deze zittijd een nieuw team vormen. Ze kunnen ook opteren om het project alleen af te werken.
Het resultaat voor de herkansing van het project vervangt (als de student een oplossing indient) het resultaat voor het project in juni, ook als het slechter is.
Het resultaat voor de herkansing van het schriftelijk examen vervangt het resultaat voor het schriftelijk examen in juni, tenzij het slechter is.
Het resultaat voor het OPO wordt op dezelfde wijze berekend als in juni.