[oop] controlestructuur
Waarom is dat?
Ik zou denken, je slaat iemands geslacht op als const male = 1; en in je Nederlandse vertaalbestand zet je dan niet 1 = mannelijk, maar male = mannelijk. "Male" is dan een soort van key. Dat was mijn gedachte erachter.
In plaats van dit:
krijg je dan...
Code (php)
1
2
3
4
2
3
4
female = vrouwelijk
inapplicable = niet van toepassing
male = mannelijk
unknown = onbekend
inapplicable = niet van toepassing
male = mannelijk
unknown = onbekend
In de 2e variant is toch veel duidelijker wat je aan het doen bent?
Binnen de applicatie fungeert "male" dus als de key en de waarde die daar toevalligerwijs bijhoort is 1, maar die waarde die gebruik je in je code niet. Alleen als je het wil opslaan.
Gewijzigd op 05/05/2014 21:50:14 door Ozzie PHP
Maar wat jij doet is male aan 1 hangen, terwijl 1 ook mannelijk of homme kan zijn.
Onder andere vanwege spaties.
0, 1, 2 en 3 zijn machine-readable
terwijl
unknown, male, female en inapplicable human-readable
Het eerste sla je op in de database. Het tweede gebruik je tijdens het programmeren. (constante/variabele namen, de waarde die je aan een factory method geeft zodat het een value object maakt, etc)
Als je value objecten gebruikt dan wil je dat de __toString() methode de human-readable returned. En een andere methode (get<classnaam>() bijvoorbeeld) de machine-readable versie.
De human-readable data kun je van gebruiken als key om de nederlandse/engelse/franse/whatever vertaling te krijgen.
De machine-readable data sla je op in de database/json/xml/whatever.
Gewijzigd op 05/05/2014 22:06:34 door Dos Moonen
>> Maar wat jij doet is male aan 1 hangen, terwijl 1 ook mannelijk of homme kan zijn.
Wat ik probeer (of denk) te doen is het volgende.
Binnen de applicatie gebruik ik de taal engels. Mijn "key" voor "mannelijk" wordt daarom "male". De value die bij male hoort is 1. Als ik nu een man opsla in de database, dan doe ik dus $user->setGender(gender::male). In de database wordt dan een 1 opgeslagen. Leuk voor de database, maar die 1 is voor mij niet belangrijk, want die hoef ik niet te onthouden. Ik onthou alleen maar "male". Stel nu dat een duitse gebruiker heb, dan haal ik die 1 weer uit de database. Via die getConstName maak ik van die 1 weer "male".
Wat ik dan dus vervolgens kan doen is een Frans woordenboek waarin staat male = homme en een nederlands woordenboek waarin staat male = mannelijk.
Dat is mijn intentie in ieder geval. Als ik nu in mijn gedachtengang een kapitale fout maak, dan hoor ik dat heel graag want dan moet ik het anders aanpakken. Dus graag je reactie.
@Dos:
Nu snap ik het even niet meer.
>> 0, 1, 2 en 3 zijn machine-readable
>> unknown, male, female en inapplicable human-readable
Precies! Daarom maak ik van de value weer een human-readable waarde, zodat ik deze weer kan gebruiken tijdens het programmeren. Daarmee doe ik toch precies wat jij zegt?
'NOT_APPLICABLE' of 'Not appplicable'?
Jij komt nu wel op een begrijpelijkere waarde uit, maar dat is meer een programmer-readable versie, niet human-readable.
Gewijzigd op 05/05/2014 22:23:09 door Dos Moonen
Ik zou uitkomen op "inapplicable", maar dat is inderdaad een programmer-readable versie. In het vertaalbestandje zou je dan krijgen:
inapplicable = niet van toepassing
Dus wat ik als "key" gebruik is een programmer-readable versie. Klopt het dan zoals ik het doe?
Nog even een andere vraag. Die language::init() in hetzelfde bestand vond ik een top-tip, maar die kun je niet in een abstracte class zetten jammer genoeg, en dan moet ik het dus in iedere child class gaan zetten. Zou op zich kunnen, maar zou handiger zijn als het in de parent class kan. Weet jij toevallig nog een andere oplossing daarvoor? Of is die er niet?
http://verraes.net/2013/02/casting-value-objects/ en http://www.phphulp.nl/php/forum/topic/oop-hoe-consante-terugkrijgen/94745/#679963
Dos, toString in value objecten kun je beter niet gebruiken voor het presenteren van de value. Op die manier beperk je jezelf erg, zie ook Wouter J op 05/05/2014 22:37:54:
Dos, toString in value objecten kun je beter niet gebruiken voor het presenteren van de value. Op die manier beperk je jezelf erg, zie ook http://verraes.net/2013/02/casting-value-objects/ en http://www.phphulp.nl/php/forum/topic/oop-hoe-consante-terugkrijgen/94745/#679963
De waarde van de __toString() zou ik bijvoorbeeld gebruiken voor log files en lookup keys. Inderdaad niet voor de UI.
Gewijzigd op 05/05/2014 22:50:14 door Dos Moonen
Dos, of iemand anders, weet je het antwoord op mijn vraag? Doe ik het nu dan goed?
Hangt er vanaf of je probeert value objects te gebruiken of niet. Op het moment zou je miserabel falen als dat is wat je probeert.
Als je alleen magic numbers probeert weg te werken ben je goed bezig door constanten te gebruiken.
Al voelt het gebruik van reflection om de tekstuele waarde te verkrijgen nog steeds een beetje als een hack.
"Nog even een andere vraag. Die language::init() in hetzelfde bestand vond ik een top-tip, maar die kun je niet in een abstracte class zetten jammer genoeg, en dan moet ik het dus in iedere child class gaan zetten. Zou op zich kunnen, maar zou handiger zijn als het in de parent class kan. Weet jij toevallig nog een andere oplossing daarvoor? Of is die er niet?"
Je zou een speciale classloader kunnen maken die de init methode aanroept als de net geladen class een bepaalde (InitializeOnAutoload?) interface implementeert.
Dat is wat ik probeer. Ik wil dus voorkomen dat ik bijv. een woordenboek krijg met 1 = mannelijk. Liever wordt het dan male = mannelijk. Maar ik moet dan dus die "male" weer terugkrijgen aan de hand van de value 1.
>> Al voelt het gebruik van reflection om de tekstuele waarde te verkrijgen nog steeds een beetje als een hack.
Tja... weet je een betere oplossing? :-s
>> Je zou een speciale classloader kunnen maken die de init methode aanroept als de net geladen class een bepaalde (InitializeOnAutoload?) interface implementeert.
Oké... dan zou ik dat dus in mijn autoloader zetten, zoiets als?
Zou zoiets de boel niet erg vertragen, aangezien je dan per class een extra controle moet uitvoeren?
Ik stel voor dat je je tijd beter besteed door sql queries te optimaliseren of een OPCode cache voor php installeert en configureert.
Ik vraag me alleen dus af hoe ik dat moet aanpakken. Ik heb dus een autoload function:
Nu krijg ik in die autload function dus de class-naam binnen, maar dat is nog geen object. En omdat het geen object is kan ik ook niet checken of het een instance is van InitializeOnAutoload. Hoe kan ik dat het beste aanpakken?
Volgens mij is daar de is_a() functie voor
Ik snap het niet Dos. Die is_a verwacht ook een object. En ik heb helemaal geen object, maar alleen een class-naam.
Dan blijft is_subclass_of() over
Lol!!!
Ik ga er morgen even mee spelen. Thanks ;)