Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

August 4, 2009 / by Zsolt Soczó

A jitter huncutságai

Érdekes és furcsa dolgok történnek néha a .net jitter miatt, ami nem nagyon fordul elő nem managelt környezetben.

Itt ez a kis factoryka részlet:

public IBroker GetBroker()
{
if (broker == null)
{
switch (BrokerMode)
{
case BrokerMode.Simulated:
broker = new BrokerSimulated();
break;
case BrokerMode.IB:
broker = IBBroker.Instance;
break;
}
}
return broker;
}

Amikor meghívtam ezt a sort:

BrokerFactory.Factory.GetBroker().SetInitialEquity(20000);

akkor furcsamód lefutott az élő broker, az IBBroker konstruktora. Pedig NEM az az ág futott le a switchben. Valószínűleg az történt, hogy a jitter hozzáért az IBBroker osztályhoz, ez pedig törvényszerűen kiváltotta a statikus konstruktor lefutását.

A megoldás pofonegyszerű (ha ismerjük az okot :), ki kell emelni a beteg típusra hivatkozást egy külön metódusba. Mivel a jitter metódusonként dolgozik, így addig tényleg nem nyúl a típusunkhoz, míg tényleg nem használjuk:

public IBroker GetBroker()
{
if (broker == null)
{
switch (BrokerMode)
{
case BrokerMode.Simulated:
broker = new BrokerSimulated();
break;
case BrokerMode.IB:
broker = CreateIBBroker();
break;
}
}
return broker;
}

private static IBBroker CreateIBBroker()
{
return IBBroker.Instance;
}

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

7 COMMENTS

  • Szindbad August 4, 2009

    Vagy megjobb megoldas, ha a statikus konstruktorban nem is csinalunk semmit. :)

    Tudtommal a statikus konstruktor a tipus inicializalasa soran fut le, azaz akkor, amikor a CLR betolti az adott tipust. Ebben az esetben az adott tipust a fuggveny hivas elott kozvetlenul tolti be (a jitteles kornyeken), hiszen nem tudhatja, hogy az a tipus valoban hasznalva lesz-e a fugveny lefutasa soran, igy kenytelen betolteni az osszes direkt tipushivatkozashoz a hivatkozott tipusokat.

    Ezert szokott az lenni a javaslat, hogy statikus konstruktorba csak vegszukseg eseten tagyunk barmit is.

  • Soczó Zsolt August 4, 2009

    Jogos, csak kényelmes a singletonokat statikus konstruktorból létrehozni. Ebben az esetben nyilván megoldás lehet a kanonikus, lazy initialized singleton is.

  • b. August 5, 2009

    lehet en vagyok a gyenge, de a “broker” peldany mitol nem null a letrehozastol kezdve?

  • hrongyorgy August 5, 2009

    Ez egy factory. A factory arrol ismerszik meg, hogy vagy instancokat gyart, vagy egy darab instance-t ad folyamatosan vissza. Ez esetben ez utobbirol van szo: a rendszer inditasakor a broker termeszetesen null, hiszen senki nem vette a faradsagot erteket adni neki, de ha mar valaki hozzafordult, akkor fogja, es egyszeruen visszadobja a mar letezo peldanyt.

    Nyilvan ez egy snippet csak, be kell loni a BrokerMode valtozot (btw, nem a legszerencsesebb egy enumot meg egy valtozot ugyanugy elnevezni), tudni kell, hogy a Factory egy statikus public property, meg ilyenek.

    Legalabbis ilyen alapszinten. Google-val nezz utana a factory-knak az sokkal bovebb lere eresztve magyaraz. Azt nem tudom, hogy ez milyen pattern…

  • Soczó Zsolt August 5, 2009

    Ez egy Concrete Factory. A visszaadott productok polimorfak, ezért lehetne abstract factory, de a létrehozó osztályban nincs variáció, így nem az.
    A brokernek csak egyszer adok értéket, hisz logikailag az egy singleton, abból csak 1 példány kell a programban, de ennek típusa változó.
    Az elnevezésről a következőt írják:
    http://msdn.microsoft.com/en-us/library/ab6a8y1b(VS.71).aspx
    Parameter Naming Guidelines
    “Use type-based parameter names sparingly and only where it is appropriate.”
    Én úgy érzetem itt megfelelő. A fw-ben is van számtalan példa erre.

  • Bezzeg Szilvia August 31, 2009

    Érdemben sajnos nem tudok a témához szólni, fejvadászként csak felületes ismereteim vannak a .NETről és C#-ból.
    Minden elismerésem azoké, aki profi szinten értenek a szakmához ;)

  • Soczó Zsolt August 31, 2009

    Bezzeg Szilvia: de a spameléshez nagyon értesz. :)

    Fennhagyom a linket, mert érdekes lehet valakinek, csak túl átlátszó volt a szándék. :)