dicht timmeren?
Wel ben ik een voorstander van een goede fout afhandeling, waarbij een fout goed te traceren is, iedereen maakt namelijk weleens een foutje :), zou je de controle's weghalen, dan kan het met dergelijke foutjes uren kosten om het probleem te achterhalen.
Met ttrim ga je een mogelijke fout tegen, maar is het niet beter om de fout gewoon te laten gebeuren?
Als die extra controles gaan uiteindelijk (zij het minimaal) ten koste van de performance. Mijn vraag is vooral, wanneer wel controleren en wanneer niet. Jij geeft aan dat je een voorstander bent van goede foutafhandeling zodat een fout goed te traceren is. Tegelijkertijd houdt dit dat in dat je dan alles moet gaan controleren, want in elke functie kan wel iets fout worden ingevoerd. Hoe ver moet je gaan?
Zelf zou ik het inbouwen, qua performence is het nauwelijks merkbaar.
Enkele jaren geleden hebben enkele andere programmeurs en ik zelf een eigen mvc framework geschreven voor oa ons eigen cms systeem, en in de eerste versie hadden we dezelfde gedachte, om niet alles te controleren, maar gewoon dit in de documentatie te vermelden, in de daarop volgende versies hebben we steeds meer controles ingebouwd, aangezien dit het debuggen van de applicatie vergemakkelijkt en versneld.
Wel is het zo dat je te ver kunt gaan met het controleren, je moet gewoon voor jezelf afvragen of het nut heeft om erop te controleren of niet.
Laten we dan eens een heel concreet voorbeeld verzinnen! Stel, de programmeur moet ergens een domein invullen. Dit domein moet eindigen op een forward slash en mag niet beginnen met "http://" (dat wordt automatisch geprefixt door de variabele $connection). Het domein wordt gesuffixed met $page.
Laten we de variabele die de programmeur moet invullen $domain noemen.
Dan kunnen er een aantal dingen gebeuren:
Code (php)
1
2
3
2
3
$connection = 'http://';
$page = 'producten';
$domain = ''; //invullen door de programmeur
$page = 'producten';
$domain = ''; //invullen door de programmeur
1) De programmeur vult $domain goed in:
$domain = 'www.mijnsite.nl/';
De volledige url wordt nu http://www.mijnsite.nl/producten
2) De programmeur vergeet de slash op het eind:
$domain = 'www.mijnsite.nl';
De volledige url wordt nu http://www.mijnsite.nlproducten
3) De programmeur vult het http:// deel ook in:
$domain = 'http://www.mijnsite.nl/';
De volledige url wordt nu http://http://www.mijnsite.nl/producten
4) De programmeur typt per ongeluk aan het eind 2 slashen in plaats van 1:
$domain = 'www.mijnsite.nl//';
De volledige url wordt nu http://www.mijnsite.nl//producten
Nu is dus de vraag A) of je de variabele $domain moet controleren en B) zo ja, wat moet je dan controleren.
In het bovenstaande voorbeeld is het resultaat bij optie 1 perfect. De url klopt en kan gebruikt worden. Bij optie 2 en 3 klopt de url niet en er zal een fout optreden als deze wordt aangeroepen. Bij optie 4 klopt de url ook niet (er staat een dubbele slash in) , maar deze zal wel werken omdat de server/browser de dubbele slash zal negeren.
Maar de vraag is nu dus, ga je $domain controleren, ja of nee... en als je het gaat controleren WAT ga je dan controleren?
Wat zou je allemaal kunnen controleren?
- is $domain een string? (heeft de programmeur bijvoorbeeld niet toevallig een int of boolean ingevuld?)
- eindigt $domain op een forward slash?
- staan er geen ongeldige tekens in $domain (bijvoorbeel !, @ of spatie)
- begint $domain niet met "http(s)://"
- bevat de complete url geen dubbele slashes?
Zoals je ziet kun je dus op behoorlijk wat zaken een controle uitvoeren, maar hoe zinvol is dit? Dat zou ik graag willen weten. Ik kan er ook voor kiezen om geen enkele controle uit te voeren en als het dan misgaat krijg ik vanzelf wel een foutmelding. Wat is wijsheid?
Gewijzigd op 06/04/2012 20:23:06 door Ozzie PHP
Ja en nee, ik zou dit via een installer laten lopen, die dit valideert, en niet iedere keer als een site bezocht wordt, in het laatste geval is dit een zeer overbodige controle.
Stel je hebt een functie showMessage($message, $die = false).
Die functie kun je als volgt maken:
Code (php)
Maar je kunt 'm ook zo maken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
public function showMessage($message, $die = false) {
if (!is_string($message)) {
die('Het bericht moet een string zijn!');
}
if (trim($message) == '') {
die('Het bericht mag niet leeg zijn!');
}
echo $message;
if (!is_bool($die)) {
die('De variabele $die moet een boolean zijn!');
}
if ($die) {
die();
}
}
?>
public function showMessage($message, $die = false) {
if (!is_string($message)) {
die('Het bericht moet een string zijn!');
}
if (trim($message) == '') {
die('Het bericht mag niet leeg zijn!');
}
echo $message;
if (!is_bool($die)) {
die('De variabele $die moet een boolean zijn!');
}
if ($die) {
die();
}
}
?>
Wanneer moet je extra controles uitvoeren. Is daar een soort "regel" voor?