Objectgericht programmeren (B-KUL-H01P1A)

6 studiepuntenNederlands36 urenTweede semester
Jacobs Bart (coördinator) |  Devriese Dominique |  Jacobs Bart
POC Informatica

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.

  • Basisbeginselen van imperatief programmeren met inzicht in het iteratief en recursief ontwikkelen van algoritmes.
  • Basisbeginselen van eerste-orde logica.


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

Dit opleidingsonderdeel is identiek aan de volgende opleidingsonderdelen:
X0A27A : Objectgericht programmeren

Onderwijsleeractiviteiten

4 sp. Objectgericht programmeren: hoorcollege (B-KUL-H01P1a)

4 studiepuntenNederlandsWerkvorm: College32 urenTweede semester
POC Informatica

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.

  • 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.

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)

2 studiepuntenNederlandsWerkvorm: Opdracht4 urenTweede semester
POC Informatica

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)

Type : Partiële of permanente evaluatie met examen tijdens de examenperiode
Evaluatievorm : Schriftelijk, Ontwerp/Product
Vraagvormen : Open vragen
Leermateriaal : Geen


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.)

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.