Doel van deze lesbrief Deze lesbrief is bedoeld om je op de hoogte te brengen van de basisbegrippen die gangbaar zijn bij object georiënteerd programmeren (OOP). In deze lesbrief kom je korte codefragmenten tegen. Deze codefragmenten hebben betrekking op de talen PHP en C#.NET. Toch kan je deze lesbrief platformonafhankelijk gebruiken. Het idee van object georiënteerd programmeren is namelijk voor iedere programmeertaal gelijk. Let wel, het gaat hier om een eerste aanzet van OOP. De besproken begrippen vormen de basis van OOP. Later in je opleiding zal het stelsel van begrippen op dit gebied verder worden uitgebreid. Het kan zijn dat dit stelsel van begrippen jou al helemaal duidelijk is. Je kunt dit hoofdstuk dan overslaan of globaal doorlezen. Let op: hetgeen in dit hoofdstuk wordt behandeld, behoort tot de kennisvereisten van de studieroute OO (met de toetsen OO_PHP en OO.NET). Aan het eind van deze lesbrief wordt uitgelegd wat het nut van OOP is en vind je een aantal oefenopdrachten.
1.
Basisbegrippen bij object georiënteerd programmeren.
Voordat je object georiënteerd gaat programmeren volgt hier eerst een korte uitleg van de begrippen die je daarbij tegenkomt. Object Object georiënteerd programmeren is programmeren met objecten. Objecten kom je in de wereld om je heen overal tegen, zoals
De stoel waarop je zit. Het vervoermiddel waarmee je reist. Het huis waarin je woont.
Je kunt zo nog wel even doorgaan. Kortom: de wereld om je heen bestaat uit objecten. Objecten hoeven niet altijd stoffelijk te zijn, zoals de drie voorbeelden hiervoor. Zo kun je de volgende zaken ook als object zien:
Jouw bankrekening. De reservering van een hotel die ik heb gemaakt. Mijn domein pieterbrouwer.eu .
Bij het ontwikkelen van software en websites wordt geprobeerd de werkelijkheid waarvoor de software wordt geschreven zoveel mogelijk te benaderen. Dit is dan ook meteen het doel van object georiënteerd programmeren. Dit doel wordt gerealiseerd door in de programmeercode objecten te gebruiken. Een voorbeeld. Als je een webwinkel programmeert, dan kom je in de programmeercode objecten tegen met de naam klant, account, bestelling, product, enz.
1
In het vorige voorbeeld kunnen de genoemde objecten geen stoffelijke objecten zijn. In dit geval spreken we van softwareobjecten. Zo'n softwareobject is een stuk programmeercode waarin het object, zoals het in de werkelijkheid is, wordt beschreven. Dit laatste is nogal abstract en ontastbaar. Hoe dit alles in z'n werk gaat, leer je in de lesbrieven OO_PHP en OO.NET. Voorbeelden van softwareobjecten waarmee je ongetwijfeld weleens mee hebt gewerkt zijn:
Een specifieke snelkoppeling op je bureaublad. Een tekstvak waarin je een wachtwoord kunt invullen. De prullenbak (als onderdeel van je besturingssysteem). Een formulier, een knop of een listbox bij het ontwikkelen van een .NET applicatie.
Deze softwareobjecten zijn voorbeelden van objecten waarvan de programmeercode al voor jou gemaakt is. Het zijn onderdelen van een besturingssysteem, een programma of een website. Je gebruikt die objecten. Met de programmeercode achter deze objecten doe je niets of heb je niets te maken. Bij OOP daarentegen, kun je de programmeercode van de objecten wel zelf maken.
Klasse of class Een object is iets specifieks. Je ziet dit aan de manier van formuleren in de vorige paragraaf. Hier werd gesproken van jouw bankrekening en niet van een bankrekening. Een object is een verschijningsvorm van een algemeen begrip. Hieronder zie je nog een paar van dit soort voorbeelden. Algemeen begrip Mens Auto Reservering Land Leraar
Verschijningsvorm of object Jijzelf Auto met kenteken 35-HPG-9 Reservering met reserveringnummer B112490.6 Portugal P. Brouwer
Zo'n algemeen begrip wordt een klasse of class genoemd. Je kunt klasse ook als soort lezen: jijzelf behoort tot de soort Mens. Voor softwareobjecten geldt dat een klasse de blauwdruk of het ontwerp van een object is. Eigenlijk staat de programmeercode van het object niet in het object zelf, maar in een klasse. Een object is eigenlijk niets anders dan een verschijningsvorm, die gebruik maakt van de programmeercode van de bijbehorende klasse. Dit laatste wordt in figuur 1 duidelijk gemaakt voor het de klasse Snelkoppeling.
2
De klasse Snelkoppeling
Start Adobe Reader
Hierin staat alle code om een snelkoppeling te laten functioneren
Objecten (specifieke verschijningsvormen van de klasse Snelkoppeling). Figuur 1 Toelichting: De snelkoppeling Adobe Reader 9 is een softwareobject. Dit softwareobject heeft als klasse Snelkoppeling, waarin de programmeercode staat om de snelkoppeling te laten functioneren. Dubbelklik je nu op deze snelkoppeling, dan wordt Acrobat Reader 9 gestart. Het stukje programmacode dat daarvoor verantwoordelijk is is gedefinieerd in de klasse Snelkoppeling. Uit het vorige voorbeeld kun je het volgende concluderen: Als je wilt programmeren met zelfgemaakte objecten, dan moet je eerst een klasse programmeren met daarin de programmeercode die het object kan laten functioneren. De programmeercode in een klasse bestaat uit de volgende onderdelen:
Attributen of velden (Engels: attributes or fields). Code verpakt in methodes (functies worden bij OOP methodes genoemd).
Attributen bepalen de eigenschappen van een object. Methodes bepalen het gedrag van een object. Een voorbeeld: De klasse Snelkoppeling heeft een attribuut doel en een methode verwijder() . Het object Adobe Reader 9 heeft dit attribuut en deze methode ook. Het attribuut doel is te vergelijken met een variabele die een bepaalde waarde heeft. Zo kan het bijvoorbeeld zijn dat de waarde van het attribuut doel van het object de waarde: "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe" heeft. Dit attribuut kun je instellen door de eigenschappen van het object te veranderen. Het attribuut doel bepaalt dus de eigenschap: "welk programma kan worden gestart door de snelkoppeling". De methode verwijder() is een functionaliteit om het object te verwijderen. Een methode voert dus een actie uit, het doet iets. De programmeercode hiervoor is gedefinieerd in de klasse Snelkoppeling. Deze methode kan worden aangeroepen door het object, met het gewenste resultaat. De methode verwijder() bepaalt dus het gedrag "verwijder een snelkoppeling". 3
2.
De opbouw van een klasse
Zoals al eerder is gezegd: als je wilt programmeren met zelfgemaakte objecten, dan moet je eerst een klasse programmeren met daarin de programmeercode die het object kan laten functioneren. In deze paragraaf gaan we in op de structuur van een klasse (dus hoe je een klasse programmeert). Een klasse in C#.NET De programmeercode voor een klasse in C#.NET ziet er als volgt uit: Class ClsSnelkoppeling { //Eerst de attributen definiëren private string doel; private string beginnen_in; … … //Dan de constructor definieren public ClsSnelcoppeling(string pDoel, string pBeginnen_in) { //Programmeercode voor de constructor } //Daarna de overige methodes definiëren public void Verwijder() { //Programmeercode voor de methode Verwijder() } public void WijzigDoel(string pDoel) { //Programmeercode voor de methode WijzigDoel() } … … }
4
In de klasse kom je een bijzondere methode tegen, namelijk de constructor. De constructor heeft dezelfde naam als de methode zelf. Met deze methode kun je bijvoorbeeld de attributen een beginwaarde geven als er een object wordt gemaakt van die klasse. We zeggen wel: met de constructor initialiseren we een object. In C#.NET is het mogelijk om met meer dan 1 constructor te werken. In de klasse kom je de woorden public en private tegen. Hierover leer je meer in de volgende lesbrieven. Een klasse in PHP De programmeercode voor een klasse in PHP (versie 5.0 en hoger) ziet er als volgt uit: Class ClsSnelkoppeling { //Eerst de attributen definiëren private $doel; private $beginnen_in; … … //Dan de constructor definieren public function __constuct($pDoel, $pBeginnen_in) { //Programmeercode voor de constructor } //Daarna de overige methodes definiëren public function Verwijder() { //Programmeercode voor de methode Verwijder() } public function WijzigDoel($pDoel) { //Programmeercode voor de methode WijzigDoel() } … … }
5
Je ziet dat het definiëren van een klasse in C#.NET en PHP niet veel van elkaar verschilt. Ook bij een klasse in PHP is er een constructor die hetzelfde doel heeft als bij C#.NET. Deze constructor heeft echter een aparte naam, namelijk __counstruct (let op: twee maal underscore en dan construct).
3. Programmeren met objecten Nu je een klasse hebt, is het mogelijk van die klasse een object te declareren. Met behulp van die objecten kun je attributen en methoden aanroepen. Dit declareren van een object gaat als volgt (bij het voorbeeld van de snelkoppeling): In C#.NET
ClsSnelkoppeling objSnelkoppeling = new ClsSnelkoppeling( // parameterwaarden);
In PHP
$objSnelkoppeling = new ClsSnelkoppeling( // parameterwaarden);
De parameterwaarden moeten overeenstemmen met de parameters van de constructor (in ons voorbeeld: pDoel en pBeginnen_in . Dus kan het declareren van een object als volgt: In C#.NET
ClsSnelkoppeling objSnelkoppeling = new ClsSnelkoppeling("C:\Program Files (x86)\Adobe\Reader 9.0\Reader "," AcroRd32.exe");
In PHP
$objSnelkoppeling = new ClsSnelkoppeling(("C:\Program Files (x86)\Adobe\Reader 9.0\Reader "," AcroRd32.exe");
Het declareren van een object wordt meestal anders genoemd, namelijk: het instantiëren van een klasse. Deze nogal ingewikkelde benaming komt voort uit het begrip instantie, wat weer verschijningsvorm betekent. Dus: Een instantie van een klasse is een verschijningsvorm van een klasse (een object dus). Meestal wordt deze formulering gebruikt als je de naam van de klasse en het object in 1 zin noemt, dus: objSnelkoppeling is een instantie van de klasse ClsSnelkoppeling. Wanneer je alleen over het object spreekt, dan zeg je: het object objSnelkoppeling (dus niet de instantie objSnelkoppeling). Instantiëren is dus het maken van een instantie van een klasse. Ik geef toe: dit alles maakt het voorlopig nog niet echt gemakkelijk voor je. Toch zullen na verloop van tijd, en na de nodige oefening, de begrippen en het taalgebruik je steeds vertrouwder in de oren gaan klinken.
6
Als je een klasse hebt geïnstantieerd, dan kun je methodes aanroepen. Dit is niet moeilijk meer. Het gaat als volgt: In C#.NET
objSnelkoppeling.Verwijder();
In PHP
$objSnelkoppeling->Verwijder();
Met behulp van deze coderegels wordt de programmeercode voor de methode Verwijder() geactiveerd. Deze methode was gedefinieerd in de klasse ClsSnelkoppeling.
4. Waarom OOP Door de jaren heen zij applicaties steeds complexer geworden. Daarom moet voor het ontwikkelen van applicaties een methodiek gebruikt worden waarbij:
code overzichtelijk blijft, de structuur van een programma op een eenvoudige wijze kan worden gepresenteerd en reeds eerder gebruikte code hergebruikt kan worden (na eventueel een kleine aanpassing).
De manier van programmeren zoals die voor het OO-tijdperk werd toegepast voldoet niet aan deze eisen. De code van grote programma's werden op deze wijze een onoverzichtelijke brei van functies, regels, loops, if-statements en programmaregels (de zogenaamde spagetticode). Aanpassen van dergelijke programma's was onbegonnen werk. Opnieuw programmeren was de enige optie. Met groeien van de complexiteit en de omvang van een programma werd dit een dure grap. OOP is de oplossing voor dit soort problemen. Met OOP wordt het programma ingedeeld in klassen, wat de ontwikkelaar ertoe dwingt te programmeren volgens een bepaalde structuur. Deze structuur kan op een eenvoudige wijze worden gepresenteerd (in diagrammen). Verder kan reeds bestaande code eenvoudig worden hergebruikt binnen nieuwe klassen (je hoeft dus niet opnieuw het wiel uit te vinden). Je kunt zelfs zo ver gaan dat je klassen onderbrengt in bibliotheken waarbij onderlinge relaties tussen deze klassen bestaan. Dergelijke bibliotheken worden frameworks genoemd. Voorbeelden van dergelijke frameworks zijn .NET, ZendFramework en CodeIgnitor. Veel bedrijven (vooral PHP ontwikkelbedrijven) maken hun eigen framework, waardoor er weer een wildgroei ontstaat van PHP-frameworks. Dat laatste is een beetje jammer. Gedurende de opleiding Applicatieontwikkelaar zul je met de volgende framworks gaan werken: .NET en ZendFramework (het meest gebruikte PHP-framework). Om deze frameworks efficiënt te gebruiken moet je eerst de basis van OOP goed onder de knie krijgen.
7
5. Oefenopdrachten Omdat de eerstvolgende lesbrief over OOP met PHP gaat, kun je de volgende opdrachten het beste in PHP maken. Je kunt de oefenopdrachten zelf proberen te maken. Toch zal (met name bij opdracht 1) een klassikale toelichting op zijn plaats zijn. Opdracht 1 Deze opdracht is een onderdeel van een webshop. In deze webshop bestaat de klasse ClsBestelling. Deze klasse heeft de volgende attributen:
bestelnummer klantnummer datum
En de volgende methoden:
De constructor met de parameters pKlantnummer, pBestelnummer en pDatum De methode WijzigBestelling() met de parameters pKlantnummer en pDatum De methode ToonBestelling() zonder parameters. Deze methode returnt een array met de attribuutwaarden van het object.
Gebruik deze klasse in een wijzigingsformulier, waarin eerst de huidige attribuutwaarden van het object te zien zijn en na wijziging (via twee textboxen) de nieuwe attribuutwaarden van het object te zien zijn. Opdracht 2 Deze opdracht is een onderdeel van weblog. In deze weblog bestaat de klasse ClsBericht. Deze klasse heeft de volgende attributen:
BerichtID BerichtEigenaar BerichtDatum BerichtText
En de volgende methoden:
De constructor. In deze methode wordt verbinding met een database gemaakt. De methode MaakBericht(). Met deze methode kun je de attributen van de klasse een waarde geven. SlaBerichtOp(). Hiermee kun je het bericht opslaan in een database. ToonBerichten(). Hiermee toon je de laatste 10 berichten.
8
Maak bij deze applicatie een MySQL database met een tabel berichten. Deze tabel heeft de velden: berichtid, berichteigenaar, berichtdatum en berichttekst. Maak een applicatie waarmee je een bericht kunt toevoegen en daarna opslaan. Nadat het bericht is opgeslagen krijg je de laatste 10 berichten zien. Gebruik hier de klasse ClsBericht en de daarbij gemaakte methodes.
9