[alg/java] singleton pattern link, maar singleton is handig

Pagina: 1
Acties:

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
De singleton design pattern wordt vaak te pas en te onpas gebruikt. Mijn ervaring ermee is dat het in sommige gevallen erg vervelend kan zijn, oa voor het testen. Je hebt een resource in je systeem waar je geen controle over uit kan oefenen (vaak weet je niet eens dat die er is)

De reden dat het singleton design pattern vaak in grote omgevingen wordt gebruik is omdat mensen slecht aan referenties van objecten kunnen komen. Verschillende frameworks worden aan elkaar vast gelijmt, en daarna is het maar de vraag hoe je dan maar aan je referentie komt -> singleton design pattern. Java heeft hier ook oa een handje van bij j2ee en je ziet dan allerlei constructies zoals service locators en allerlei jndi geneuzel. Het gevolg hiervan is dat je volledig afhankelijk begint te worden van de container waar je je applicatie in hangt. Persoonlijk vind ik dit erg vervelend omdat je niets meer onder controle hebt.

Singletons staan op mijn lijstje "gevaarlijke patterns" (dat wil niet zeggen dat ik ze nooit gebruik.. singletons kunnen nuttig zijn).

Maar objecten waar maar 1 van aangemaakt wordt hoeft zeker niet slecht te zijn. Je kunt veel eenvoudiger uitspraken doen over belangrijke objecten als er maar 1 van in je systeem aanwezig is. Stel dat je een of andere DocumentGenerator hebt met een zooi threads in een thread pool, dan weet je precies hoeveel threads bezig zijn om documenten aan te maken.

Services zijn bv ook ideaal om singleton te maken. Services zijn meestal stateless dus je hebt ook weinig te maken met concurrency. Verder is dit ook de ideale plek om je objecten te voorzien van transacties en security. Je weet dus exact wat je in je systeem hebt... je hebt controle... je kunt uitspraken doen over je systeem.

Singletons zijn dus goed.. objecten die het singleton design pattern gebruiken om singleton te worden vind ik persoonlijk minder (zie mijn commentaar hierboven). De vraag is dus hoe je eenvoudig aan je referentie van deze objecten kunt komen.

Op de een of andere manier heeft java met j2ee bv een enorm stuk complexiteit geintroduceerd zonder met goeie praktische oplossingen te komen zodat je op een menselijke manier met die complexiteit om kunt gaan. Ik gebruik nu al een tijdje Spring en het heeft echt mijn ogen geopend. Spring is een Inversion of Control container en het heeft de mogelijkheid om centraal al mijn belangrijke objecten op te bouwen en te voorzien van de goeie argumenten. Daarna is het object met alle goeie objecten gezet, klaar voor gebruik, en heeft dus totaal geen singletons meer nodig om aan referenties van andere objecten te komen. Ze zitten in de constructor!

Ik zie dus het nut dus steeds minder goed in van allerlei zware oplossingen zoals bv jndi en ik ben blij dat ik weer terug kan gaan naar eenvoud.

Ok.. tot zover mijn kritiek over singleton design pattern.. en lof over singleton objecten.. Wat is jullie mening erover? Hoe ga je om met het testen van singletons? Wat zijn jullie nare ervaringen ermee? Hoe gaan jullie om met het steeds-weer-opnieuw-aanmaken-van-objecten? Kunnen jullie uitspraken doen over het systeem?

[ Voor 6% gewijzigd door Alarmnummer op 18-01-2005 16:35 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:06
Een singleton wordt idd soms 'misbruikt' als een soort van 'globale variable'.
Echter, om het daarom direct als 'gevaarlijk' te bestempelen, vind ik wel wat overdreven; ik bedoel: ik zie er het gevaar niet direct van in? Het is natuurlijk design-technisch gezien niet goed om een Singleton te pas en te onpas te gebruiken, maar waar schuilt het gevaar ?

Ik probeer zelf om de verleiding te weerstaan om een singleton te gebruiken voor 'het gemak', maar dat lukt me niet altijd. :P

Echter, zoals je zegt kan een singleton wel nut hebben; zo gebruik ik het idd momenteel om m'n Services te 'refereren' in m'n client applicatie.

Ikzelf heb nog geen 'nare ervaringen' met een singleton pattern tegengekomen (misschien omdat ik ze niet misbruik? :+).

Ik dacht ook eens commentaar te hebben gelezen van de een of de andere, die zei dat voor zijn part het 'Singleton' design pattern beter uit het GoF boek zou verdwijnen; dat vind ik toch ook weer overdreven. Het is een pattern die z'n nut heeft.

https://fgheysels.github.io/


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Singleton pattern is mooi. Alleen bij meeste J2EE applicaties zeer tricky. ClassLoader issues, etc. Ik gebruik het toch wel regelmatig.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:06
Wat bedoel je trouwens met 'hoe test je singletons' ?
imo is er geen speciale manier om een singelton te testen ?

https://fgheysels.github.io/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
whoami schreef op woensdag 19 januari 2005 @ 08:44:
Wat bedoel je trouwens met 'hoe test je singletons' ?
imo is er geen speciale manier om een singelton te testen ?
Het gaat niet zozeer om het testen van Singleton objecten zelf maar van objecten die er gebruik van maken. Maar als het te testen object direct of indirect gebruik maakt van een singleton dan heb je een probleem. Je zit vast aan de implementatie van die singleton, en je kunt er niet zomaar even een mock object op plaatsen.

En ik wil verder niet zeggen dat Singletons een doodzonde zijn, maar met Singletons moet je erg oppassen.

Trouwens jammer dat er nog maar zo weinig replies zijn. Mensen die Singletons fantastisch vinden.. brand mijn verhaal af >:)

[ Voor 31% gewijzigd door Alarmnummer op 19-01-2005 08:53 ]


Verwijderd

Ik denk persoonlijk dat mensen zich een beetje teveel richten op de structuur van een pattern. Een pattern is iets wat je kan helpen om bepaalde zaken aan te pakken, niet iets wat je moet vasthouden in een bepaalde situatie. Op het moment dat je bijv. threads niet meer kunt herleiden, meten of opvragen lijkt het me in zo'n situatie niet bijzonder verstandig om te blijven vasthouden. Waarom pas je dan de code niet aan zodat je je threads kan bijhouden. Het is dan niet meer een 100% implementatie van het pattern, maar dat is ook niet de bedoeling van patterns. Patterns zijn puur bedoeld om je te helpen bij het bereiken van een bepaalde uitwerking.

Wat ik er mee bedoel is dat mensen teveel focussen op het toepassen van een bepaalde structuur van een pattern, maar eigenlijk eens zouden moeten kijken naar het toepassen van een pattern binnen de oplossing.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Ik denk dat het in dit geval wel meevalt. De singleton design pattern is juist een extreem praktisch pattern. Probleem: hoe kom ik aan een referentie naar dat object? Oplossing: maak het een Singleton.

Singletons zijn dus erg praktisch... maar mensen denken niet genoeg na over de gevolgen ervan. Aan singletons (design pattern) kleven een aantal nadelen.

Verwijderd

Alarmnummer schreef op woensdag 19 januari 2005 @ 08:51:
[...]

Het gaat niet zozeer om het testen van Singleton objecten zelf maar van objecten die er gebruik van maken. Maar als het te testen object direct of indirect gebruik maakt van een singleton dan heb je een probleem. Je zit vast aan de implementatie van die singleton, en je kunt er niet zomaar even een mock object op plaatsen.
Daarvoor is het registry pattern. Dat is simpel uitgelegd een kruising tussen factory en singleton.
In tests kun je dan ook een andere static (mock) instance onder de singleton schuiven om te testen. ..

Nu ik een link zoek denk ik dat ik de naam verkeerd onthouden heb. Het kwam erop aan dat je een singleton.getinstance() (default) had en een singleton.getInstance(Interface) ofzo had. Daarmee 'registreerde' je de mock implementatie ipv de default implementatie van de Singleton instance. Ik had het ergens van Martin Fowler gelezen, maar ik herinner me jammer genoeg niet meer waar :S

verder nog iets over singletons (en ook registry, maar niet exact wat ik bedoelde)
http://www.javaworld.com/...425-designpatterns_p.html


[edit]
http://www.martinfowler.com/bliki/StaticSubstitution.html
héhé...ik fantaseer nog niet over zulke dingen, wat een troost ;)

[ Voor 6% gewijzigd door Verwijderd op 19-01-2005 09:52 ]

Pagina: 1