[oop] setFoo en/of setFoos?
Ik vraag me iets af. Ik heb functies waarbij je 1 "foo" wilt instellen en functies waarbij je meerdere "foos" wilt instellen. Bijv.
setPath($id, $path) // om 1 path in te stellen
setPaths($paths) // om meerdere paths in te stellen ($paths is een array)
Nu vraag ik me af of dat een goede gewoonte is. Ik gebruik 2 functies met bijna dezelfde functionaliteit, alleen in de ene situatie set je dus 1 foo, en in de andere situatie meerdere foos. Ik doe het op deze manier omdat ik denk dat dat efficiënt is. Je roept immers meteen de juiste functie aan.
Ik zou er ook voor kunnen kiezen om alles in 1 method te stoppen en dan op basis van het meegegeven argument te bepalen of er 1 foo moet worden geset of meerdere foos.
Dit komt bij mij best vaak voor. Zo heb ik nu in mijn mail class bijv. deze methods:
setBcc
setBccs
setCc
setCcs
setTo
setTos
Allemaal dubbele functies dus. Is dat wel of niet wenselijk? Het voordeel vind ik dat een functie altijd het juiste argument ontvangt en er dus geen extra controle hoeft plaats te vinden (betere performance). Het nadeel is dat je dus dubbele functies krijgt.
Graag jullie advies.
Normaal gesproken heb ik dan altijd setBcc om een array op te geven die de waarde overschrijft en een addBcc om iemand toe te voegen.
Ander voorbeeld... ik wil een path toevoegen en heb een addPath($id, $path) method, maar wat nu als ik ineens 100 paden wil toevoegen. Lijkt me niet handig om dan 100x die addPath method aan te roepen. Dan kunnen we 2 dingen doen lijkt mij. Of we maken een aparte addPaths() method, of we passen addPath aan zodat die een array kan ontvangen. Het gaat mij vooral om het principe... moet je aparte methods maken om 1 "foo" toe te kunnen voegen en een aparte method om meerdere "foos" toe te voegen, of... doe je dit altijd via 1 method?
De vraag is .. wil je 1 array hebben of wil je 100x een path object hebben.. toch?
@Ger: dit geeft niet echt antwoord op mijn vraag toch?
De vraag is, stel we willen binnen e-mail class bcc adressen kunnen toevoegen. Dat kan zijn 1 adres of meerdere adressen. Maken we dan 2 functies: 1 om 1 adres toe te voegen en 1 om meerdere adressen toe te voegen. Of maken we 1 functie waarmee we 1 adres, maar ook meerdere adressen kunnen toevoegen.
Snappen jullie mijn vraag?
Imo maakt het niet zoveel uit of je eerst een array samenstelt en die doorgeeft aan een functie, of telkens die functie aanroept. Het eerste zal in performance schelen, maar dan hebben het over nano seconden. Lekker belangrijk!
Stel ik wil 1 foo adden:
En stel ik wil meer foos setten dan krijg je dit:
Code (php)
1
2
3
4
2
3
4
<?php
$foos = [['id' => 'test', 'foo' => 'foo'], ['id' => 'bartest', 'foo' => 'foobar']];
addFoos($foos);
?>
$foos = [['id' => 'test', 'foo' => 'foo'], ['id' => 'bartest', 'foo' => 'foobar']];
addFoos($foos);
?>
In bovenstaand voorbeeld heb ik dus een class met een method addFoo en een method addFoos. Om dit dan door te trekken naar de praktijk, ik heb nu dus een e-mail class met deze methods:
setBcc
setBccs
setCc
setCcs
setTo
setTos
En de vraag is of dat gebruikelijk is, of is het gebruikelijk om alleen deze methods te hebben:
setBcc
setCc
setTo
... en er dan op een of andere manier voor te zorgen dat deze methods zowel 1 als meerdere foos kunnen setten. Wat is wijsheid?
Voorbeeld:
Stel we hebben een product en voor dit product wil ik slechts 1 producteigenschap setten, dan zou dat zo kunnen:
Maar stel ik heb een ander product met meerdere eigenschappen, dan krijg je zoiets:
Code (php)
1
2
3
4
2
3
4
<?php
$properties = ['kleur' => 'groen', 'materiaal' => 'hout'];
$product->setProperties($properties);
?>
$properties = ['kleur' => 'groen', 'materiaal' => 'hout'];
$product->setProperties($properties);
?>
Nu is mijn vraag of dit klopt. Ik heb nu 2 functies die bijna hetzelfde doen. Namelijk properties setten. Kan dat? Of moet ik bijv. de setProperty functie laten vallen en op het moment dat ik maar 1 property wil setten dit doen:
Ik hoop dat deze uitleg het iets duidelijker maakt.
En dan nogmaals, ik gebruik dus altijd de eerste maar dan niet setXXX, want dat is dus verkeerd.
Het kan zijn dat ik in het ene geval 1 ding wil setten en in het andere geval meerdere dingen. Het gaat echt om setten, dus niet om adden.
Stel ik wil in het ene geval in bcc adres setten en in het andere geval 2. Dan kan ik dus setBcc gebruiken voor 1 bcc adres en setBccs voor 2 adressen. Maar is dat gebruikelijk?
Ik snap het punt. Ik zou gewoon kijken of het meegegeven argument een array is met is_array.
Alleen dan ben ik benieuwd hoe ik het volgende moet oplossen. Weer even het bcc voorbeeld. Bij het toevoegen van 1 bcc adres doe ik nu setBcc('piet', '[email protected]'). Je hebt hier dus 2 argumenten. Terwijl je bij setBccs($bccs) 1 argument (een array) hebt. Hoe los je dat verschil in argumenten dan op? Ik vind het een lastige situatie.
Ozzie PHP op 05/07/2013 21:12:07:
Wouter, volgens mij begrijp je het nog niet. Of ik begrijp het niet, kan natuurlijk ook. Je moet dat add/sett even loslaten.
Volgens mij begrijpt Wouter prima wat jij bedoelt, maar dender jij weer eens lekker door omdat je perse een antwoord wil hebben dat jouw mening bevestigd. Als je Wouter's commentaar leest is het perfect duidelijk dat hij dus niets ziet in de setBccs, maar zou hij voor een add functie gaan. En dat lijkt mij ook een prima oplossing inderdaad, waarbij jij alleen nog even na zouden moeten denken waarom er een verschil gaat worden gemaakt tussen add en set, zeker als je setBccs loslaat.
Gewijzigd op 05/07/2013 22:34:37 door Erwin H
Het verschil tussen iets setten en adden. Als je iets set worden bestaande waarden overschreven, als je iets add wordt er iets toegevoegd. Ik wil dus niet iets toevoegen maar iets setten. In het ene geval wil ik dus 1 waarde setten en in het andere geval wil ik meerdere waardes setten. Mijn vraag is of ik dat via 1 of 2 functies moet doen. Oh, en het hoeft dus niet per se op bcc te slaan, maar is van toepassing op alles waarvan je er 1 of meer wilt setten/getten/deleten enz.
Stel ik wil configuratiewaardes ophalen. In het ene geval heb ik 1 waarde nodig en in het andere geval heb ik meerdere waardes nodig. Maak je dan 2 functies:
getValue($id) en getValues($ids)
of maak je 1 functie waaraan je een string of array kunt meegeven?
Gewijzigd op 05/07/2013 22:42:10 door Ozzie PHP
Getters moet je daarin heel anders zien overigens. Andere discussie.
Mag een slotje op.
Je weet toch dat we niet aan slotjes doen op phphulp ;-) Er komt heus geen slotje op alleen maar omdat je je vraag niet kunt formuleren!
Ik kan m'n vraag best formuleren, alleen niet iedereen schijnt het te (kunnen) begrijpen.
Het feit dat ozzie een vraag stelt met een voorbeeld die ons waarschijnlijk laat afwijken van de werkelijk is niks meer dan een simpel foutje. Door dat foutje heb ik waarschijnlijk wel verkeerde antwoorden gegeven, maar laat het niet zo zijn dat we hier een nutteloos gevechts topic van gaan maken alleen omdat ik iedereen in de verkeerde richting heb gestuurd.
Dat gezegd hebbende, ozzie bedoel je bijna het instellen van settings? Bijv.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
new FormField('text', array(
'label' => 'Naam',
'error_bubbling' => false,
// ...
));
?>
new FormField('text', array(
'label' => 'Naam',
'error_bubbling' => false,
// ...
));
?>
In dat geval zou ik een method setSettings maken die een array van opties krijgt.
Gewijzigd op 06/07/2013 00:47:32 door Wouter J