Setters, doen of niet?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter J

Wouter J

24/07/2012 19:47:57
Quote Anchor link
Als ik parameters instel in een klasse doe ik altijd gewoon:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class Route
{
   protected $pattern;
   // ...

   public function __construct($pattern)
   {

       $this->pattern = (string) $pattern;
       // ...
   }
}

?>


Alleen nu kwam ik in de Symfony source dit tegen:
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
<?php
class Route
{
   protected $pattern;
   // ...

   public function __construct($pattern)
   {

       $this->setPattern($pattern);
       // ...
   }

   public function setPattern($pattern)
   {

       $this->pattern = (string) $pattern;
   }
}

?>


Eigenlijk vind ik dit wel mooi. Je verdeelt zo de verantwoordelijkheden, de constructor moet niet van de properties beslissen hoe ze worden opgeslagen, daar hebben ze een eigen setter voor. En als je nou iets daarin wilt aanpassen, zoals dat een username altijd met een hoofdletter begint, hoef je alleen de setter aan te passen.

Maar aan de andere kant bezorgt dit je ook weer wat extra werk en een extra method call. Wat vinden jullie mooier/wat gebruiken jullie altijd?
 
PHP hulp

PHP hulp

22/12/2024 06:18:47
 
- Raoul -

- Raoul -

24/07/2012 19:51:08
Quote Anchor link
Getters en setters gebruik ik altijd ;-)
Zeer handig en gewoon mooier. En er is niks mis met wat extra werk :-P
 
Pim -

Pim -

24/07/2012 20:33:41
Quote Anchor link
Dat is inderdaad nuttig als je bewerkingen doet in de setter. Als dat niet het geval is, is deze overhead onnodig. Als je dan de klasse aanpast en logica aan de setter toevoegt, kan je je constructor altijd nog aanpassen.
 
Jan Koehoorn

Jan Koehoorn

24/07/2012 21:25:49
Quote Anchor link
Er wordt ook vaak gebruik gemaakt van de magic methods __get en __set. Dan hoef je namelijk niet voor elke membervariabele een aparte setter en getter te schrijven. Opzetje:
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
<?php
class myClass {
    public $data = array ();

    public function  __get ($key) {  
        if (array_key_exists ($key, $this->data)) {  
            return $this->data[ $key ];  
        }
  
        return null;  
    }

    public function __set ($key, $value) {
        $this->data[ $key ] = $value;
    }
}

?>

(Code niet gecheckt)
Gewijzigd op 24/07/2012 21:27:46 door Jan Koehoorn
 
Wouter J

Wouter J

24/07/2012 23:05:50
Quote Anchor link
Jan, ik weet van het bestaan van deze magic methods, alleen dat is niet een toevoeging op mijn vraag. Met zo'n getter en setter voeg je namelijk niks extra's toe, je kan niet per property een eigen afhandeling krijgen.
Deze getters/setters zijn alleen bedoelt om speciale set/get gevallen te kunnen maken, zoals opties opslaan in een array. Hetzelfde geldt voor al die andere magic methods, je voegt ook niet dit toe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
class Foo
{
    public function __sleep()
    {

        return $this;
    }
}

?>


Pim, dat ben ik ook met je eens. Alleen wat noem je logica. Stel ik verwacht een array met opties, wat doe je dan:
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
20
21
22
23
24
25
26
27
<?php
// afhandelen in constructor
class Foo
{
    protected $options = array();

    public function __construct(array $options = array())
    {

        $this->options = $options;
    }
}

// afhandelen in setter
class Foo
{
    protected $options = array();

    public function __construct($options = array())
    {

        $this->setOptions($options);
    }


    public function setOption(array $options)
    {

        $this->options = $options;
    }
}

?>

En hetzelfde geldt voor het typecasten wat ik altijd gebruik of het checken of de parameter wel van de juiste interface is.
 
Write Down

Write Down

24/07/2012 23:20:46
Quote Anchor link
Persoonlijk, gebruik ik altijd aparte setters en getters. De reden voor mij is dat elke methode een andere verantwoordelijkheid heeft. Zeker in PHP vind ik dit vrij logisch om te doen.

In Java doe ik het niet altijd (meestal wel), maar daar is voor mij de reden dat je zelf de naam van de constructor kan kiezen.
 
Erwin H

Erwin H

25/07/2012 08:52:56
Quote Anchor link
Wouter J op 24/07/2012 19:47:57:
Eigenlijk vind ik dit wel mooi. Je verdeelt zo de verantwoordelijkheden, de constructor moet niet van de properties beslissen hoe ze worden opgeslagen, daar hebben ze een eigen setter voor. En als je nou iets daarin wilt aanpassen, zoals dat een username altijd met een hoofdletter begint, hoef je alleen de setter aan te passen.

Maar aan de andere kant bezorgt dit je ook weer wat extra werk en een extra method call. Wat vinden jullie mooier/wat gebruiken jullie altijd?

Dat is dus in essentie waarom ik properties altijd als private definieer en dus ook de kind classes een propertie via de setter laat werken ;-)

En wat extra werk betreft, volgens mij valt dat wel mee. Alleen als je normaal gesproken geen setter zou hebben voor de betreffende property is het meer werk. In alle andere gevallen niet.
Gewijzigd op 25/07/2012 08:55:28 door Erwin H
 
Kris Peeters

Kris Peeters

25/07/2012 12:07:05
Quote Anchor link
Ik ben geneigd het een goed idee te vinden om eigenschappen aan te spreken via de setter (en eventueel getter).
 
Ozzie PHP

Ozzie PHP

25/07/2012 12:17:04
Quote Anchor link
Als je de set functie hergebruikt vind ik het logisch om een aparte functie te schrijven. Gaat het om een eenmalige toewijzing (eventueel met een simpele(!) bewerking, bijv. begin hoofdletter) dan zou ik het gewoon in de construct doen. Waarom zou je immers voor de toewijzing van een waarde die je via de construct meegeeft en toch niet meer wijzigt een aparte functie schrijven? Dat is feitelijk gewoon het verplaatsen van je code en lijkt me overkill. Ja, het ziet er leuk uit, maar het voegt (mits het om een simpele toewijzing gaat) niks toe.

Toevoeging op 25/07/2012 12:19:56:

Kris Peeters op 25/07/2012 12:07:05:
Ik ben geneigd het een goed idee te vinden om eigenschappen aan te spreken via de setter (en eventueel getter).

Een eigenschap aanspreken via de setter... jaajaa... Da's erg bijzonder :)
 
Erwin H

Erwin H

25/07/2012 12:44:13
Quote Anchor link
Je spreekt hem aan via de setter en leest hem uit via de getter. Dat is de normale gang van zaken inderdaad....
 
Niek Ha

Niek Ha

25/07/2012 13:18:17
Quote Anchor link
Getters en setters, maak er een gewoonte van. Het gaat veel tijd besparen omdat je op 1 plek simpel iets aan kan passen wanneer dit nodig is. Ook zorg je hiervoor dat je je velden op private kan zetten en je methoden public. Zo heb je een overzichtelijke controle van wat een andere klasse allemaal kan en mag.
 
Wouter J

Wouter J

25/07/2012 13:29:17
Quote Anchor link
Ah, het is duidelijk. Ik heb het altijd verkeerd gedaan en je hoort het met setters en getters te doen.
 
Niek s

niek s

25/07/2012 14:37:08
Quote Anchor link
Jan Koehoorn op 24/07/2012 21:25:49:
Er wordt ook vaak gebruik gemaakt van de magic methods __get en __set. Dan hoef je namelijk niet voor elke membervariabele een aparte setter en getter te schrijven. Opzetje:
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
<?php
class myClass {
    public $data = array ();

    public function  __get ($key) {  
        if (array_key_exists ($key, $this->data)) {  
            return $this->data[ $key ];  
        }
  
        return null;  
    }

    public function __set ($key, $value) {
        $this->data[ $key ] = $value;
    }
}

?>

(Code niet gecheckt)


Dit gebruik ik zelf ook vaak, erg fijn!
Echter niet in high-performance applicaties. Dit is namelijk zo traag als dikke stront door een trechter.. omhoog :')
Dit geldt voor veel 'magic methods' overigens.

Note ook dat dit ook niet kan voor static properties.
 
Wouter J

Wouter J

25/07/2012 15:26:19
Quote Anchor link
Quote:
Note ook dat dit ook niet kan voor static properties.

En ook niet voor public properties.

En wat is er eigenlijk zo fijn aan? Het voegt naar mijn mening niks meer toe dan de normale omstandigheden?
 
Niek s

niek s

25/07/2012 16:57:03
Quote Anchor link
Wouter J op 25/07/2012 15:26:19:
En ook niet voor public properties.


Tuurlijk wel, waarom zou dat niet kunnen?
 
Erwin H

Erwin H

25/07/2012 17:05:29
Quote Anchor link
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
<?php
class Voorbeeld{
  public test;

  //zet de property test naar 'test voorbeeld' wat er ook gegeven mogen zijn
  public function __set( $name ){
    $this->test = 'test voorbeeld';
  }
}


$obj = new Voorbeeld();
$obj->test = 'een andere string';
echo $obj->test;
?>

Wat denk je dat er geprint wordt?
Daarom kan je dus geen magic setter gebruiken voor een public property.
 
Kris Peeters

Kris Peeters

25/07/2012 17:22:15
Quote Anchor link
nu ja ...

Als je een eigenschap als public zet, weet je dat ze kan overschreven worden.
Als je niet wil dat dit kan, moet je ze maar op private/protected zetten.

Of het nu kan of niet (die magic set en get), lijkt me meer een discussie die niet echt ter zake is.
Gewijzigd op 25/07/2012 17:30:25 door Kris Peeters
 
Ozzie PHP

Ozzie PHP

25/07/2012 18:37:17
Quote Anchor link
Erwin H op 25/07/2012 12:44:13:
Je spreekt hem aan via de setter en leest hem uit via de getter. Dat is de normale gang van zaken inderdaad....

Nee, je stelt een property in via een setter en je spreekt deze property aan (je leest de waarde van die property uit) via een getter.
 
Erwin H

Erwin H

25/07/2012 20:37:21
Quote Anchor link
Volkomen doelloze discussie dit, maar zoals je weet ben ik daar altijd wel voor te porren.

Definitie aanspreken:
Quote:
1) beginnen te praten tegen (iemand)
2) zo zijn dat iemand het mooi of aangenaam vindt
3) (een reserve) gaan gebruiken

Als je de eerste als uitgangspunt neemt dan kan je het uitleggen als iets geven, iets 'setten' dus.
Als je de derde neemt kan je het lezen als iets opnemen, als iets 'getten'.


Volgens mij spreek je een property dus aan via de setters EN de getters :-)
 
Ozzie PHP

Ozzie PHP

25/07/2012 23:10:13
Quote Anchor link
euh... juist ja ;-)
het wordt nu inderdaad vrij zinloos :-D
 



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.