[oop] setFoo en/of setFoos?
Pagina: « vorige 1 2 3 volgende »
Wouter J op 06/07/2013 00:46:43:
Begrijp de aanvallende toon in dit topic niet. Ozzie stelt een vraag, vervolgens kun je er op reageren. Hoor je dat? Je 'kun't reageren. Fijn he, zo'n forum! Niemand ziet wat je leest en niemand verplicht je om ook maar ergens op te reageren.
Wouter, dankjewel voor deze reactie. Ik begrijp ook niet waar die agressieve houding van sommigen ineens vandaan komt. Precies wat jij zegt. Je hoeft niet te reageren. Ik vind het jammer dat sommige personen zo vreemd reageren. Ook personen waarvan je dat niet verwacht. Ik vraag me af of ze in het dagelijks leven ook zo zouden reageren in een face-to-face gesprek. Normen en waarden zijn op het internet soms ver te zoeken.
Maar goed, terugkomend op de vraag. Ik ga weer een poging wagen. Als het niet duidelijk is wat ik bedoel, zeg dan ook wat er niet duidelijk is zodat ik het kan proberen uit te leggen.
Oké, stel we hebben een class waarin data is opgeslagen in een class property $data. $data is dan een array met id/value paren, bijv. ['kleur' => 'rood', 'gewicht' => '35 gram', 'hoogte' => '10 cm'].
Stel ik wil 1 id verwijderen. In mijn class zou ik dan een functie maken:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
public function deleteValue($id) {
// code om id/value paar te verwijderen
}
?>
public function deleteValue($id) {
// code om id/value paar te verwijderen
}
?>
Nu zou het ook zo kunnen zijn dat ik in 1x meerdere id's tegelijk wil verwijderen. Wat ik dan zou doen is zoiets:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
public function deleteValues($ids) {
// code om id/value paren te verwijderen
}
?>
public function deleteValues($ids) {
// code om id/value paren te verwijderen
}
?>
Zoals je ziet is dit bijna dezelfde method. De interne code verschilt wel enigszins, maar het doel van de methods is vrijwel hetzelfde. De ene method heet deleteValue en de andere heet deleteValues. De 1e method verwacht een string als argument en de 2e method verwacht een array als argument.
Nu is mijn vraag of dit de juiste aanpak is. Deze 2 methods lijken heel erg veel op elkaar. Is het dan gerechtvaardigd dat dit 2 afzonderlijke methods zijn, of zou dit eigenlijk in 1 method moeten? En dat je dan kijkt of het argument een string is of een array, en al naar gelang actie onderneemt.
Als je 2 methods gebruikt ben je gerichter bezig, maar het "kost" je wel een extra method. Als je alles via 1 method doet moet je daarentegen weer een extra controle uitvoeren, namelijk of het argument een string of een array is.
Is het zo een beetje duidelijk wat ik bedoel?
Gewijzigd op 06/07/2013 01:06:32 door Ozzie PHP
Was dit wat je ongeveer bedoelde?
Ja dit is wat ik bedoel.
Ik heb nu in mijn mail class 2 methods om een Bcc adres toe te voegen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
setBcc($name, $address);
// deze voegt 1 persoon toe:
// $name = 'Jens', $address = '[email protected]'
setBccs($addresses);
// deze voegt meerdere personen toe:
// $addresses = [['name' => 'jens', 'address' => '[email protected]'], ['name' => 'ozzie', 'address' => '[email protected]']]
?>
setBcc($name, $address);
// deze voegt 1 persoon toe:
// $name = 'Jens', $address = '[email protected]'
setBccs($addresses);
// deze voegt meerdere personen toe:
// $addresses = [['name' => 'jens', 'address' => '[email protected]'], ['name' => 'ozzie', 'address' => '[email protected]']]
?>
Jij zou dan alleen setBccs gebruiken, en als je 1 persoon wilt toevoegen dan gewoon 1 array paar in de hoofdarray meegeven?
ClassLoader van Symfony (addPrefixes() & addPrefix()).
Dus dan is er eigenlijk geen verschil meer en is het dus gewoon gemakkelijker voor jou omdat je dan niet meer een foreach() moet gebruiken... want dat doet de functie dan al.
Je hebt dan dubbele functies. Maar soms moet je de addBcc() bijvoorbeeld nog altijd controleren (verifiëren i.v.m e-mailadres). Dus dan krijg je zoiets zoals de Dus dan is er eigenlijk geen verschil meer en is het dus gewoon gemakkelijker voor jou omdat je dan niet meer een foreach() moet gebruiken... want dat doet de functie dan al.
Code (php)
Gewijzigd op 06/07/2013 18:56:40 door MayDay PHP
De code van de functie maakt me niet zoveel uit. Het gaat mij vooral om het principe. In jouw voorbeeld heb je dus 2 addBcc(s) functies. Mijn vraag is of dat gebruikelijk is. Óf dat het gebruikelijker is om slechts 1 functie te hebben. Zie de opmerking van Jens hierboven. Dat is dus de vraag. Nu gaat het toevallig om bcc mail-adressen, maar het kan om vanalles gaan. Stel je hebt een product class. Is het dan gebruikelijk om zowel een addProperty en een addProperties method te hebben?
Alhoewel het kan op beide manieren. Je moet voor jezelf uitmaken welke je liever hebt aangezien je zelf met je eigen framework gaat werken en niet iemand anders.
Maar Jens zegt toch dat hij juist 1 methode zou gebruiken?
Stel dat je een e-mail class hebt, zou jij dan deze methodes gebruiken:
setBcc
setBccs
setCc
setCcs
setTo
setTos
of alleen deze?
setBcc
setCc
setTo
Je kan in Java bijvoorbeeld niet zeggen ik maak 1 methode die een array krijgt OF een waarde. Dit omdat Java strikt is en vooraf wil weten wat hij ontvangen gaat. bij php kan je gewoon een parameter meegeven en dan in de methode bekijken wat het is en er iets mee doen. In java zou je dan krijgen
Code (php)
zoals je in het voorbeeldje hierboven ziet kan je bij de eerste methode een array van strings meegeven en bij de 2e alleen een enkele.
Ik denk dat ook dit de reden is dat iedereen je aanraad om een set functie te hebben en een add functie ( althans dat zou mijn advies zijn omdat ik het zo bekijk en ik neem aan dat de rest het ook zo bedoelt in deze richting )
Zoals je zelf wel weet is PHP niet zo strikt en kan je gewoon zeggen
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
public function setAddress($addressen) {
// hier bekijken of het een array is ja/nee etc..
}
?>
public function setAddress($addressen) {
// hier bekijken of het een array is ja/nee etc..
}
?>
Dus wil je het doen zoals in echte OO talen zou ik je aanraden om het eerste te doen. Wens je gebruik te maken van de lazy php voordelen dan kies je voor de tweede. En ook hierbij is mijn advies.. programmeer je in andere talen ook wees dan consequent en gebruik gewoon de eerste manier maar ik denk dat jij niet verder zal kijken dan php en dus kan je zelf besluiten welke voor jou handig is.
"zoals je in het voorbeeldje hierboven ziet kan je bij de eerste methode een array van strings meegeven en bij de 2e alleen een enkele."
Ik denk dat je dit precies andersom bedoelt? Dus dat setAdressen de array zou moeten ontvangen?
Maar jouw uitleg is dus precies wat ik bedoel, en wat dus ook mijn vraag is. Ik wist niet hoe dat in andere talen werkte, dus bedankt voor die uitleg.
Wel ben ik bijzonder benieuwd wat in PHP meer gebruikelijk is. Ik snap overigens de vergelijking met add en set, maar mijns insziens zijn set en add 2 verschillende dingen, dus daarom wil ik dat even buiten beschouwing laten.
Ik kom weer even terug op een eerder voorbeeldje (zie eerder hierboven). Stel we hebben een data class waarin we values opslaan. Soms wil ik 1 value kunnen verwijderen en soms wil ik meerdere values kunnen verwijderen. Wat zou jij dan doen... wat is het meest gebruikelijk in PHP? Is dat 2 functies gebruiken? Een functie deleteValue en een functie deleteValues. De 1e functie ontvangt een string als argument en de 2e een array. Als ik het op deze manier zou doen, dan zou ik een hele hoop functies "dubbel" moeten uitvoeren. Denk aan:
deleteValue
deleteValues
getValue
getValues
addValue
addValues
setValue
setValues
enz.
Ik krijg dus een hoop "extra" functies dan wanneer ik overal één functie voor zou gebruiken:
deleteValues
getValues
addValues
setValues
enz.
Zoals je ziet heb ik nu een stuk minder funties, alleen zal ik wel in iedere functie moeten controleren of het argument een string is of een array.
Al die "dubbele" functies nemen meer ruimte (en dus geheugen) in beslag. De enkele functies moeten echter weer een extra controle uitvoeren. Dus wat is dan wijsheid vraag ik me af?
Gewijzigd op 06/07/2013 23:03:29 door Ozzie PHP
In PHP ligt het er aan wat je wilt doen. Meerdere values verwijderen zou ik 1 method hebben die gewoon vaak wordt aangeroepen, values toevoegen hetzelfde. Het instellen van values zou ik weer of een string of een array toestaan.
Overigens hoeft je nooit iets te controleren, alleen typecasten naar een array is al genoeg.
Toevoeging op 06/07/2013 23:40:42:
En @Reshad: ja in Java zou ik gewoon overriden, maar in PHP gaat dat niet, dus ik zou consquent zijn hier interpreteren als 1 methode(naam) gebruiken voor 1 of meerdere items. Dat doeje in principe in Java ook, 1methodenaam (wel twee verschillendd methodes), snap je wat ik bedoel?
@Jens ik snap het precies :) vaak gebeurt dit overigens met de constructor overigens in Java waarbij je dus een constructor krijgt zonder parameter en een met.
Ja klopt Reshad, en dat vind ik enorm handig, maar dat is puur gewoonte hoor ;)
Wouter J op 06/07/2013 23:14:01:
In PHP ligt het er aan wat je wilt doen. Meerdere values verwijderen zou ik 1 method hebben die gewoon vaak wordt aangeroepen, values toevoegen hetzelfde. Het instellen van values zou ik weer of een string of een array toestaan.
Hey Wouter, waarom zou je bij deleten kiezen voor 1 method die vaker wordt aangeroepen in plaats van een array meegeven? Is dat persoonlijke voorkeur of heb je er een speciale reden voor? Ik ben overigens niet van het meerdere keren dezelfde functie aanroepen. En jij kunt vast wel raden waarom ;) Inderdaad vanwege de snelheid. Ik heb dat eens gebenchmarkt en het meerdere keren aanroepen van een class method levert significant vertraging op ten opzichte van slechts 1x aanroepen (met een array) van die method.
Wouter J op 06/07/2013 23:14:01:
Overigens hoeft je nooit iets te controleren, alleen typecasten naar een array is al genoeg.
Dat hangt er een beetje vanaf hoe je het betreffende argument mee wilt geven toch? Stel je wilt meerdere values verwijderen dan wordt er een array met id's verwacht, maar als je er slechts 1 zou willen verwijderen zou je een string met de id mee kunnen geven. Bedoel je dan dat je die string typecast naar een array? Of bedoel je iets anders?
-Jens - op 06/07/2013 23:31:04:
...als ik voor een framework programmeer, zal ik altijd de manier met de array, ookal is er maar 1item, kiezen, net omdat het voor andere programmeurs in dat project hetzelfde zou zijn. Want stel dat het systeem zelf moet bepalen hoeveel bccs er toegevoegd moeten worden, ga je dan het systeem zelf laten beslissen welke type parameter of welke methode? Dan lijkt het mij veel handiger gewoon een array op te laten vullen...
Doe je dit alleen bij een method waarbij meerdere waardes kunnen worden geset, of ook bij methods waarbij slechts 1 waarde kan worden geset? Stel je hebt bijv. een setUsername method? Moet het argument bij jou dan ook een array zijn?
Ik snap je vraag helemaal. Daarom toonde ik ook gewoon een voorbeeld. Zelf doe ik dus in jouw voorbeeld setBccs() en setBcc(). Want het is toch te zot om elke keer zelf een foreach te schrijven en als je later iets wilt veranderen is het ook veel gemakkelijker! Maar PHP is zo vriendelijk om meerdere methodes te geven.
@Jens
Waarom zou je dat willen doen? Als je een string wilt wil je een string en als je een array wilt een array. Als je een goede editor hebt komen de parameters zelfs tevoorschijn met de types.
-----
@Ozzie
Als je een remove() functie (of een methode die erop lijkt) dan kun je wel een functie gebruik en typecasten.
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
Gewijzigd op 07/07/2013 00:08:58 door MayDay PHP
MayDay PHP op 06/07/2013 23:59:18:
@Ozzie
Ik snap je vraag helemaal. Daarom toonde ik ook gewoon een voorbeeld. Zelf doe ik dus in jouw voorbeeld setBccs() en setBcc(). Want het is toch te zot om elke keer zelf een foreach te schrijven en als je later iets wilt veranderen is het ook veel gemakkelijker! Maar PHP is zo vriendelijk om meerdere methodes te geven.
Ik snap je vraag helemaal. Daarom toonde ik ook gewoon een voorbeeld. Zelf doe ik dus in jouw voorbeeld setBccs() en setBcc(). Want het is toch te zot om elke keer zelf een foreach te schrijven en als je later iets wilt veranderen is het ook veel gemakkelijker! Maar PHP is zo vriendelijk om meerdere methodes te geven.
Nee, je moet niet zelf telkens een foreach schrijven. Maar ook met slechts 1 functie kun je die foreach loops automatisch laten plaatsvinden. Daar heb je niet per se 2 functies voor nodig. Dus jouw beredenering snap ik niet helemaal... :-(
@MayDay PHP dat klopt, maar nu heb je het wel over iets anders hé. Ik bedoel dat je binnen 1 klasse twee methoden met dezelfde naam hebt, maar met verschillende type parameters. Implement is iets totaal anders hé
Toevoeging op 07/07/2013 00:09:58:
Ozzie, nu snap ik waarom je vraagt of ik altijd een array zou gebruiken. Ik bedoelde dat wanneer de kans er bestaat dat je meer waardes gaat setten, ik altijd een array gebruik en wanneer je zeker weet dat je in elke mogelijke situatie maar 1 waarde gaat setten met een bepaalde methode, geen array gebruikt
Toevoeging op 07/07/2013 00:09:59:
Ozzie, nu snap ik waarom je vraagt of ik altijd een array zou gebruiken. Ik bedoelde dat wanneer de kans er bestaat dat je meer waardes gaat setten, ik altijd een array gebruik en wanneer je zeker weet dat je in elke mogelijke situatie maar 1 waarde gaat setten met een bepaalde methode, geen array gebruikt
Ik had je zinnen verkeerd gelezen. Had het net te laat gezien.
@Ozzie
Met setBccs() wordt er automatisch door alle opgegeven e-mailadressen gelopen omdat in mijn voorbeeld hierboven een Emailaddress object gegeven moet worden aan setBcc(). Je zou dat ook met een functie kunnen doen en dan typecasten. Maar ik persoonlijk vind het gemakkelijker om te weten als ik setBccs() gebruik ik een array moet toevoegen en anders een Emailaddress object.
Zie ook de Symfony Class Loader die ik hierboven heb geplaatst (link). Het is dat wat ik wil bedoelen, hoe ik het zou doen. Typecasten is natuurlijk prima en als een class het zo doet ga ik het niet perse veranderen...
Gewijzigd op 07/07/2013 00:15:00 door MayDay PHP
@MayDay no prob ;)
@MayDay: thanks voor je typecast codevoorbeeld! Ik gebruik geen emailadres object dus bij mij zou dan alleen setBccs van toepassing zijn.