Formbuilder -> beoordelen
Een vraagje, zouden jullie mijn FormBuilder willen beoordelen?
Groeten Donny
http://plaatscode.be/142327/
Maak alles wat abstracter... dit kan je doen door bv een aantal elementen in een aparte class te zetten.
Dingen met $this->errors[] moet je met een validator doen, niet alles in 1 classe...
Dan nog iets, dingen als dit:
Code (php)
1
$this->errors[] = 'Er is een error in de formbuilder. Het type '.$type .' bestaat niet in de categorie input fields.';
Zou je met een exception moeten doen.
Gewijzigd op 08/04/2014 15:14:18 door - Raoul -
En Raoul, ik vind exceptions altijd heel vervelend om te lezen. Daarnaast kan een exception maar 1 error bevatten. Deze methode meerdere, is dat niet handiger?
Wat je hier hebt gedaan is gewoon 1 klasse gemaakt en die gebruikt om alle functies te bundelen. Een leuke manier van programmeren en totaal niet fout, maar geen OO.
In OO gaat het erom dat je zoveel mogelijk alle verantwoordelijkheden spreid over objecten. Een van de belangrijkste principes is het Single Responsibility Principle: Een object mag maar 1 rede hebben om te veranderen. In jouw object zijn er meerdere redenen om hem te willen veranderen:
- als we de HTML veranderen (de "presentatie" laag)
- als we een nieuw field type willen toevoegen
- als we ipv $_POST bijv. $_GET willen gebruiken (gebruik nooit superglobals in OO objecten)
- als we het AJAX script willen veranderen (of helemaal geen AJAX willen gebruiken)
Al deze redenen krijgen een eigen klasse. Je krijgt dan verschillende FormType klassen, een FormRenderer/FormView klasse, een FormRequest klasse, een FormBuilder klasse, een Form klasse, etc.
Oke, nou heb ik 2 classes: een FormRenderer en een FormView class, hoe kan ik die samen laten werken?
Dus: alles verantwoordelijkheden verspreiden in classes en abstracter maken.
Toevoeging op 08/04/2014 15:22:15:
Donny Wie weet op 08/04/2014 15:21:24:
Dankje wouter :)
Oke, nou heb ik 2 classes: een FormRenderer en een FormView class, hoe kan ik die samen laten werken?
Oke, nou heb ik 2 classes: een FormRenderer en een FormView class, hoe kan ik die samen laten werken?
Wat is het verschil tussen FormRenderer en FormView? Doen ze niet allebei hetzelfde?
Toevoeging op 08/04/2014 15:31:38:
Zou ik bijvoorbeeld dit mogen doen:
if(server request == post){
formvalidator aanroepen
} else {
formrenderer aanroepen
}
of moet alles juist samen werken?
Geen if-else, maar meerdere klasses die hun eigen verantwoordelijk hebben.
Kijk eens naar andere OOP scripts, bijv een twitter api
OOp mag ook IF elsejes hebben... En daarnaast hebben we hier meerdere klassen met hun eigen verantwoordelijkheid...
Als laatst zou ik jouw twitter api voorbeeld ook geen OO willen noemen...
Donny, ja zoiets.
Dus, zo'n opzet lijkt me wel correct:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$validator = new FormValidator();
$validator->addRule('username', 'required');
$form = new LoginForm();
$renderer = new FormRenderer($form); // constructor injection
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if ($formValidator->valid($form))
{
// OK
}
else
{
// doe iets met $formValidator->getMessages()
}
}
echo $renderer->getOutput();
?>
$validator = new FormValidator();
$validator->addRule('username', 'required');
$form = new LoginForm();
$renderer = new FormRenderer($form); // constructor injection
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if ($formValidator->valid($form))
{
// OK
}
else
{
// doe iets met $formValidator->getMessages()
}
}
echo $renderer->getOutput();
?>
Toevoeging op 08/04/2014 19:42:49:
En die irritante code tag bug in de UBB is weer terug.. *Zucht*
- Aar -:
Niet als je de PHP-tags netjes afsluit. ;-)
Gewijzigd op 08/04/2014 20:10:57 door - Ariën -