ints en strings
Iemand op het forum vertelde eens dat als je niet met een getal gaat rekenen, dat je het dan beter kunt opslaan als een string. Geldt dat voor alle situaties?
Bijvoorbeeld... als ik wil vastleggen of een user een man of vrouw is gebruik ik een 1 (man) en 0 (vrouw). Ik gebruik dan getallen. Zouden dat dan eigenlijk strings moeten zijn? Hetzelfde bijv. voor een serverport. Is dat een string of een getal? Omdat het om een poortNUMMER gaat, zou je zeggen een getal. Maar het is niet iets waar je mee gaat rekenen. Iemand die dit kan verduidelijken?
Merk wel op dat niet elk nummer een getal is. Een UUID bijv: 550e8400-e29b-41d4-a716-446655440000 of een IBAN: NL20INGB0001234567
En waarom zou je voor het geslacht getallen gebruiken? Gebruik dan of 'man', 'woman' of gebruik $man = true/false
Gewijzigd op 03/03/2014 15:32:17 door Wouter J
Dat was dus mijn vraag. Bijv. stel je hebt een pincode. Volgens mij is dat ook een string, omdat je er niet mee gaat rekenen. Dus $pin = '1234' en niet $pin = 1234. Ik kan me vergissen, maar ik dacht dat je van een code/adres beter een string kunt maken. Dus vandaar mijn vraag. Bijv. moet je een serverport zien als een getal of als een "adres"?
>> En waarom zou je voor het geslacht getallen gebruiken? Gebruik dan of 'man', 'woman' of gebruik $man = true/false
Dit wordt vaak gedaan. Om het handig in de database op te kunnen slaan. Voor een vrouw wordt een 0 gebruikt, omdat de vrouw een gaatje heeft :D en voor een man een 1, omdat die een stokje heeft :D
Gewijzigd op 03/03/2014 15:37:47 door Ozzie PHP
Herinner je je nog mijn betogen over het normalizeren van de data? Dat iets als 0 en 1 wordt opgeslagen in de database betekend niet dat je in de code ook met 0 en 1 moet werken. Het maakt je code veel begrijpelijker als je met 'man' en 'woman' werkt.
Jup :)
En geef je die waarde dan als string mee? Of gebruik je class constants?
Gewoon lekker strings :)
Weet iemand hoe dat zit met mijn vraag over getallen die eigenlijk addressen zijn? Bijv. een servport, is dat een getal of een adres?
Validatie :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
// hoort aangeroepen te worden in de constructor
public function setGender($gender)
{
if ('female' !== $gender || 'male' !== $gender) {
throw new \InvalidArgumentException(sprintf('Unknown gender ("%s") given for Person "%s", gender can be either "male" or "female".', $gender, $this->getName()));
}
$this->gender = $gender;
}
?>
// hoort aangeroepen te worden in de constructor
public function setGender($gender)
{
if ('female' !== $gender || 'male' !== $gender) {
throw new \InvalidArgumentException(sprintf('Unknown gender ("%s") given for Person "%s", gender can be either "male" or "female".', $gender, $this->getName()));
}
$this->gender = $gender;
}
?>
Gewijzigd op 03/03/2014 17:08:20 door Wouter J
Ben nog wel benieuwd waarom je deze aanpak prefereert boven het gebruik van constants. Speciale reden voor?
Constants zijn 1 van de meest misbruikte dingen in PHP. Als je constants wil gebruiken moet je iets van Gender::MALE en Gender::FEMALE hebben en dan zou gender een Value Object worden, wat in dit geval totaal overdone is.
Op deze manier je constants gebruiken is toch ook een aparte naam voor? Kan er even niet opkomen...
En waarom zou je dat ooit gaan doen? Voor elke enumeration value een constant aanmaken? Je mag het doen, maar mijn lijkt het niet zo'n succes. Tevens vind ik constants met een standaard prefix niet mooi.
Dat was mijn vraag. Ik heb het hier op het forum regelmatig voorbij zien komen dat als je meerdere opties hebt, je beter constants kunt gebruiken, zodat je je niet kunt vergissen. Jouw methode snap ik ook, maar dan moet je je dus wel heel bewust zijn van de keuzes die je hebt.
Wellicht nog een ander idee: een setGenderMale en setGenderFemale method?
In het oogpunt van DRY zou ik dat dan weer niet doen, je gaat immers twee dezelfde methods maken welke slechts een andere waarde doorsturen.
Hoe zou jij het dan doen Milo?
Dat zou denk ik het eerste zijn waar ik zo voor zou kiezen. Doordat ik überhaupt al weinig tot nooit contstant gebruik zal ik er ook niet zo snel naar grijpen.
En iets met booleans vindt ik overdreven stappen. Bedoel als ik zeg $man = TRUE; zou dat dus betekenen dat $famele FALSE zou zijn. Wat als je het mij vraagt ook weer extra gevalideerd zou moeten worden. Stel namelijk dat jou input beide variabelen TRUE geeft. Dat kan theoretisch gezien niet. Omslachtig dus.
En een pincode zou bij mij wel als string meegaan. Zoals Wouter aangeeft, niet ieder nummer is een getal. Zo beschouw ik een pincode niet als een getal. Als je je pincode uitspreekt zeg je ook niet twaalfhonderdvierendertig, maar 1, 2, 3, 4. Hetzelfde geld voor een telefoonnummer.
Gewijzigd op 03/03/2014 19:26:04 door Milo S
Ja, ik begrijp je volledig. Dat is dezelfde manier als die Wouter beschrijft.
Maar misschien kan ik de vraag dan breder trekken (ANDERE MENSEN MOGEN OOK REAGEREN... GRAAG ZELFS).
De keuze is nu nog vrij makkelijk. Wat kan een geslacht zijn? Mannelijk of vrouwelijk. Maar wat nu als we meerdere keuzes hebben.
Stel we halen data op uit een database. Deze data kunnen we terugkrijgen als een numerieke array, als een associatieve array, als een associatieve en numerieke array, als een gedefinieerd object of als een stdClass object. Ga je dan ook nog steeds strings gebruiken? Bijv. zoiets?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$data = $db->getData($query, 'as_numeric_array');
$data = $db->getData($query, 'as_associative_array');
$data = $db->getData($query, 'as_associative_numeric_array');
$data = $db->getData($query, 'as_object');
$data = $db->getData($query, 'as_stdclass_object');
?>
$data = $db->getData($query, 'as_numeric_array');
$data = $db->getData($query, 'as_associative_array');
$data = $db->getData($query, 'as_associative_numeric_array');
$data = $db->getData($query, 'as_object');
$data = $db->getData($query, 'as_stdclass_object');
?>
Zouden jullie het dan op deze manier doen?
Nee ik zou nog steeds geen nummers nemen. Ik vindt dat de code onduidelijker maken. Ik hou er van om alles in 1 oogopslag te kunnen zien. En dus niet eerst de documentatie moeten om aan de slag te kunnen lezen.
Offtopic:
Het is dat ik steeds weer wat actiever wordt (tot ik weer stage moet lopen en weer geen tijd heb), maar ik denk dat er weinig zijn hier die ook mee gaan in deze discussies.
Nu is dit nog niet wat code betreft het moeilijkste, maar ik merk aan mijzelf dat nu ik eindelijk mijn eigen klasses ook een beetje op orde krijg ik ook meer mee kan discussiëren over deze en ook moeilijkere onderwerpen.
Ik geloof niet dat er echt veel gebruikers bezig zijn met OO. Althans niet die continu reageren. Geeft niet, is de goed recht, maar het verklaard wellicht waarom ik in ieder geval jou en Wouter steeds voorbij zie komen in discussies.
Wat erg leuk is overigens, vaak heb ik er namelijk ongelooflijk veel aan ;).
Gewijzigd op 03/03/2014 19:41:29 door Milo S
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dit vooral omdat je Dan niet hoeft na te denken over male/man. Ook hoef ik zo niet elke keer te converten voor de database.
Offtopic:
Voor gender codes, zie http://en.m.wikipedia.org/wiki/ISO/IEC_5218
http://www.elsevier.nl/Tech/nieuws/2014/2/Engelstalige-Facebook-geeft-vijftig-gender-opties-1463724W/
en voor iso waarden:
http://en.wikipedia.org/wiki/ISO/IEC_5218
en voor iso waarden:
http://en.wikipedia.org/wiki/ISO/IEC_5218
>> Nee ik zou nog steeds geen nummers nemen. Ik vindt dat de code onduidelijker maken.
Dit ben ik helemaal met je eens! Ik zou ook zeker geen nummers gebruiken in dit geval. In het geval van het gender verhaal vond ik het handig omdat je weet gaatje is vrouw en staafje is mannetje.
Maar oké... geen nummers, maar strings dus. En wat vind je dan van de methode van Koen?
>> maar ik merk aan mijzelf dat nu ik eindelijk mijn eigen klasses ook een beetje op orde krijg ik ook meer mee kan discussiëren over deze en ook moeilijkere onderwerpen.
Leuk, een extra gesprekspartner kan zeker geen kwaad :)
>> Wat erg leuk is overigens, vaak heb ik er namelijk ongelooflijk veel aan ;).
Goed om te horen :)
@Koen:
Thanks voor het meedenken. Dat is een manier die mij ook wel aanspreekt, alhoewel ik de unknown optie dan gewoon achterwege zou laten. Als je het geslacht niet weet, dan set je het ook niet.
In algemene zou je dus kunnen zeggen dat we het er allemaal over eens zijn dat je niet met getallen moet werken. Wat er dan overblijft is werken met strings of met constants.
De vraag die dan rest is wat de voor- en nadelen zijn van beide methodes. Wie durft?
Toevoeging op 03/03/2014 20:16:11:
@Ivo: thanks voor de toevoeging. Waarom niet mannetje 1 en vrouwtje 0? Veel makkelijker te onthouden :-s