Gdzie tworzyć słownik?

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?
  • ... ?
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.

0

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

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.

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");
	}
}
0

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

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)

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ą.

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ąć.

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