Ola,

Is het volgens jullie wel of niet een goed idee om methods te maken die een "dubbele" functie kunnen uitvoeren? Of is dit een kwestie van persoonlijke smaak?

Bijvoorbeeld, stel we slaan in een class de properties van een product op. Via $this->get($id) kunnen we een property ophalen. Stel nu dat ik alle properties tegelijk wil ophalen, dan zou ik dit kunnen doen:

<?php
$this->getAll();
?>
Maar ik zou ook dit kunnen doen:

<?php
$this->get();
?>
Merk op dat ik geen ID meegeef. Door geen specifieke ID mee te geven, krijg ik alle IDs terug. Is dit wel of niet een goed idee?

Hetzelfde geldt voor bijvoorbeeld een delete method:

<?php
$this->delete('foo'); // verwijdert foo
$this->delete(); // verwijdert alles
?>
Ik ben benieuwd wat jullie vinden.
In het voorbeeld van delete en deleteAll hoef je niks te kopiëren/plakken dus dat argument gaat in dit geval niet op. Het zouden dus goed 2 functies kunnen zijn.

<?php

public function delete($id) {
unset($this->array[$id]);
}

public function deleteAll() {
unset($this->array);
}

?>
De tegenhanger met 1 functie zou dan zoiets zijn:

<?php

public function delete($id = null) {
if (is_null($id)) {
unset($this->array);
} else {
unset($this->array[$id]);
}

?>
Maar wat is nu de beste oplossing? Zeg je, het gaat in beide gevallen om het verwijderen van data, dus we gebruiken 1 functie (het 2e voorbeeld). Of zeg je, nee het gaat hier weliswaar om het verwijderen van data, maar er zit een verschil tussen het verwijderen van 1 element of in 1x alle data en daarom gebruik je 2 functies (voorbeeld 1). Hoe weet je nu wat de juiste (of betere) manier is? Allebei de manieren zullen werken, maar in 1 van beide manieren handiger/praktischer in gebruik?
Hangt ervan af, zoals vaker. Net verwijderde delete() nog alle bestanden, nu slechts een array.
Ozzie, dit is geheel persoonlijk. Geen van beide is beter, de één kan slechts alleen de voorkeur krijgen van een persoon.

Bijv. jQuery werkt heel erg veel met andere functionaliteiten in dezelfde functie doormiddel van argumenten. Bijv. $('#a').attr('id') verkrijgt de waarde van het id attribuut terwilj $('#a').attr('id', 'f') het attribuut id een waarde meegeeft.

@Ward:

Het is even een code voorbeeldje om te laten zien dat ik geen dubbele code gebruik en het volgens jouw theorie dus 2 functies mogen zijn. Het kan gaan om een array of om bestanden, maar maakt dat iets uit? Het gaat vooral om de gedachte die erachter zit. Moet je alles wat maar enigszins met het verwijderproces te maken heeft in 1 functie stoppen, of verspreid je dit over meerdere functies.

@Wouter:

Oké, thanks. Er is dus geen goed of fout. Wat vind jij zelf handiger? Eén delete functie die zowel één ID (array-key, bestand, database-row of wat dan ook) kan verwijderen als alle IDs (op het moment dat je geen ID meegeeft). Of vind jij het persoonlijk beter om 2 functies te gebruiken, een delete() en deleteAll()?
2 functies en dan, mocht je het echt nodig vinden, 1 functie die ze combineert. Bijv:
<?php

class User
{
private $name;

public function getName()
{
return $this->name;
}

public function setName($this->name);

public function name($name = null)
{
if (null === $name) {
return $this->getName();
}

return $this->setName($name);
}
}
Grappige constructie, ik denk dat ik het dan maar bij 2 functies ga houden.

[offtopic]
Ik zie dat jij vergelijkt met null via null === $name. Waarom gebruik je niet de is_null() functie?

<?php
if (is_null($name)) {
// ...
}
[/offtopic]
Ozzie PHP op 24/11/2013 16:43:16

Oké, thanks. Er is dus geen goed of fout. Wat vind jij zelf handiger? Eén delete functie die zowel één ID (array-key, bestand, database-row of wat dan ook) kan verwijderen als alle IDs (op het moment dat je geen ID meegeeft). Of vind jij het persoonlijk beter om 2 functies te gebruiken, een delete() en deleteAll()?

Ik stem voor twee methods voor zulke use cases.

Getters & setters wil ik nog wel eens combineren:
<?php

public function hash($hash = null)
{
switch(func_num_args())
{
case 0:
return $this->hash;
default:
$this->hash = (string) $hash;
return $this;
}
}

?>


k zie dat jij vergelijkt met null via null === $name. Waarom gebruik je niet de is_null() functie?

Eerste comment op http://us1.php.net/is_null geeft aan dat het veel sneller is met het zelfde resultaat.
Ah oké thanks. Ik zal straks eens even benchmarken dan!

Reageren