[OOP] Goede aanpak?
Artikel
-Artikel_id
-Titel
-Beschrijving
-Prijs
-BTW
+setArtikel_id
+setTitel
+setBeschrijving
+setPrijs
+setBTW
+getArtikel()
Voorraad
-Artikel_id
-Voorraad
+setArtikel_id
+setVoorraad
+getVoorraad()
Bestelling
-Artikel_id
-Aantal
+setArtikel_id
+setAantal
+getBestelling()
Winkelwagen
-Bestelling
+setBestelling
+getWinkelwagen()
Gewijzigd op 28/03/2011 22:47:09 door Bram Boos
Waar komt artikel_id vandaan?
Karl Karl op 28/03/2011 22:39:28:
Waar komt artikel_id vandaan?
Van de klasse Artikel...
Bram Boos op 28/03/2011 22:40:16:
Van de klasse Artikel...
Karl Karl op 28/03/2011 22:39:28:
Waar komt artikel_id vandaan?
Van de klasse Artikel...
Bram Boos op 28/03/2011 22:20:58:
(...)
Artikel
-Titel
-Beschrijving
-Prijs
-BTW
+setTitel
+setBeschrijving
+setPrijs
+setBTW
+getArtikel()
(...)
Artikel
-Titel
-Beschrijving
-Prijs
-BTW
+setTitel
+setBeschrijving
+setPrijs
+setBTW
+getArtikel()
(...)
Zakdoekje leggen,
Niemand zeggen,
rara, waar is artikel_id gebleven...?
Moet dit een soort van klassendiagram zijn?
Artikel
-Artikel_id
-Titel
-Beschrijving
-Prijs
-BTW
+setArtikel_id
+setTitel
+setBeschrijving
+setPrijs
+setBTW
+getArtikel()
Ja als je het zo wilt noemen, zo probeer ik mij in ieder geval op het scripten voor te bereiden (nog nooit gedaan)..
Hoe kom je dan aan de artikel_id?
En hoe ga je dit klassendiagram weergeven in je database?
Karl Karl op 28/03/2011 22:54:07:
Stellen de plusjes en minnetjes de visibility aan?
Hoe kom je dan aan de artikel_id?
Hoe kom je dan aan de artikel_id?
De visibility heb ik hier geen rekening mee gehouden, misschien moet ik daar nog eens over na gaan denken...
Pim - op 28/03/2011 22:57:08:
En hoe ga je dit klassendiagram weergeven in je database?
De informatie (waaronder artikel_id) komt uit de database welke via een adapter klasse wordt opgehaald.
Gewijzigd op 28/03/2011 23:01:22 door Bram Boos
Bram Boos op 28/03/2011 23:00:52:
De visibility heb ik hier geen rekening mee gehouden, misschien moet ik daar nog eens over na gaan denken...
De informatie (waaronder artikel_id) komt uit de database welke via een adapter klasse wordt opgehaald.
Karl Karl op 28/03/2011 22:54:07:
Stellen de plusjes en minnetjes de visibility aan?
Hoe kom je dan aan de artikel_id?
Hoe kom je dan aan de artikel_id?
De visibility heb ik hier geen rekening mee gehouden, misschien moet ik daar nog eens over na gaan denken...
Pim - op 28/03/2011 22:57:08:
En hoe ga je dit klassendiagram weergeven in je database?
De informatie (waaronder artikel_id) komt uit de database welke via een adapter klasse wordt opgehaald.
Wat doen die plusjes en minnetjes dan? Dus jij wou gewoon uit een object zijn waarde van artikel_id gaan plukken? Dan ben je wel fout bezig vanuit god-hoe-heet-dat-nu-dan-principe-ik-ben-te-lang-met-assembly-bezig-geweest-owja-het-was: loose coupling high cohesion...
Eigenlijk moet je Bestelling het object Artikel laten dragen, niet de waarde artikel_id.
Pim - op 28/03/2011 23:28:51:
Eigenlijk moet je Bestelling het object Artikel laten dragen, niet de waarde artikel_id.
Oh, lol, zover had ik eigenlijk nog niet eens gekeken :-)
Visio bevat de mogelijkheid om UML-modellen te maken, zou je eens naar moeten kijken, helpt je vaak om dingen te visualiseren, maar ook om af en toe lekker te schuiven.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
class Aanbieding
{
private $_adapter;
private $_artikelId;
public function __construct(Adapter $_adapter,Artikel $_artikelId)
{
$this->_adapter = $_adapter
$this->_artikelId = $_artikelId;
}
public function getPrijs()
{
$aanbieding = $this->_adapter->getArtikel($this->_artikelId);
return $aanbieding['prijs'];
}
}
class Voorraad
{
private $_adapter;
private $_artikelId;
public function __construct(Adapter $_adapter, Artikel $_artikelId)
{
$this->_adapter = $_adapter;
$this->_artikelId = $_artikelId;
}
public function getVoorraad()
{
return $this->_adapter->checkVoorraad($this->_artikelId);
}
}
class Item
{
private $_aantal;
public function __construct(Artikel $Artikel_id, $_aantal)
{
$this->Artikel_id = $Artikel_id;
}
public function addItem()
{
$this->_items[] = array
(
'id' => $Id,
'prijs' => $Prijs,
'aantal' => $Aantal
);
}
public function getBestelling()
{
return $this->_items;
}
}
class Winkelwagen
{
private $_aantal;
public function __construct(Artikel $_artikelId, $_aantal)
{
$this->_artikelId = $_artikelId;
}
public function getTotaal()
{
foreach ($this->_item as $Wagen)
{
return $Wagen['prijs'] * $Wagen['aantal'];
}
}
}
?>
class Aanbieding
{
private $_adapter;
private $_artikelId;
public function __construct(Adapter $_adapter,Artikel $_artikelId)
{
$this->_adapter = $_adapter
$this->_artikelId = $_artikelId;
}
public function getPrijs()
{
$aanbieding = $this->_adapter->getArtikel($this->_artikelId);
return $aanbieding['prijs'];
}
}
class Voorraad
{
private $_adapter;
private $_artikelId;
public function __construct(Adapter $_adapter, Artikel $_artikelId)
{
$this->_adapter = $_adapter;
$this->_artikelId = $_artikelId;
}
public function getVoorraad()
{
return $this->_adapter->checkVoorraad($this->_artikelId);
}
}
class Item
{
private $_aantal;
public function __construct(Artikel $Artikel_id, $_aantal)
{
$this->Artikel_id = $Artikel_id;
}
public function addItem()
{
$this->_items[] = array
(
'id' => $Id,
'prijs' => $Prijs,
'aantal' => $Aantal
);
}
public function getBestelling()
{
return $this->_items;
}
}
class Winkelwagen
{
private $_aantal;
public function __construct(Artikel $_artikelId, $_aantal)
{
$this->_artikelId = $_artikelId;
}
public function getTotaal()
{
foreach ($this->_item as $Wagen)
{
return $Wagen['prijs'] * $Wagen['aantal'];
}
}
}
?>
Er zullen nog wat foutjes in zitten want ik moest even snel...
En je hebt geen klassendiagram gemaakt? :-/ Ik dacht dat je het officieel wou doen.
Karl Karl op 29/03/2011 20:05:40:
En je hebt geen klassendiagram gemaakt? :-/ Ik dacht dat je het officieel wou doen.
Ja en nee. Ik heb geen idee hoe ik zo'n diagram zou moeten maken. Vandaar dat ik misschien maar wat code moest plaatsen om het te verduidelijken...
Eigenlijk maak je een soort testcase, alleen gebruik je hem nu niet alleen om te testen of je objecten doen wat ze moeten doen, maar vooral om te kijken of je niet iets vergeten bent. Pas wanneer je probeert je classes te gebruiken zal je merken dat sommige dingen onhandig zijn of helemaal niet kunnen (hoe kom ik nu bij de prijs van dit product!? hoe kan ik nu dat ene product uit het winkelwagentje halen?!)
Iets simpels als dit, het liefst zo dom mogelijk want het is alleen maar even om te kijken of je class-interface volledig is.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
session_start();
$adapter = new Adapter(); // dummy
if (!isset($_SESSION['wagen']))
$_SESSION['wagen'] = new Winkelwagen($adapter);
if (isset($_POST['action']))
{
if ($_POST['action'] == 'add' && isset($_POST['artikel_id']))
{
foreach ($_POST['artikel_id'] as $artikel_id)
{
$artikel = $adapter->getArtikel($artikel_id);
$_SESSION['wagen']->addItem($artikel);
}
}
else if ($_POST['action'] == 'del' && isset($_POST['index']))
{
foreach ($_POST['index'] as $index)
$_SESSION['wagen']->removeItem($index);
}
}
echo '<form method="post">';
echo '<input type="hidden" name="action" value="add">';
foreach ($adapter->getArtikelen() as $artikel)
echo '
<label>
<input type="checkbox" name="artikel_id[]" value="' . $artikel->id() . '">
' . $artikel->naam() . '
</label><br>
';
echo '<button type="submit">Voeg toe aan wagen</button>';
echo '</form>';
echo '<form method="post">';
echo '<input type="hidden" name="action" value="del">';
foreach ($_SESSION['wagen']->getArtikelen() as $index => $artikel)
echo '
<label>
<input type="checkbox" name="index[]" value="' . $index . '">
' . $artikel->naam() . '
</label><br>
';
echo '<button type="submit">Verwijder uit wagen</button>';
echo '</form>';
?>
session_start();
$adapter = new Adapter(); // dummy
if (!isset($_SESSION['wagen']))
$_SESSION['wagen'] = new Winkelwagen($adapter);
if (isset($_POST['action']))
{
if ($_POST['action'] == 'add' && isset($_POST['artikel_id']))
{
foreach ($_POST['artikel_id'] as $artikel_id)
{
$artikel = $adapter->getArtikel($artikel_id);
$_SESSION['wagen']->addItem($artikel);
}
}
else if ($_POST['action'] == 'del' && isset($_POST['index']))
{
foreach ($_POST['index'] as $index)
$_SESSION['wagen']->removeItem($index);
}
}
echo '<form method="post">';
echo '<input type="hidden" name="action" value="add">';
foreach ($adapter->getArtikelen() as $artikel)
echo '
<label>
<input type="checkbox" name="artikel_id[]" value="' . $artikel->id() . '">
' . $artikel->naam() . '
</label><br>
';
echo '<button type="submit">Voeg toe aan wagen</button>';
echo '</form>';
echo '<form method="post">';
echo '<input type="hidden" name="action" value="del">';
foreach ($_SESSION['wagen']->getArtikelen() as $index => $artikel)
echo '
<label>
<input type="checkbox" name="index[]" value="' . $index . '">
' . $artikel->naam() . '
</label><br>
';
echo '<button type="submit">Verwijder uit wagen</button>';
echo '</form>';
?>
Ik vraag mij nu af waarom je de Item class niet gebruikt? Of is die overbodig?
Geen idee. Dat scriptje van mij hierboven was even een voorbeeldje van wat ik bedoel met "een simpel scriptje", en is hoe ik een simpele winkelwagen zou doen. Ik heb niet echt goed gekeken naar welke methods jij je classes hebt gegeven.
Owh okee, ik zal vanavond eens bezig...
Het is heel strict gezegd toch alleen maar order met order - items?
Want getTotaal in je winkelwagen? Dat is toch niet iets wat je van winkelwagen moet verkrijgen, dat moet juist in de winkelwagen getoond worden.
Op je order objecten moet je een methode getTotal krijgen. En hoe doe je het met verzendkosten, endergelijke? Eigenlijk wil je die misschien ook wel als 'order-item' opslaan.
Is alleen mijn mening maar ;)
Edit:
btw op artikel niveau? Dat is toch ook iets wat je in je order pas berekend?
En over voorraad. Eigenlijk wil je artikelen in de webshop zonder voorraad niet eens tonen? (Artikel filter?)
En hoe haal jij categorieën op? En hoe koppel je artikelen aan een categorie?
Volgens mij wordt het tijd voor vragen en deelvragen.
Weet eerst zeker wat je wilt gaan bouwen en begin niet lukraak.
Gewijzigd op 30/03/2011 18:50:06 door Niels K
Ik zit eigenlijk met het probleem dat mijn vorige OOP projecten meer een verzameling functies in een class was dan een OOP.
Hierdoor wil ik mij nu eens ècht gaan verdiepen... Nu wil ik dus eerst een klassediagram maken maar daar loop ik al vast. Daarom ben ik maar begonnen met het scripten en had ik gehoopt daarna een klasendiagram te kunnen maken...