Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Mala dilema oko kreiranja objekta

[es] :: .NET :: Mala dilema oko kreiranja objekta

[ Pregleda: 1784 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.dynamic.sbb.rs.



+2 Profil

icon Mala dilema oko kreiranja objekta13.06.2010. u 16:36 - pre 168 meseci
Dakle radi se za sada o desktop aplikaciji koja ce kasnije verovatno biti web aplikacija, i imam neka dva svoja nacina kako instanciram objekte pa me zanima sta je bolje.
Prvi nacin je ovako nekako, ne znam da li ovo spada u neki creational pattern.
Code:

    public class StorageManager
    {
        private ICandidateDal GetCanidateDal()
        {
            return new CandidateDal();
        }
    }

Drugi nacin je preko singletona, ne znam da li ce ovo imati neku manu kada aplikacija bude radila van desktop-a
Code:

        private ICandidateDal m_CandidateDal = null;
        public ICandidateDal GetCandidateDalInstance()
        {
            if (m_CandidateDal == null)
                m_CandidateDal = new CandidateDal();
            return m_CandidateDal;
        }
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 19:33 - pre 168 meseci
A šta zapravo želiš da uradiš? Zašto mora baš singleton pattern, a ne može ponovno instanciranje objekta?
Ono prvo je factory pattern, ali koliko ima smisla to što je metoda private?
Šta je klasa StorageManager i u kakvoj je vezi sa ostalim klasama?
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.dynamic.sbb.rs.



+2 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 19:43 - pre 168 meseci
Imam po jednu, ja je zovem "access" klasa koja mi omogucava da pozivam metode iz svih ostalih klasa u nekom class library-u. StorageManager treba da mi sadrzi pristupne tacke do svih ostalih klasa u DAL-u. Radim refactor starog koda koji u recimo StorageManager ima:
Code:

        private ICandidateDal m_CandidateDal = null;
        public ICandidateDal GetCandidateDalInstance()
        {
            if (m_CandidateDal == null)
                m_CandidateDal = new CandidateDal();
            return m_CandidateDal;
        }

E posto sam nasao na netu da singleton ume u web aplikacijama da napravi problem moram nesto da promenim. Sada sam trenutno u StorageManager stavio:
Code:

public static ICandidateDal GetCanidateDal()
        {
            return new CandidateDal();
        }

        public static ICategoryDal GetCategoryDal()
        {
            return new CategoryDal();
        }
        ...

I kada mi treba objekat koristim:
Code:

...
        return StorageManager.GetCanidateDal().GetCandidateData(personalId);
...

Ono sto me konacno buni u celoj prici, jeste: Da li je ok koristiti ovaj drugi metod koji sam naveo? Da li je ok ovakav rad jer tako kako sam ga napravio svaki put kada trebam nesto da radim sa objektom "Candidate" pravim novi objekat, da li je ovo dobar nacin?
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 20:10 - pre 168 meseci
Za početak, ukloni klasu StorageManager, a instanciraj samo one objekte koji su ti zaista potrebni.

Citat:
Valerij Zajcev:
E posto sam nasao na netu da singleton ume u web aplikacijama da napravi problem moram nesto da promenim

Da li može neki link? Koja je razlika između primene singleton pattern-a u desktop i web aplikacijama?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 20:44 - pre 168 meseci
Singleton pattern na web aplikaciji ne garantuje da je single, samo da postoji jedan po worker procesu. Ako skaliras aplikaciju u farmu ili ako sam asp.net podigne drugi worker proces (ili reciklira stari) singleton i njegov state nisu jedinstveni.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.dynamic.sbb.rs.



+2 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 22:19 - pre 168 meseci
Citat:

Za početak, ukloni klasu StorageManager, a instanciraj samo one objekte koji su ti zaista potrebni.

Zasto? Mislim da je lakse imati jednu pristupnu tacku nego da jurim klase po programu. Sve su metode unutar te klase static i dobijam samo objekat koji trazim ne moram tu samu klasu da instanciram nigde.
 
Odgovor na temu

Dejan Carić
Oslo, Norway

Član broj: 230976
Poruke: 232
*.dynamic.isp.telekom.rs.

Sajt: www.dcaric.com


+26 Profil

icon Re: Mala dilema oko kreiranja objekta13.06.2010. u 23:02 - pre 168 meseci
@mmix
Hvala na odgovoru

@Valerij Zajcev

Zato što sa tom klasom ništa ne dobijaš. Što se tiče jurenja po programu.. stavi ih u neki zaseban namespace pa nećeš morati da ih juriš.
Po meni ima smisla koristiti factory pattern u 2 slučaja:

1. Kada prosleđivanjem parametara u konstruktoru nije dovoljno jasno šta će se zapravo instancirati, pa je umesto toga bolje koristiti deskriptivne nazive, tj. factory pattern. Ili kada bi se zakomplikovale sve moguće kombinacije parametara u konstruktoru.
Najprostiji mogući primer:
Imaš klasu Ugao koju instanciraš zadavanjem veličine u stepenima ili radijanima
Code:

class Ugao
{
    public static Ugao UStepenima(decimal stepeni)
    {
         return new Ugao(stepeni);
    }

    public static Ugao URadijanima(decimal radijani)
    {
         // pretvori radijane u stepene
         return new Ugao(stepeni);
    }

    private Ugao(decimal stepeni)
    {
        ....
    }

}

Ovo može biti dosta komplikovanije ukoliko se radi o nekim složenijim klasama.


2. Kada imaš više različitih klasa koje implementiraju isti interfejs.
Primer:
Code:

class VehicleFactory
{
    public enum VehicleType
    {
        Car,
        Bus 
    }

    public static IVehicle CreateVehicle(VehicleType vehicleType)
    {
        switch (vehicleType)
        {
            case VehicleType.Car:
                return new Car();
            case VehicleType.Bus:
                return new Bus();
        }
    }
}

class Car : IVehicle
{
    ....
}

class Bus : IVehicle
{
    ....
}



edit: Izmenio sam prvi primer. Klasa krug je zamenjena klasom ugao.

[Ovu poruku je menjao Dejan Carić dana 14.06.2010. u 17:30 GMT+1]
 
Odgovor na temu

[es] :: .NET :: Mala dilema oko kreiranja objekta

[ Pregleda: 1784 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.