Vraag Wat is er zo slecht aan singletons? [Gesloten]


De singleton patroon is een volledig volgestort lid van de GOF's patronen boek, maar het lijkt de laatste tijd nogal verweesd door de ontwikkelaarswereld. Ik gebruik nog steeds vrij veel singletons, vooral voor fabriekslessen, en terwijl je een beetje voorzichtig moet zijn met multithreading-problemen (zoals elke klas eigenlijk), zie ik niet in waarom ze zo afschuwelijk zijn.

Stack Overflow lijkt vooral te veronderstellen dat iedereen het erover eens is dat Singletons slecht zijn. Waarom?

Ondersteun uw antwoorden met "feiten, referenties of specifieke expertise"


1737


oorsprong


antwoorden:


Paraphrased from Brian Button:

  1. Ze worden over het algemeen als een wereldwijd exemplaar gebruikt, waarom is dat zo slecht? Omdat u de afhankelijkheden van uw toepassing in uw code verbergt, in plaats van ze via de interfaces bloot te leggen. Iets globaal maken om te voorkomen dat het doorgegeven wordt is een code geur.

  2. Ze schenden de principe van enkele verantwoordelijkheid: op grond van het feit dat ze hun eigen creatie en levenscyclus beheersen.

  3. Ze zorgen er inherent voor dat de code strak staat gepaard. Dit maakt het faken van hen onder de test nogal moeilijk in veel gevallen.

  4. Ze dragen status rond voor de levensduur van de applicatie. Nog een hit om te testen, omdat je uiteindelijk een situatie kunt krijgen waar tests moeten worden besteld, wat een groot nee is voor unit tests. Waarom? Omdat elke eenheidstest onafhankelijk van de andere moet zijn.


1148



Singletons lossen één (en slechts één) probleem op.

Middelenconventie.

Als je wat middelen hebt dat

(1) kan slechts één instantie hebben, en

(2) moet je die ene instantie beheren,

je hebt een nodig eenling.

Er zijn niet veel voorbeelden. Een logbestand is het grootste. U wilt niet zomaar een enkel logbestand verlaten. U wilt het op de juiste manier doorspoelen, synchroniseren en sluiten. Dit is een voorbeeld van een enkele gedeelde bron die moet worden beheerd.

Het is zeldzaam dat je een singleton nodig hebt. De reden dat ze slecht zijn, is dat ze zich een a voelen globaal en ze zijn een volledig betaald lid van de GoF Ontwerp patronen boek.

Als je denkt dat je een globale oplossing nodig hebt, maak je waarschijnlijk een vreselijke ontwerpfout.


399



Sommige coderende snobs kijken op hen neer als slechts een verheerlijkte mondiale. Op dezelfde manier dat veel mensen de ga naar verklaring er zijn anderen die een hekel hebben aan het idee om ooit een globaal. Ik heb gezien dat verschillende ontwikkelaars buitengewoon veel moeite hebben gedaan om a te vermijden globaal omdat ze overwogen er een te gebruiken als een erkenning van mislukking. Raar maar waar.

In de praktijk het eenling patroon is slechts een programmeertechniek die een nuttig onderdeel is van uw toolkit van concepten. Van tijd tot tijd vindt u het misschien de ideale oplossing en dus gebruik het. Maar gebruik het gewoon zodat u kunt opscheppen over het gebruik van een ontwerp patroon is net zo stom als het weigeren om het ooit te gebruiken omdat het gewoon een is globaal.


306



Misko Hevery, van Google, heeft een aantal interessante artikelen over precies dit onderwerp ...

Singletons zijn Pathological Liars heeft een voorbeeld van een eenheidstest die illustreert hoe singletons het moeilijk kunnen maken om afhankelijkheidsketens te achterhalen en een toepassing te starten of te testen. Het is een vrij extreem voorbeeld van misbruik, maar het punt dat hij maakt is nog steeds geldig:

Singletons zijn niets meer dan mondiale staat. Globale status zorgt ervoor dat uw objecten in het geheim dingen kunnen pakken die niet zijn gedeclareerd in hun API's, en dat Singletons uw API's tot pathologische leugenaars maken.

Waar zijn alle Singletons verdwenen maakt duidelijk dat afhankelijkheidsinjectie het gemakkelijk heeft gemaakt instances aan constructeurs te krijgen die ze nodig hebben, wat de onderliggende behoefte achter de slechte, mondiale singletons die in het eerste artikel wordt ontkracht, verlicht.


200



Ik denk dat de verwarring wordt veroorzaakt door het feit dat mensen de echte toepassing van het Singleton-patroon niet kennen. Ik kan dit niet genoeg benadrukken. Singleton is niet een patroon om globals te verpakken. Singleton-patroon moet alleen worden gebruikt om dat te garanderen één en slechts één instantie van een bepaalde klasse bestaat tijdens runtime.

Mensen denken dat Singleton slecht is, omdat ze het voor de hele wereld gebruiken. Het is vanwege deze verwarring dat er op Singleton neergekeken wordt. Alsjeblieft, verwar geen singletons en globals. Als het wordt gebruikt voor het doel waarvoor het was bedoeld, krijgt u extreme voordelen van het Singleton-patroon.


103



Een nogal slechte zaak van singletons is dat je ze niet gemakkelijk kunt uitbreiden. Je moet eigenlijk een soort van bouwen decorateur patroon of zoiets als je hun gedrag wilt veranderen. En als je op een dag meerdere manieren wilt hebben om dat ene ding te doen, kan het nogal pijnlijk zijn om te veranderen, afhankelijk van hoe je je code hebt ingedeeld.

Een ding om op te merken, als je singletons gebruikt, probeer ze dan door te geven aan degene die ze nodig heeft in plaats van ze rechtstreeks te benaderen ... Anders, als je er ooit voor kiest om meerdere dingen te doen die singleton doet, zal het tamelijk moeilijk om te veranderen, omdat elke klasse een afhankelijkheid insluit als deze rechtstreeks toegang heeft tot de singleton.

Dus eigenlijk:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

liever dan:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

Ik geloof dat dit soort patroon wordt genoemd afhankelijkheid injectie en wordt over het algemeen als een goede zaak beschouwd.

Zoals elk patroon ... Denk er eens over na en bedenk of het gebruik ervan in de gegeven situatie ongepast is of niet ... Regels worden meestal verbroken en patronen moet niet willy nilly zonder gedachte worden toegepast.


71



Het singleton-patroon is op zich geen probleem. Het probleem is dat het patroon vaak wordt gebruikt door mensen die software ontwikkelen met objectgeoriënteerde tools zonder OO-concepten goed te begrijpen. Wanneer singletons in deze context worden geïntroduceerd, hebben ze de neiging om uit te groeien tot onhandelbare klassen die hulpmethoden bevatten voor elk klein gebruik.

Singletons zijn ook een probleem vanuit een testperspectief. Ze hebben de neiging om geïsoleerde unit-tests moeilijk te schrijven te maken. Inversie van controle (IoC) en afhankelijkheid injectie zijn patronen die bedoeld zijn om dit probleem op een object-georiënteerde manier te overwinnen, die zich leent voor unit-testing.

In een afval verzameld omgeving singletons kunnen snel een probleem worden met betrekking tot geheugenbeheer.

Er is ook een multi-threaded scenario waarbij singletons een knelpunt kunnen worden en een synchronisatieprobleem.


65