Singleton a Interface   zodpovězená otázka

VB.NET

Dobrý den,

měl bych otázku, jak zajistit, aby třída která bude implementovat nějaký interface byla vždy singleton.

Jako singleton používám kód:

 Private Shared m_instance As Trida

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance As Trida
        Get

            If m_instance Is Nothing Then
                m_instance = New Singleton()
            End If

            Return m_instance

        End Get
    End Property

takže instanci získám:

dim t as Trida = t.Instance

Napíšu si třídu, která bude implementovat rozhranní (př. Icontroller) a potřebuji zajistit, aby každá třidá s tímto rozhraním byla vždy singleton.

Použití by bylo:

dim c as IController = c.Instance

Problém je, že když v rozhraní použiji Readonly property Instance ....

Tak ve třídě nejde použít modifikátor Shared.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V rozhraní nejdou definovat statické členy. Třída singletonu ovšem může implementovat libovolné rozhraní. Takže jinak řečeno pomocí rozhraní "singletonovitost" nezajistíte, to byste musel vyřešit pomocí abstraktní MustInherit třídy, ze které by každý singleton dědil. Taková třída se pak musí povinně dědit a mohou v ní být statické členy (Instance). Rovněž může sloužit pro polymorfní účely stejně jako rozhraní.

Pamatujte si, že tam kde rozhraní naráží na nějaká omezení, to lze většinou vyřešit pomocí abstraktní MustInherit třídy.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To nepůjde. Nevím ani k čemu by to bylo.

Jeden ze způsobů (nejjednodušší, rozhodně ne vždy správný), jak to vyřešit je mít ještě interface ISingletonProvider, který bude mít jedinou readonly vlastnost Instance. A tuto třídu budete mít pro každý typ, který chcete takto získat.

Obecně bych ale doporučil řešení jiné. To by záleželo na způsobu použití, který mi není z dotazu patrný. Čeho chcete dosáhnout?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jenomže tím nedosáhne hlavních požadavků singletonu - Private konstruktor a statická Instance vlastnost. Autorovi zřejmě jde o vynucení těchto věcí a toho se dá dosáhnout pouze způsobem, jaký jsem popsal.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použití privátního konstruktoru se statickou vlastností je jen jeden ze způsobů jak singleton implementovat.

Vzhledem k tomu, že šlo tazateli o popis pomocí interfacu je vaše použití hodně kostrbaté a vyplatí se použít jinou implementaci. Například service locator (jiná třída se stará o vytváření a udržení instance). Ale to hodně záleží na tom, čeho chce dosáhnout. Protože teď je dotaz položený tak, že odpověd zní "toho nelze implementovat".

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Účel singletonu je třída existující pouze v jediné instanci v rámci celé aplikace. Toho se běžně dosahuje pomocí Private konstruktoru a statické vlastnosti pro přístup k této jediné instanci.

To co navrhujete vy (service locator) jednak není singleton a jednak je to hovadské stavění nukleární elektrárny kvůli naprosto primitivní věci. Doporučuji přečíst následující materiály:

http://msdn.microsoft.com/en-us/library/...

http://msdn.microsoft.com/en-us/magazine...

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nehádejte se o věcech o kterých očividně nic nevíte a nevkládejte mi do úst něco, co jsem nenapsal.

Singleton je způsob řízení životního cyklu instancí. To, co vy mi tu stále dokola opakujete je jedna ze způsobů doporučených implementací, která je sice nejprimitivnější, rozhodně ne však vždy vhodná.

Že je service locator singleton??? To jsem nikdy nenapsal, ani netrvdil. Je to způsob, jak můžete pomocí rozhraní získávat instance, mimojiné v rámci životního cyklu singleton. Což by mohlo být jedno ze řešení původního dotazu.

A výrok hovadské stavění nukleární elektrárny je sám o sobě hovadský. Vždyť vy i já neznáme rozsah použití, který chce tazatek aplikovat. Nebo snad ano?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Z vašeho příspěvku je jasně vidět, že o dané věci nevíte nic vy. Účel singletonu je zcela jasný a potvrzuje to i poslední příspěvek tazatele - centralizovaný přístup k jediné instanci třídy v rámci celé aplikace. Singleton neurčuje žádný životní cyklus a ani nijak nesouvisí s jinými návrhovými vzory.

Pokud znáte jiný způsob implementace třídy tak, aby to byl singleton, napište ho, v opačném případě se nehádejte, neboť nemáte pravdu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Viz příspěvek níže. Řešení nabídku, až se vyjádří tazatel. Psát vám je jako házet hrách proti zdi.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jde o řídící třídy různých kontroléru (hw), jejichž instance se v celém projektu nesmí vyskytnout vícekrát, protože u některých není povoleno vícenásobné připojení a systém (resp. knihovna třetí strany vyhodí exception, na kterou se velice obtížně reaguje, protože instance kontrolerů se vytvářejí dynamicky prohlédáním složky s library, nalezením typu a jeho vytvořením. Vyjímky tudíž nejsou dopředu známé).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A jakým způsobem chcete instance získávat? Popisuje třídy nějaký společný interface se kterým chcete pracovat? Bude pracovat s těmito třídami jako se seznamem? Stále totiž nechápu, čeho chcete dosáhnout jednotným způsobem vytváření.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vy nerozumíte tomu, co tazatel píše? Potřebuje centralizovaný přístup k instanci třídy existující pouze jednou v rámci celé aplikace, tudíž žádné vytváření instancí ani přístup pomocí rozhraní ho nezajímá. Už prosím pochopte, k čemu ten singleton vlastně je. Přečtěte si mnou odkazované články, podívejte se, jak funguje My.Settings.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Implementaci, kterou se tu slepě oháníte pořád dokola je uvedena už v dotazu. Kdyby tazateli stačila, tak příspěvek vůbec nezakládá. Otázka zněla, jak jednotně popsat tyto třídy a jejich vlastnosti pro poskytnutí této instance. A vzhledem, že to takto nelze, bude potřeba zjistit o požadavku více informací.

Dál už na urážlivé příspěvky reagovat nebudu. Chcete se jen hádat a slepě hájit svůj názor. To, že máte svůj úzce vymezený svět vybraných technologií a musíte napadat a považovat za špatné všechno, co přesně nezapadne do způsobu použití, se kterým jste se setkal, je tu veřejně známo. O čem to vypovídá se tu rozepisovat nebudu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Aha, takže místo příkladu nějaké jiné implementace singletonu jen prázdné, tučně zvýrazněné plky, které navíc nejsou pravdivé. No to se dalo čekat. O čem to vypovídá je každému jasné.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždyť jste tím singletonem úplně posedlý. Jste schopný se do krve úplně zbytečně hádat o řešení pro dotaz, který řešení v původní podobě vůbec nemá. O několik příspěvků výš se ptám, jak to bylo myšleno a vy okamžitě musíte zase úplně zbytečně a slepě útočit.

Takže naposledy - udělejte mi laskavost, ušetřete si architektonické výlevy o řešení, které je pro tento případ absolutně nevhodné (viz původní dotaz) a počkejte, až tazatel odpoví a poskytne relevantní informace.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tímto bych chtěl tedy požádat páně Plška, aby nám lépe osvětlil co vlastně chtěl. Zatím víme, že chtěl třídu existující pouze v jediné instanci, ke které se přistupuje centrálně. Toto přesně a do puntíku splňuje návrhový vzor Singleton. Co zatím nevíme je, proč chtěl vlastně to rozhraní. Osobně si myslím, že jím chtěl zajistit právě tu statickou vlastnost a Private konstruktor, což je alfa a omega každého singletonu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde o to, že klient potřebuje do aplikace přidat mnou dodanou knihovnu ke konkrétnímu hw, klientská aplikace si vytváří instance voláním statického členu s názvem Instance (nebo je možnost to po domluvě změnit na jiný způsob).

Já mám zajistit, aby:

1) se každá instance chovala polymorfně (interface IController)

2) aby nemohlo dojít k vytvoření instance téhož typu vícekrát v rámci aplikace. A pokud by se o to aplikace pokusila vrátila by se již vytvořená instance (tohle je, alespoň doufám singleton)

Původně jsem myslel, že bych tyto dvě zadání skloubil do interfacu IController (jednou "Shared Property Instance as IController", jenže tak jak mě upozornil p. Linhart nejdou deklarovat stat. členy (na což jsem při psaní interfacu přišel :)) A ptal jsem se jak tedy toto zajistit.

To jak se pracuje s těmito třídami v klientské aplikaci bohužel nevím (jakým způsobem aplikace vytváří instance tříd ,je li to umožněno vícekrát, uchovávají li se v nějakém listu, slovníku ...).

A omlouvám se za nejasnosti v dotazu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Instanci třídy udělané jako singleton nelze už z principu privátního konstruktoru vytvořit, jediný způsob jak s ní pracovat je tedy pomocí její statické vlastnosti Instance. Polymorfní způsob práce s ní zajistit lze implementací příslušného rozhraní, pochopitelně v něm ale nebude zahrnuta ta statická vlastnost, což ale vůbec nevadí, protože to je vedlejší věc, která s hlavní funkcionalitou třídy nesouvisí.

Vaše řešení daného problému je tedy za uvedených okolností správné.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Že nelze vytvořit instance třídy kvůli tomu, že má pouze privátní konstruktor, není tak docela pravda. Nejspíš tušíte, že například reflexí si vytvořím takových instancí kolik budu chtít. To snad jen v Javě, kde se dá udělat singleton pomocí enumu to máte skutečně ošetřené.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pořád mi není moc jasné, proč chcete sjednocovat získávání instancí? Potřebujete to? Něco takového by se hodilo pouze v případě, že budete s instancemi pracovat jako se seznamem a dopředu nebude v systému, který bude instance využívat, známo, které typy tříd se budou používat a budete chtít jednotný způsob, jak instance získávat.

Aby nedošlo k nejasnostem, tak teď se neptám na to, jestli má třída nějak implementovat singleton nebo ne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback