Gdzie tworzyć słownik?

2017-06-01 07:15

Rejestracja: 3 lata temu

Ostatnio: 40 sekund temu

0

Mam słownik HashMap z którego korzystać będzie 1-* klas. W którym miejscu powinien być ten słownik tworzony?

  • w mainie jako static? (tak zrobiłem)
  • w konstruktorze klas które z niego korzystają? (to chyba bez sensu, bo sie bedzie powtarzac kod, ale tak mi ktoś doradził)
  • w interfejsie i potem do każdej klasy która potrzebuje słownika tylko implementować interfejs?
  • ... ?
edytowany 1x, ostatnio: Julian_, 2017-06-01 07:15

Pozostało 580 znaków

2017-06-01 09:40

Rejestracja: 17 lat temu

Ostatnio: 1 dzień temu

1

Jeśli potrzebujesz mieć słownik, który trzyma jakieś rzeczy, z którego będą mogły korzystać wszystkie inne klasy, ja bym zrobił z tego singleton. Albo coś na zasadzie fabryki.

Pozostało 580 znaków

2017-06-01 09:46

Rejestracja: 3 lata temu

Ostatnio: 40 sekund temu

0

Nie będą korzystać wszystkie klasy tylko niektóre. W tym wypadku też singleton?

Pozostało 580 znaków

2017-06-01 09:49

Rejestracja: 6 lat temu

Ostatnio: 2 godziny temu

2

Prosi się żeby wsadzić to do IoC jako singleton i wstrzykiwać, w zależności od tego czy klasa poprosi o słownik w konstruktorze czy nie.

edytowany 1x, ostatnio: grzesiek51114, 2017-06-01 09:49

Pozostało 580 znaków

2017-06-02 21:12

Rejestracja: 3 lata temu

Ostatnio: 40 sekund temu

0

@Juhas: @grzesiek51114
a jakie są korzyści ze wstrzykiwania singletona zamiast używania tego na chama?

bo ja to tak rozumiem:

wstrzykiwanie:

public class MyClass()
{
    MySkeleton dictionary;

    MyClass(MySkeleton dictionary){
        this.dictionary = dictionary
    }

    public void MyMethod() {
        return dictionary.getValue("R");
    }
}

-
na chama:

public class MyClass()
{
    MySkeleton dictionary = MySkeleton.INITIALIZE;

    MyClass(){

    }

    public void MyMethod() {
        return dictionary.getValue("R");
    }
}

-
jeszcze bardziej na chama:

public class MyClass()
{
    MyClass(){

    }

    public void MyMethod() {
        return MySkeleton.INITIALIZE.getValue("R");
    }
}
edytowany 2x, ostatnio: Julian_, 2017-06-02 21:15

Pozostało 580 znaków

2017-06-02 21:14

Rejestracja: 6 lat temu

Ostatnio: 2 godziny temu

0

Poczytaj choć trochę o IoC i dependency injection, a dowiesz się jakie są korzyści.

Pozostało 580 znaków

2017-06-02 21:21

Rejestracja: 3 lata temu

Ostatnio: 40 sekund temu

0

Podstawową niekorzyścią jest to, że zamiast używać eleganckich konstruktorownew MyClass() , new MyClass(y) będę musiał dopisywać singletona new MyClass(single) , new MyClass(y, single)

edytowany 2x, ostatnio: Julian_, 2017-06-02 21:23

Pozostało 580 znaków

2017-06-02 21:44

Rejestracja: 6 lat temu

Ostatnio: 2 godziny temu

0

Wykorzystując IoC nie musiałbyś dopisywać ani jednego argumentu kontruktora poczas tworzenia obiektu, a wszystkie miałbyś zainicjalizowane prawidłowo.

Ot i wygoda nazywana przez niektórych magią.

edytowany 1x, ostatnio: grzesiek51114, 2017-06-02 21:44

Pozostało 580 znaków

2017-06-04 12:10

Rejestracja: 17 lat temu

Ostatnio: 1 dzień temu

0

Dobra, przyznaję się bez bicia, że nadal nie jestem przekonany do tej "magii" IoC. No bo serio. W czym to:

class MyClass
{
  IMyInterface interface;

  public MyClass()
  {
     interface = MagicContainer.Resolve<IMyInterface>();
  }
}

jest lepsze od tego:

class MyClass
{
  IMyIntercae interface;

  public MyClass(IMyInterface iface)
  {
    interface = iface;
  }
}

W drugim przypadku mogę do konstruktora dać cokolwiek, co implementuje interfejs. Czy w pierwszym mogę użyć czegokolwiek? Przykład - zapis danych na dysk. Załóżmy, że mam kilka formatów zapisu - w związku z tym kilka klas implementujących interfejs: ISaveMe.

I dalej nie rozumiem w czym to:

Singleton.Instance.DoSomething();

jest gorsze od tego:

MagicContainer.Resolve<Singleton>().DoSomething();

Bo w pierwszym przypadku muszę napisać kilka linijek kodu więcej, żeby stworzyć tego singletona?
Żeby użyć dobrego kontenera IoC muszę go najpierw pobrać i jakoś go ogarnąć.

Pokaż pozostałe 3 komentarze
OK, a możesz podać jakiś DOBRY link? - Juhas 2017-06-05 15:36
OK, artykuł potwierdza moje oburzenie, dlatego uważam że jest fajny :) Jednak cały czas nie widzę sensu w kontenerze IoC. - Juhas 2017-06-06 10:37
OK, czytam i czytam i chyba wiem już jak poprawnie stosować kontenery IoC. I nie jest to takie głupie. Ale dalej zgłębiam temat, żeby trafić na coś, na co będę mógł ponarzekać ;) - Juhas 2017-06-06 12:21
kontenery nie są uniwersalnym rozwiązaniem wszelkich problemów z architekturą, ale te do których są przeznaczone rozwiązują całkiem nieźle - john_klamka 2017-06-06 12:29

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0