ints en strings

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

03/03/2014 15:20:52
Quote Anchor link
Ola,

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?
 
PHP hulp

PHP hulp

22/12/2024 06:29:53
 
Wouter J

Wouter J

03/03/2014 15:31:21
Quote Anchor link
Waarom zou een getal ineens tekst moeten worden als je er niet mee gaat rekenen? Het is sowieso al absurt dat een getal een string kan worden in PHP, laat staan dat het een best practise is...

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
 
Ozzie PHP

Ozzie PHP

03/03/2014 15:37:16
Quote Anchor link
>> Waarom zou een getal ineens tekst moeten worden als je er niet mee gaat rekenen?

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
 
Wouter J

Wouter J

03/03/2014 15:38:49
Quote Anchor link
> Dit wordt vaak gedaan. Om het handig in de database op te kunnen slaan.

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.
 
Ozzie PHP

Ozzie PHP

03/03/2014 15:44:09
Quote Anchor link
>> Herinner je je nog mijn betogen over het normalizeren van de data?

Jup :)

En geef je die waarde dan als string mee? Of gebruik je class constants?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$user
->setGender('man');

of

$user->setGender(USER::MAN);
?>
 
Wouter J

Wouter J

03/03/2014 15:47:47
Quote Anchor link
Gewoon lekker strings :)
 
Ozzie PHP

Ozzie PHP

03/03/2014 15:50:58
Quote Anchor link
Dat is inderdaad wel makkelijk, maar ben je dan niet bang dat je per ongeluk het verkeerde gebruikt? Bijv. was het nou $user->setGender('man') of $user->setGender('male')? Hoe ga je daar dan mee om?



Weet iemand hoe dat zit met mijn vraag over getallen die eigenlijk addressen zijn? Bijv. een servport, is dat een getal of een adres?
 
Wouter J

Wouter J

03/03/2014 17:07:59
Quote Anchor link
>> Bijv. was het nou $user->setGender('man') of $user->setGender('male')? Hoe ga je daar dan mee om?

Validatie :)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>
Gewijzigd op 03/03/2014 17:08:20 door Wouter J
 
Ozzie PHP

Ozzie PHP

03/03/2014 17:10:44
Quote Anchor link
Ah oké... gewoon valideren dus :)

Ben nog wel benieuwd waarom je deze aanpak prefereert boven het gebruik van constants. Speciale reden voor?
 
Wouter J

Wouter J

03/03/2014 17:12:42
Quote Anchor link
>> 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.
 
Ozzie PHP

Ozzie PHP

03/03/2014 17:16:24
Quote Anchor link
Maar je zou ook kunnen kiezen voor iets als USER::GENDER_MALE en USER::GENDER_FEMALE.

Op deze manier je constants gebruiken is toch ook een aparte naam voor? Kan er even niet opkomen...
 
Wouter J

Wouter J

03/03/2014 17:17:51
Quote Anchor link
>> Maar je zou ook kunnen kiezen voor iets als USER::GENDER_MALE en USER::GENDER_FEMALE.

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.
 
Ozzie PHP

Ozzie PHP

03/03/2014 17:23:22
Quote Anchor link
>> En waarom zou je dat ooit gaan doen?

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?
 
Milo S

Milo S

03/03/2014 18:57:30
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

03/03/2014 19:04:18
Quote Anchor link
Hoe zou jij het dan doen Milo?
 
Milo S

Milo S

03/03/2014 19:19:19
Quote Anchor link
Persoonlijk zou ik een method hebben als setGender. En dan waardes als male / female meegeven. Op basis daarvan kan je de waardes in je database zetten. 0 = vrouw, 1 = man of andersom. Getallen in mijn code voor deze dingen vind ik onduidelijk. Dat moet je ook allemaal weer gaan documenteren voor als je bijvoorbeeld een gezamenlijk project hebt. Want waar staat setGender('0') nou weer voor? Als er staat setGender('male') is dat gelijk duidelijk. Snap je waar ik heen wil?

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
 
Ozzie PHP

Ozzie PHP

03/03/2014 19:28:32
Quote Anchor link
>> Snap je waar ik heen wil?

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>

Zouden jullie het dan op deze manier doen?
 
Milo S

Milo S

03/03/2014 19:36:51
Quote Anchor link
Theoretisch gezien wel ja. Wellicht dat mijn luiheid overwint hier om de volledige tekst over te nemen, maar voor nummers zou ik nog steeds wijken. Ik zou anders continu moeten kijken welk nummer waar voor staat. Of documenteren natuurlijk en het zo over kunnen nemen.

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
 
Koen Vlaswinkel

Koen Vlaswinkel

03/03/2014 20:01:21
Quote Anchor link
Ik denk dat ik zoiets als dit zou doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class User {
  const GENDER_UNKNOWN = 0;
  const GENDER_MALE = 1;
  const GENDER_FEMALE = 2;
  private $gender;

  public function setGender($gender) {
    $this->gender = $gender;
  }


  public function getGender() {
    return $this->gender;
  }
}


$user = new User();
$user->setGender(User::GENDER_MALE);
?>


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
 
Ivo P

Ivo P

03/03/2014 20:12:37
 
Ozzie PHP

Ozzie PHP

03/03/2014 20:14:30
Quote Anchor link
@Milo:

>> 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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.