[oop] waar controleren?
Ola,
Ik heb een vraag. Stel we hebben een user class. Een user vult op een formulier op de website zijn e-mailadres in. Nu wil ik het e-mailadres toevoegen aan het User object.
Waar ik benieuwd naar ben is op welk moment je gaat controleren of het e-mailadres geldig is. Doe je dat voordat je het e-mailadres toevoegt aan het User object? Dus zo:
// de code klopt niet helemaal en is niet volledig
// het gaat enkel even om de denkwijze
Of... laat je de setMail() method in de User class het e-mailadres controleren? Zoiets als dit:
Ik heb een vraag. Stel we hebben een user class. Een user vult op een formulier op de website zijn e-mailadres in. Nu wil ik het e-mailadres toevoegen aan het User object.
Waar ik benieuwd naar ben is op welk moment je gaat controleren of het e-mailadres geldig is. Doe je dat voordat je het e-mailadres toevoegt aan het User object? Dus zo:
// de code klopt niet helemaal en is niet volledig
// het gaat enkel even om de denkwijze
Of... laat je de setMail() method in de User class het e-mailadres controleren? Zoiets als dit:
Je kunt de validatie beter aan de methode overlaten. In de class User kunnen andere of aanvullende regels gelden voor e-mailadressen dan in andere klassen.
Wel kun je de algemene validatie natuurlijk delegeren aan een aparte klasse voor een e-mailadres.
Wel kun je de algemene validatie natuurlijk delegeren aan een aparte klasse voor een e-mailadres.
Thanks Ward. Dat was ook mijn 1e gedachte.
Ik vroeg me alleen het volgende af. Je controleert het mailadres in de class zelf (evenals naam, geboortedatum e.d.). Vervolgens sla je de user op. De volgende keer haal je de (al gecontroleerde) gegevens uit de database. Je gebruikt weer de setters, en dan wordt alles weer opnieuw gecontroleerd. Dat is dus dubbelop. Hoe kun je dat voorkomen?
Ik vroeg me alleen het volgende af. Je controleert het mailadres in de class zelf (evenals naam, geboortedatum e.d.). Vervolgens sla je de user op. De volgende keer haal je de (al gecontroleerde) gegevens uit de database. Je gebruikt weer de setters, en dan wordt alles weer opnieuw gecontroleerd. Dat is dus dubbelop. Hoe kun je dat voorkomen?
Ik doe het zelf buiten de User class.
Hier haal ik mijn hele post door de FormValidator class. Is alles correct dan gooi ik hem pas in het User object.
Hier haal ik mijn hele post door de FormValidator class. Is alles correct dan gooi ik hem pas in het User object.
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
if ($form -> isMethod('post')) {
$fields = $form -> getFields(array('user', 'pass', 'email', 'role', 'fullname'));
$validator = new FormValidator($fields);
$validator -> rule('required', array('user', 'pass', 'email', 'fullname'));
$validator -> rule('email', 'email');
$validator -> rule('in', 'role', array(1, 2));
if ($validator -> validate()) {
$user -> setUsername($fields['user']);
$user -> setPassword($fields['pass']);
$user -> setEmail($fields['email']);
$user -> setRole($fields['role']);
$user -> setFullname($fields['fullname']);
$user -> create();
//....
} else {
print_r($validator -> errors());
}
}
?>
if ($form -> isMethod('post')) {
$fields = $form -> getFields(array('user', 'pass', 'email', 'role', 'fullname'));
$validator = new FormValidator($fields);
$validator -> rule('required', array('user', 'pass', 'email', 'fullname'));
$validator -> rule('email', 'email');
$validator -> rule('in', 'role', array(1, 2));
if ($validator -> validate()) {
$user -> setUsername($fields['user']);
$user -> setPassword($fields['pass']);
$user -> setEmail($fields['email']);
$user -> setRole($fields['role']);
$user -> setFullname($fields['fullname']);
$user -> create();
//....
} else {
print_r($validator -> errors());
}
}
?>
Gewijzigd op 26/02/2014 17:52:47 door Jordi Kroon
Ik sluit me aan bij Jordi. Een user classe mag geen validatie doen!!! Dat behoort namelijk niet tot z'n verantwoordelijkheden.
Dankjulliewel heren!
@Jordi:
Ik zit even jouw code te bekijken en heb een paar vraagjes.
- Waar maak jij je user object aan?
- Ik zie dat je de fullname niet controleert op bijv. het aantal tekens en of er geen cijders in staan?
- Zet je altijd spaties rondom -> ? Dus $foo -> foo(); (viel me ineens op)
- Wat doet de create method?
@Jordi:
Ik zit even jouw code te bekijken en heb een paar vraagjes.
- Waar maak jij je user object aan?
- Ik zie dat je de fullname niet controleert op bijv. het aantal tekens en of er geen cijders in staan?
- Zet je altijd spaties rondom -> ? Dus $foo -> foo(); (viel me ineens op)
- Wat doet de create method?
De create method maakt een nieuwe gebruiker aan. Verder check ik nog in de method of de user niet al bestaat etc, maar dat is in dit voorbeeld niet relevant. Ik check altijd alles eerst voordat ik alles in het user object gooi. Het user object maak ik in het begin al aan, maar het is beter om dit te doen na de validate.
Ik gebruik altijd spaties rondom " -> ". Dit doet mijn IDE (Aptana) automatisch bij re-indenting. Inmiddels ben ik er aan gewend en merk ik dat je code uiteindelijk overzichtelijker wordt als je er spaties omheen zet.
Verder controleer ik hier niet op het aantal chars en of het cijfers bevat of niet aangezien het code is uit mijn backend systeem (persoonlijk gebruik) :-)
Ik gebruik altijd spaties rondom " -> ". Dit doet mijn IDE (Aptana) automatisch bij re-indenting. Inmiddels ben ik er aan gewend en merk ik dat je code uiteindelijk overzichtelijker wordt als je er spaties omheen zet.
Verder controleer ik hier niet op het aantal chars en of het cijfers bevat of niet aangezien het code is uit mijn backend systeem (persoonlijk gebruik) :-)
>> De create method maakt een nieuwe gebruiker aan.
Hoe bedoel je dit? Je hebt toch al een user object?
>> Ik gebruik altijd spaties rondom " -> ".
Ah oké. Ga je je code dan ook op die manier uitlijnen? Dus dat je de pijlen gelijkzet? Bijv.
Hoe bedoel je dit? Je hebt toch al een user object?
>> Ik gebruik altijd spaties rondom " -> ".
Ah oké. Ga je je code dan ook op die manier uitlijnen? Dus dat je de pijlen gelijkzet? Bijv.
over die save() method: Hij bedoelt waarschijnlijk dat hij dan insert in de database. Wat overigens ook geen verantwoordelijkheid van de user classe mag zijn; daar heb je mappers voor.
Gewijzigd op 27/02/2014 22:00:37 door - Raoul -
Oké, thanks Raoul!




