Webwinkel systeem
Is dit volgens alle OOP regels?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class Article {
public function addArticle() { }
public function editArticle() { }
public function deleteArticle() { }
}
class ArticlePhoto extends Article {
public function addPhoto() { }
public function editPhoto() { }
public function deletePhoto() { }
}
class User {
public function addUser() { }
public function editUser() { }
public function deleteUser() { }
}
class Cart {
public function addArticle() { }
public function deleteArticle() { }
}
class Order {
public function addCart() { }
public function pay() { }
}
class Article {
public function addArticle() { }
public function editArticle() { }
public function deleteArticle() { }
}
class ArticlePhoto extends Article {
public function addPhoto() { }
public function editPhoto() { }
public function deletePhoto() { }
}
class User {
public function addUser() { }
public function editUser() { }
public function deleteUser() { }
}
class Cart {
public function addArticle() { }
public function deleteArticle() { }
}
class Order {
public function addCart() { }
public function pay() { }
}
Je hebt alles mooi in objecten verdeelt, alleen de methoden kunnen her en der wat beter. Je hebt nu een User object gemaakt, deze houd de gegevens vast (naam, wachtwoord, enz.). Jij geeft hem nu ook methoden mee om contact te maken met de DataBase. Dat betekend dat onze klasse 2 dingen heeft om te doen => niet echt goed.
De oplossing is om het DataMapper pattern te maken. Hierdoor maak je een UserMapper. Deze werkt dan tussen de Database en de User klasse. Hierdoor weet de User klasse niks van de DB en de DB niks van de User klasse, kortom ideale flexibiliteit.
De procedurele code wordt dan zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$pdo = new PDO(...);
$userMapper = new UserMapper($pdo);
// haal users op
$user1 = $userMapper->getById(1); // haal user id=1 op
echo 'Hallo '.$user1->getName();
// maak nieuwe users
$user2 = new User('Wouter', 'myPass');
$user2 = $userMapper->create($user2); // voeg de user aan de DB toe
/ verwijder users
$user3 = new User('Victor', 'PHPhulpIsGaaf');
$userMapper->delete($user3);
?>
$pdo = new PDO(...);
$userMapper = new UserMapper($pdo);
// haal users op
$user1 = $userMapper->getById(1); // haal user id=1 op
echo 'Hallo '.$user1->getName();
// maak nieuwe users
$user2 = new User('Wouter', 'myPass');
$user2 = $userMapper->create($user2); // voeg de user aan de DB toe
/ verwijder users
$user3 = new User('Victor', 'PHPhulpIsGaaf');
$userMapper->delete($user3);
?>
In het voorbeeld dat jij geeft degradeer jij nu de user class tot een class die alleen properties heeft en verder niks kan uitvoeren, dat is dan geen onnodige class geworden?
En als je een mysql class heb mag je in de user class dan niet doen:
$mysql->query("INSERT user ..."); Of is dat al te veel mogelijkheden voor één class?
Quote:
dat is dan geen onnodige class geworden?
Nee. Uiteindelijk zijn de meeste klassen die je in je template gebruikt klassen die alleen gegevens vasthouden. Dat is juist zo mooi van OOP. Je hebt 1 connectie punt waar je per object de gegevens instopt. Hoe die gegevens daar komen maakt jou niks uit. Dat maakt het heel flexibel.
Nu gebruik je bijv. een datamapper. Maar wat als je straks dit project om gaat zetten in een MVC project? Dan heb je een UserModel. Aangezien het niks uitmaakt hoe we het in de User klasse zetten hoeven we alleen maar de UserMapper te veranderen in een Model en zal de rest gewoon doorwerken.
Dat is nou het heerlijke van OO!
Quote:
En als je een mysql class heb mag je in de user class dan niet doen:
$mysql->query("INSERT user ..."); Of is dat al te veel mogelijkheden voor één class?
$mysql->query("INSERT user ..."); Of is dat al te veel mogelijkheden voor één class?
Ik gebruik nooit een MySQL klasse. Dit regel ik allemaal met Mappers of Models. Voor de code achter zo'n datamapper kun je even naar pims voorbeeld kijken.