setten in __construct of in aparte functie
Ik vraag me af of het iets uit maakt of je properties via een functie set of direct in de constructor.
Zelf set ik ze vaak direct in de constructor. Maar ik zie dat anderen het ook via een aparte set functie doen.
Ik doe het vaak zo:
Ik zie dat anderen het ook wel eens zo doen:
Code (php)
Is het een beter dan het ander, of maakt het niets uit?
Gewijzigd op 05/01/2013 00:25:33 door Ozzie PHP
Allereerst: Het maakt geen verschil en is gewoon wat jou style is, ik ga hier dus niet verder over in discussie en vertel alleen maar wat mij er toe gezet heeft om van voorbeeld 1 over te stappen naar voorbeeld 2.
Eerst gebruik ik gewoon altijd de properties binnen mijn klassen en gebruikte ik altijd protected. Ik was van mening dat ik deze properties gewoon mocht gebruiken en de getters en setters voor buiten de klasse waren.
Toen kwam ik ooit wat meningen tegen over aparte setters en private properties, van oa Erwin en Fabien Potencier. Daarom startte ik een topic: http://www.phphulp.nl/php/forum/topic/setters-doen-of-niet/85843/ (waarin jij ook reageerde trouwens...)
Sindsdien ben ik setters en getters en private properties gaan gebruiken en het beleid daarvan maak ik steeds strenger. Tegenwoordig geef ik maar 2 methods toegang tot de property en dat is de setter en de getter, de andere (zelfs een hasser of isser) gebruiken deze getters en setters.
Wat ik nog meer doe is dat ik error handling compleet naar de setter of getter overhevel, bijv:
Code (php)
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
28
29
30
31
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
28
29
30
31
Je ziet dat ik hier meteen ook PHPdoc gebruik om toch duidelijk te krijgen welke types er verwacht worden.
Ik twijfel of ik dit ook zo moet gaan doen. Via constructor is het snel, maar via aparte setters is ook wel weer heel erg duidelijk. Zeker als er nog iets met de input moet gebeuren voordat de property geset wordt. Nadeel is alleen dat het wat meer werk is, en meer regels code... wat in theorie weer vertragend werkt. Pfff, het is wel een dag van de keuzes vandaag zeg :)
Of als ik straks de dbal niet meer ga gebruiken en uit mijn code sloop, dan is het soms onmogelijk om alle children aan te passen, bijv. in een open-source applicatie, en dan behoudt ik gewoon de getter en laat die een dummy dbal klasse teruggeven.
Ja, heb je wel gelijk in. Ik denk dat ik het dan ook maar in ga voeren. Nja, beter nu dan als ik straks 2 maanden verder ben. En dan ga ik ook die request class nog aanpassen met jouw tips. Ja... genoeg te doen... werk aan de winkel!
En DI en Unit Testing gebruiken, je hebt een druk weekend :)
Ja, DI ga ik gebruiken... maar ik moet eerst m'n unbound requests afvangen. Daar heb ik DI nog niet voor nodig... Unit testen... wie weet ooit :) Eerst maar eens aan het programmeren gaan slaan. Zie tegen dit gedeelte wel een beetje op. Container maken, misschien zo'n parameter zak... zal allemaal wel weer een hoop tijd kosten. Maar ja, je wilt wat en dan moet je niet zeuren ook ;-)
Wouter J op 05/01/2013 00:56:38:
Ozzie, het is vooral handig voor uitbreiding. Stel ik besluit het heel anders te gaan aanpakken, dan hoef ik alleen de setter of getter aan te passen.
Of als ik straks de dbal niet meer ga gebruiken en uit mijn code sloop, dan is het soms onmogelijk om alle children aan te passen, bijv. in een open-source applicatie, en dan behoudt ik gewoon de getter en laat die een dummy dbal klasse teruggeven.
Of als ik straks de dbal niet meer ga gebruiken en uit mijn code sloop, dan is het soms onmogelijk om alle children aan te passen, bijv. in een open-source applicatie, en dan behoudt ik gewoon de getter en laat die een dummy dbal klasse teruggeven.
Laatst kwam ik (in mijn eigen code...) nog een reden tegen om altijd via getters en setters te werken. Als je protected geruikt waar het kan en private waar het moet, dan kom je op zeker moment op een punt waarin je simpelweg niet meer weet welke je nu gebruikt in welke class. Ik heb bijvoorbeeld een view factory die in principe in alle view classes beschikbaar is. Alleen door nog oude code te gebruiken sprak ik die in sommige situaties aan als $this->getFactory(), in andere als $this->factory. In het tweede geval dus een protected property inderdaad. Maakt het werk een stuk lastiger, omdat je elke keer weer moet checken hoe het ook weer zat.
Anyway, nog een reden dus om mijn eigen regel echt 100% door te voeren.
Gewijzigd op 05/01/2013 10:56:57 door Erwin H
Thanks Erwin, ik ga het ook maar doen. Genoeg redenen gehoord nu!