OO: Implementatie database denkwijze

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Victor -

Victor -

30/09/2011 14:49:46
Quote Anchor link
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!
Gewijzigd op 03/10/2011 20:03:11 door Niels K
 
PHP hulp

PHP hulp

24/04/2024 17:53:27
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/09/2011 15:19:11
Quote Anchor link
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!

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.
 
Marco PHPJunky

Marco PHPJunky

30/09/2011 15:51:38
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
class ClassName extends DataBaseClass {
// code
}

?>
 
Victor -

Victor -

30/09/2011 15:57:03
Quote Anchor link
@Marco is dit dan niet in tegenstrijding van de denkwijze van OOP?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/09/2011 16:07:30
Quote Anchor link
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.
 
Marco PHPJunky

Marco PHPJunky

30/09/2011 16:13:33
Quote Anchor link
@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...
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/09/2011 16:21:54
Quote Anchor link
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
 
Marco PHPJunky

Marco PHPJunky

30/09/2011 16:33:36
Quote Anchor link
@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...
Gewijzigd op 30/09/2011 16:50:28 door Marco PHPJunky
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/09/2011 17:06:10
Quote Anchor link
@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
 
Marco PHPJunky

Marco PHPJunky

30/09/2011 17:22:59
Quote Anchor link
@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.
Gewijzigd op 30/09/2011 17:24:16 door Marco PHPJunky
 
Pim -

Pim -

02/10/2011 16:06:31
Quote Anchor link
Veruit het mooiste vind ik dependecy injection.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
class Model
{
    public function __construct(Database $db)
    {

        $this->db = $db;
    }
}
new
Model(new Database));
?>

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.
 
Ozzie PHP

Ozzie PHP

02/10/2011 19:37:31
Quote Anchor link
@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.
 
Pim -

Pim -

02/10/2011 19:43:27
Quote Anchor link
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).
 
Ozzie PHP

Ozzie PHP

02/10/2011 23:47:46
Quote Anchor link
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?
 
Jelmer -

Jelmer -

03/10/2011 12:10:20
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

03/10/2011 12:12:13
Quote Anchor link
Is een betere titel voor dit topic niet wat handiger ;-)?
 
Ozzie PHP

Ozzie PHP

03/10/2011 12:38:10
Quote Anchor link
@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!
 
Victor -

Victor -

03/10/2011 14:51:37
Quote Anchor link
@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
 
Pim -

Pim -

03/10/2011 16:02:21
Quote Anchor link
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 ;).
 
Ozzie PHP

Ozzie PHP

03/10/2011 16:34:44
Quote Anchor link
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.
 
Victor -

Victor -

03/10/2011 20:44:52
Quote Anchor link
@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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.