OO: Implementatie database denkwijze
Hallo,
Ik zit een beetje te twijfelen over hoe ik mijn classes ga maken,
en wil nu graag aan jullie vragen hoe je het doet.
Namelijk voor veel classes heb je een verbinding met de database nodig,
Maar hoe geef je die mee?
Ik heb bij veel classes van andere gezien dat ze dat bij de construct meegaven, maar dat vind ik niet zo netjes.
Want dan moet je dat bij elke class meegeven die een db verbinding nodig heeft.
Maken jullie dan gewoon een aparte class voor de db verbinding en instantieren jullie die in de construct?
Ik hoor het graag!
Ik zit een beetje te twijfelen over hoe ik mijn classes ga maken,
en wil nu graag aan jullie vragen hoe je het doet.
Namelijk voor veel classes heb je een verbinding met de database nodig,
Maar hoe geef je die mee?
Ik heb bij veel classes van andere gezien dat ze dat bij de construct meegaven, maar dat vind ik niet zo netjes.
Want dan moet je dat bij elke class meegeven die een db verbinding nodig heeft.
Maken jullie dan gewoon een aparte class voor de db verbinding en instantieren jullie die in de construct?
Ik hoor het graag!
Gewijzigd op 03/10/2011 20:03:11 door Niels K
Victor - op 30/09/2011 14:49:46:
...
Ik heb bij veel classes van andere gezien dat ze dat bij de construct meegaven, maar dat vind ik niet zo netjes.
Want dan moet je dat bij elke class meegeven die een db verbinding nodig heeft.
Maken jullie dan gewoon een aparte class voor de db verbinding en instantieren jullie die in de construct?
Ik hoor het graag!
Ik heb bij veel classes van andere gezien dat ze dat bij de construct meegaven, maar dat vind ik niet zo netjes.
Want dan moet je dat bij elke class meegeven die een db verbinding nodig heeft.
Maken jullie dan gewoon een aparte class voor de db verbinding en instantieren jullie die in de construct?
Ik hoor het graag!
ja ik heb een aparte db class, ik zet hem altijd in de construct van andere classes maar heb wel een connect methode in de dbclass.
Je zou eventueel ook gebruik kunnen maken van Extending
want dan kan je alle opties/functies gebruiken van de parent class
dan word de class die je aanmaakt de child van de database class.
want dan kan je alle opties/functies gebruiken van de parent class
dan word de class die je aanmaakt de child van de database class.
@Marco is dit dan niet in tegenstrijding van de denkwijze van OOP?
Victor - op 30/09/2011 15:57:03:
@Marco is dit dan niet in tegenstrijding van de denkwijze van OOP?
Nee dat is het principe van OOP. Je maakt een basis class met een aantal basis functies, door een functie opnieuw te definieren in de extended class overschrijf je ze(php is daarin heel simpel).
However:
Wat Marco voorstelt is natuurlijk niet zo slim: een dbclass connect naar een database, en sommige andere classes hebben dat niet nodig.
@ger kan je me misschien uitleggen waarom dat niet zo slim is ?
want als hij enkel zijn database connectie nodig heeft kan hij die heel makkelijk gebruiken als hij de classes waarin hij die nodig heeft eventueel extend.
En ja het is waar dat als je in de child class een functie opnieuw maakt dat hij hem dan overschrijft.. maar ik ging er even vanuit dat hij een database class heeft en daarnaast een class met zijn help/standaard functies heeft...
want als hij enkel zijn database connectie nodig heeft kan hij die heel makkelijk gebruiken als hij de classes waarin hij die nodig heeft eventueel extend.
En ja het is waar dat als je in de child class een functie opnieuw maakt dat hij hem dan overschrijft.. maar ik ging er even vanuit dat hij een database class heeft en daarnaast een class met zijn help/standaard functies heeft...
Marco PHPJunkie op 30/09/2011 16:13:33:
@ger kan je me misschien uitleggen waarom dat niet zo slim is ?
Omdat inheritance (php extends) betekent dat alle functies die daarin gedefinieerd zijn mee worden overgenomen. Misschien ben ik ook ook wel een beetje adhoc geweest maar één van de eerste regels met programeren is: vraag nooit onnodige resources aan.
Gewijzigd op 30/09/2011 16:25:04 door Ger van Steenderen
@ger
Oke true dat is zeker waar en daar ben ik het hellemaal mee eens (gebruik nooit overbodige resources / code aan)
maar als hij enkel en alleen een class heeft voor zijn database verbinding/afhandelingen en hij heeft ze in die andere class echt nodig kan je het heel goed gebruiken niks mis mee....
En anders als er teveel functies in staan die je niet nodig hebt kan je het is het beter om (zoals Ger al zei) hem in de construct te zetten...
Oke true dat is zeker waar en daar ben ik het hellemaal mee eens (gebruik nooit overbodige resources / code aan)
maar als hij enkel en alleen een class heeft voor zijn database verbinding/afhandelingen en hij heeft ze in die andere class echt nodig kan je het heel goed gebruiken niks mis mee....
En anders als er teveel functies in staan die je niet nodig hebt kan je het is het beter om (zoals Ger al zei) hem in de construct te zetten...
Gewijzigd op 30/09/2011 16:50:28 door Marco PHPJunky
@marco
lol, dat we het toch nog ergens over eens zijn.
maar zonder gekheid: als je OOP wilt gaan werken, bouw je een base class waarin je een hoop functionaliteit zet die je later altijd kunt terug gebruiken. dus wellicht ook de optie om naat een datbase te connecten
lol, dat we het toch nog ergens over eens zijn.
maar zonder gekheid: als je OOP wilt gaan werken, bouw je een base class waarin je een hoop functionaliteit zet die je later altijd kunt terug gebruiken. dus wellicht ook de optie om naat een datbase te connecten
@Ger
XD dan zijn we het daar ook over eens :P
nog iets waar we het over eens zijn dus XD
maar het kan ook komen dat ik persoonlijk altijd een database class (enventueel voor meerdere databases (mysql, mssql, sqlite/3)) heb en een functies class en daarnaast de modules vandaar maby ook mijn reactie en antwoord.
XD dan zijn we het daar ook over eens :P
nog iets waar we het over eens zijn dus XD
maar het kan ook komen dat ik persoonlijk altijd een database class (enventueel voor meerdere databases (mysql, mssql, sqlite/3)) heb en een functies class en daarnaast de modules vandaar maby ook mijn reactie en antwoord.
Gewijzigd op 30/09/2011 17:24:16 door Marco PHPJunky
Veruit het mooiste vind ik dependecy injection.
Je hebt dan een mooie scheiding van verantwoordelijkheden (het model houdt zich niet met de DB bezig) en je bent veel flexibeler (je kan altijd een uitgebreide versie van Database meegeven en zo functionaliteit toevoegen/aanpassen.
Het gebruiken van een universele super-class wordt vaak gezien als een slechte gewoonte, omdat je dan (vaak) taken niet goed scheidt.
Code (php)
Je hebt dan een mooie scheiding van verantwoordelijkheden (het model houdt zich niet met de DB bezig) en je bent veel flexibeler (je kan altijd een uitgebreide versie van Database meegeven en zo functionaliteit toevoegen/aanpassen.
Het gebruiken van een universele super-class wordt vaak gezien als een slechte gewoonte, omdat je dan (vaak) taken niet goed scheidt.
@Pim: wat is het verschil als je de class Model zou extenden met een GeneralModel waarin je standaard beschikking hebt over een database connectie? Dan hoef je niet telkens een database mee te geven.
Ja, maar er is een groot verschil tussen het houden van een DB object (of dat nou in een parent is of niet) en het zijn van een DB object.
Het is prima om de het DB object in een statisch veld in een superclass te stoppen, maar niet om je model een DB klasse uit te laten breiden (en dan heb ik het niet over active records en verwanten, maar over de DB connectie zelf).
Het is prima om de het DB object in een statisch veld in een superclass te stoppen, maar niet om je model een DB klasse uit te laten breiden (en dan heb ik het niet over active records en verwanten, maar over de DB connectie zelf).
Ik snap niet helemaal wat je bedoelt Pim. Ik bedoel dat je het model zou extenden met een General Model en dat General Model maakt gebruik van een database class. Aan het General Model geef je dan in de construct de database class mee. Snap je wat ik bedoel?
Ozzie PHP op 02/10/2011 23:47:46:
Ik snap niet helemaal wat je bedoelt Pim. Ik bedoel dat je het model zou extenden met een General Model en dat General Model maakt gebruik van een database class. Aan het General Model geef je dan in de construct de database class mee. Snap je wat ik bedoel?
Juist. Precies! Je maakt gebruik van een database class, maar het is niet een database class. En daarom erf je niet over.
Hou je objecten zo klein mogelijk, zo specifiek mogelijk, zodat je ze gemakkelijk kan verbeteren, testen en vervangen. Juist dan merk je de voordelen van object georiënteerd programmeren.
Is een betere titel voor dit topic niet wat handiger ;-)?
@Jelmer: ik doe m'n best je te begrijpen :-)
Ik snap niet helemaal wat je bedoelt met "Je maakt gebruik van een database class, maar het is niet een database class. En daarom erf je niet over."
Als je in ieder Model gebruik maakt van een database dan kun je:
a) aan ieder model de database meegeven: new Model(new Database)
b) ieder model extenden met een General Model waarin standaard een database verbinding aanweig is (evenals nog een aantal andere basisfunctionaliteiten)
Volgens jou is manier A beter, maar ik zou dan graag weten waarom dat precies is (graag in Jip en Janneke taal) zodat ik er zelf straks ook m'n voordeel mee kan doen. Bedankt alvast voor je antwoord!
Ik snap niet helemaal wat je bedoelt met "Je maakt gebruik van een database class, maar het is niet een database class. En daarom erf je niet over."
Als je in ieder Model gebruik maakt van een database dan kun je:
a) aan ieder model de database meegeven: new Model(new Database)
b) ieder model extenden met een General Model waarin standaard een database verbinding aanweig is (evenals nog een aantal andere basisfunctionaliteiten)
Volgens jou is manier A beter, maar ik zou dan graag weten waarom dat precies is (graag in Jip en Janneke taal) zodat ik er zelf straks ook m'n voordeel mee kan doen. Bedankt alvast voor je antwoord!
@aar, ik kan de naam niet meer veranderen..
Verder vind ik de discussie echt heel interessant en er zaten dus blijkbaar nog meer mensen mee te rommelen:p
Verder vind ik de discussie echt heel interessant en er zaten dus blijkbaar nog meer mensen mee te rommelen:p
Stel dat we nou gewoon een PDO object als DB verbinding nemen. Dat kan je je modellen die PDO functionaliteit laten overnemen door ze de PDO klasse te laten uitbreiden, maar daar zitten grote nadelen aan. Zo wordt er bij elk model een nieuwe verbinding aangelegd en wordt je model klasse veel ingewikkelder dan hij zou moeten zijn.
Ook kan je je model laten beschikken over een PDO object, door het een property ($this->pdo) te laten zijn. Dan is je model klasse veel simpeler en flexibeler.
Daarna moet je nog gaan bedenken hoe je precies je modellen aan je DB gaat vlechten. Hier zijn verschillende recepten voor en dan wordt het pas echt leuk ;).
Ook kan je je model laten beschikken over een PDO object, door het een property ($this->pdo) te laten zijn. Dan is je model klasse veel simpeler en flexibeler.
Daarna moet je nog gaan bedenken hoe je precies je modellen aan je DB gaat vlechten. Hier zijn verschillende recepten voor en dan wordt het pas echt leuk ;).
Pim, ik bedoel niet dat je je modellen de PDO functionaliteit laat overnemen door ze de PDO classe te laten uitbreiden.
Wat ik in gedachten heb is (ongeveer) dit.
1) Een aparte database class die de PDO class extend. Waarom een aparte database class? Omdat ik daar voor mezelf wat handigheidjes in wil stoppen zoals bijvoorbeeld chaining, $database->select('veld')->from('tabel')->run();
2) Een General Model met een aantal standaard functionaliteiten. In dit model wordt (eenmalig) een database connectie opgezet en wordt de databse class uit punt 1 ingesteld als property, $this->database.
3) Ieder afzonderlikj model laat je extenden met het General Model uit stap 2. Hierdoor heb je dus in ieder model de beschikking over een database verbinding via $this->database.
Is dit niet een goede manier? Het voordeel is dat je niet aan ieder model een database verbinding hoeft mee te geven.
Wat ik in gedachten heb is (ongeveer) dit.
1) Een aparte database class die de PDO class extend. Waarom een aparte database class? Omdat ik daar voor mezelf wat handigheidjes in wil stoppen zoals bijvoorbeeld chaining, $database->select('veld')->from('tabel')->run();
2) Een General Model met een aantal standaard functionaliteiten. In dit model wordt (eenmalig) een database connectie opgezet en wordt de databse class uit punt 1 ingesteld als property, $this->database.
3) Ieder afzonderlikj model laat je extenden met het General Model uit stap 2. Hierdoor heb je dus in ieder model de beschikking over een database verbinding via $this->database.
Is dit niet een goede manier? Het voordeel is dat je niet aan ieder model een database verbinding hoeft mee te geven.
@Ozzie Als je het General Model uit stap 2 extend in je Model class, dan krijg je toch iedere keer een nieuwe verbinding wanneer je een class oproept?
Of zet je zoiets dan in een registry class? En als je niet de database verbinding in je construct van je GM regelt, moet je hem alsnog zelf aanmaken.
Of zet je zoiets dan in een registry class? En als je niet de database verbinding in je construct van je GM regelt, moet je hem alsnog zelf aanmaken.




