dicht timmeren?
Stel je hebt een functie:
Nu moeten zowel $key als $path een string bevatten. Deze functie wordt uitsluitend gebruikt door de programmeur. Mensen van buitenaf kunnen deze functie niet aanroepen (bijvoorbeeld d.m.v. een formulier).
Nu vraag ik me af of ik moet controleren of zowel $key als $path een string zijn. Of gaat dat te ver? Anders moet je namelijk bij heel veel functies dit soort controles uitvoeren. Enerzijds veel controle structuren / overhead en extra code, anderzijds. De input klopt wel altijd.
Graag jullie meningen!
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
public function setPath( $key, $path )
{
$key = (string) $key;
$path = (string) $path;
// of als je ze ergens in gebruikt of opslaat in een property dan
// gebruik ik daar typecasting
}
?>
public function setPath( $key, $path )
{
$key = (string) $key;
$path = (string) $path;
// of als je ze ergens in gebruikt of opslaat in een property dan
// gebruik ik daar typecasting
}
?>
Behalve natuurlijk als ik ze in een PHP functie gooi en zeker weet dat die altijd een string returned.
Ik wil niet (zoals in jouw voorbeeld) dat een boolean wordt geconverteerd naar een string "1".
Mijn vraag is dus echt of je dit moet doen:
Code (php)
Mijn vraag is of je dit soort controles moet inbouwen. Wel gebruiksvriendelijk, maar het betekent ook een hoop extra code en dus meer werk.
Vertel de programmeur wat de functie doet, wat elke parameter is, ... en daar ga je uiteraard vertellen wat het type is.
En denk ook eens na wat je zou doen indien iets gebeurt wat je niet verwacht.
Wat zou je effectief doen binnen die if() ?
Een return false terug geven, gebeurt wel vaker.
Maar een echo $error ...
Tja, wat heb je daar echt aan?
Maar inderdaad, die controlles lijken mij onnodig. In elk geval wel voor types. Andere dingen zou je natuurlijk wel kunnen checken, of het bepaalde waardes bevat en wel is wat je verwacht. En een array controleren is ook nog handig, maar of iets een bool, string of int is zou ik niet controleren.
In die if zou ik een exception willen gooien die een bericht toont dat de variabele van het verkeerde type is.
(hoe geef jij aan wat voor type de parameter moet zijn?)
Toevoeging op 29/02/2012 11:02:48:
Wouter J op 29/02/2012 11:01:42:
@Kris, ik denk dat Ozzie een Exception gaat throwen in de if.
correct ;)
Ozzie PHP op 29/02/2012 11:02:12:
(hoe geef jij aan wat voor type de parameter moet zijn?)
Een voorbeeld, dit staat (als user commentaar) op php.net, bij strpos()
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
/**
* This function implements all the strn*pos functions, which return the $nth occurrence of $needle
* in $haystack, or false if it doesn't exist / when illegal parameters have been supplied.
*
* @param string $haystack the string to search in.
* @param MIXED $needle the string or the ASCII value of the character to search for.
* @param integer $nth the number of the occurrence to look for.
* @param integer $offset the position in $haystack to start looking for $needle.
* @param bool $insensitive should the function be case insensitive?
* @param bool $reverse should the function work its way backwards in the haystack?
* @return MIXED integer either the position of the $nth occurrence of $needle in $haystack,
* or boolean false if it can't be found.
*/
function strnripos_generic( $haystack, $needle, $nth, $offset, $insensitive, $reverse )
{
// If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
...
?>
/**
* This function implements all the strn*pos functions, which return the $nth occurrence of $needle
* in $haystack, or false if it doesn't exist / when illegal parameters have been supplied.
*
* @param string $haystack the string to search in.
* @param MIXED $needle the string or the ASCII value of the character to search for.
* @param integer $nth the number of the occurrence to look for.
* @param integer $offset the position in $haystack to start looking for $needle.
* @param bool $insensitive should the function be case insensitive?
* @param bool $reverse should the function work its way backwards in the haystack?
* @return MIXED integer either the position of the $nth occurrence of $needle in $haystack,
* or boolean false if it can't be found.
*/
function strnripos_generic( $haystack, $needle, $nth, $offset, $insensitive, $reverse )
{
// If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.
...
?>
Er zijn nog andere coding standards voor commentaar, maar deze stijl is wel gebruikelijk.
Trouwens ...
Goede naamgeving helpt ook heel erg.
De namen $needle en $haystack gebruiken telkens je iets zoekt/detecteert in een groter geheel, is ook een goed idee
Gewijzigd op 29/02/2012 11:51:11 door Kris Peeters
Kris, ik bedacht me net: hoe noem je een sql resource als je type?
Als iets een array moet zijn of een object van een bepaalde instantie, zetten jullie dat dan wel bij de parameters of zet je dat allemaal in het commentaar? Bijv.
Thx, dat moest ik weten. Terug naar het onderwerp!
Even een voorbeeldje van hoe ik een method zou schrijven in PHP:
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
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
<?php
/**
* This class is a example of PHPdoc and typing
*
* @author Wouter J
* @package <Project naam>
* @subpackage <Namespace naam>
* @license Creative Commons 0.0
*/
class Example
{
/**
* All values that where set in this object
*
* @var array
*/
protected $items = array();
/**
* Add an item to the object
*
* @param string $key The key of the item
* @param mixed $value The value of the items
*/
public function setItem( $key, $value )
{
$this->items[$key] = $value;
}
/**
* Add multiple items to the object
*
* @param array $items All items with Array key represents the name and the array value the value
*/
public function setItems( array $items )
{
foreach( $items as $key => $value )
{
$this->items[$key] = $value;
}
}
}
?>
/**
* This class is a example of PHPdoc and typing
*
* @author Wouter J
* @package <Project naam>
* @subpackage <Namespace naam>
* @license Creative Commons 0.0
*/
class Example
{
/**
* All values that where set in this object
*
* @var array
*/
protected $items = array();
/**
* Add an item to the object
*
* @param string $key The key of the item
* @param mixed $value The value of the items
*/
public function setItem( $key, $value )
{
$this->items[$key] = $value;
}
/**
* Add multiple items to the object
*
* @param array $items All items with Array key represents the name and the array value the value
*/
public function setItems( array $items )
{
foreach( $items as $key => $value )
{
$this->items[$key] = $value;
}
}
}
?>
Waarom bijv. niet:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
* Some function who does something
*
* @access protected
*/
protected function some()
{
// do something
}
/**
* This function does something with the values and return them
*
* @param string $prefix The prefix, default is null
* @return array $items The items
*/
public function doSomething( $prefix = null )
{
// ...
return $items;
}
?>
/**
* Some function who does something
*
* @access protected
*/
protected function some()
{
// do something
}
/**
* This function does something with the values and return them
*
* @param string $prefix The prefix, default is null
* @return array $items The items
*/
public function doSomething( $prefix = null )
{
// ...
return $items;
}
?>
Oké, thanks. Ik vind het maar onoverzichtelijk... meer commentaar dan code :D
Dat komt omdat de functies nu nog heel klein zijn. Bij getters en setters zou ik het ook niet gebruiken, was slechts een voorbeeld. Maar bij grotere functies is het zeker handig om snel een overzicht te krijgen van wat er in komt, wat er uit en wat er mee gebeurd.
Hmmm, oké... maar even terugkomend op mijn vraag. Goed documenteren dus, en parameters niet controleren op type, met uitzondering van array en instances? Is dat een terechte conclusie?
Quote:
met uitzondering van array en instances?
Ik neem aan dat je weet dat je die gewoon voor de var kan zetten?
Example:
Wanneer Ozzie nu geen instance van 'Aap' ( :-) ) is, wordt er een exceptie gethrowd.
Enne.. bedankt dat je me vergelijkt met een aap he! ;)