DI - Singleton w C# vs zmienna globalna w C++

0

Cześć,
chciałem się zapytać czy jest jakaś znacząca różnica między services.AddSingleton w C# a zmienną globalną np. w C++ poza tym, ze zmienna globalna wydaje się wygodniejsza w użyciu (pomijam kwestie związane z wielowątkowością etc.)?
Bo jeśli dobrze rozumiem wstrzykiwanie zależności to singleton ma właśnie pełnić funkcję takiej wszędzie dostępnej zmiennej globalnej(?). Czy może się mylę i nie o to tu chodzi?

3

Różnica jest o tyle znacząca, że zależność od wstrzyknięto Singletona da się normalnie przetestować. Do zmiennej globalnej podobny jest bardziej klasyczny Singleton, jak klasa z polem statycznym z instancją singletona.

Ale w ogólności to tak - Singleton jest w pewnym sensie globalny.

Warto zwrócić uwagę na to, że globalnosc nie jest zawsze zła - np. ISessionFactory z NHibernate rejestruje się jako Singleton, bo nie ma sensu za każdym razem tworzyć nowego.

4

Różnica jest taka że masz obiekt który nie ma kopii (pracujesz na oryginalne) vs zmienna którą możesz nie tylko odczytać ale również zmienić w każdym momencie.

Zresztą porównanie sposobu programowania do cech języka programowania mija się troszkę z celem

W C++ również masz singleton
https://4programmers.net/C/Artyku%C5%82y/Generyczny_singleton_w_C++

2

Singleton to próba zrobienia zmiennej globalnej w językach w których nie ma zmiennych globalnych.
Względnie, jest to próba zrobienia zmiennej globalnej w języku mającym zmienne globalne, ale tak by nie nazywać tego zmienną globalną i nadal mimo wyznawania poglądu "zmienne globalne są be" czuć się dobrze.

0

Dziękuję za odpowiedzi.
Moje pytanie wynikało z faktu, że nie jestem pewny czy dobrze rozumiem ideę DI i jaki cel pełni.
Nie mam doświadczenia w testowaniu, więc być może faktycznie w tym zakresie ma to jakieś uzasadnienie.

fasadin napisał(a):

Różnica jest taka że masz obiekt który nie ma kopii (pracujesz na oryginalne) vs zmienna którą możesz nie tylko odczytać ale również zmienić w każdym momencie.

Czy mógłbyś troszkę rozwinąć myśl - nie bardzo rozumiem co napisałeś :/. Poza tym zmienną globalną również można tak stworzyć, aby maksymalnie zabezpieczyć się przed złym wykorzystaniem.

Odnośnie Singletona i zmiennej globalnej to jeśli dobrze rozumiem równie dobrze można utworzyć zmienną statyczną (to można zrobić również w C#) - i efekt powinien być ten sam.

Tak jak AddSingleton można odwzorować przez zrobienie zmiennej statycznej tak w przypadku AddTransient jest równoznaczne z każdorazowym wywołaniem new - więc nie bardzo rozumiem uzasadnienia dla DI w tym kontekście - chyba, że właśnie poza testowaniem, gdzie można łatwo podmienić klasy.

Pozostaje jeszcze AddScope - to chyba jedyna opcja, którą jestem wstanie jakoś uzasadnić poza kwestiami testów.

0

Zmienna globalna można zabezpieczyć? To proszę zabezpiecz mi void *ptr :) ja jedynie zrobię coś takiego (gdzieś w kodzie więc nie wiesz jaki stan aplikacji)

ptr = null

Jestem ciekawy jak przed czymś takim zabezpieczyć zmienną

DI nie ma nic wspólnego z testowaniem.
To że dzięki DI łatwiej się testuje to jest konsekwencją tego jak DI działa.

DI to jest koncept architektoniczny/projektowy

Singleton to jest wzorzec projektowy

A zmienna globalna to zmienna którą możesz użyć w każdym momencie

Przy DI nie jest to możliwe. Chociażby nie możesz wywołać singletona z do jako pierwsza instrukcje w main jako że di nawet jeszcze nie zarejestrowało niczego

Static w c# to nie to samo co zmienna globalna, jest spora różnica. Chociażby ze w c# wszystko jest obiektem (tak nawet int). Mimo że wydaje się że osiągaja ten sam cel sposób jest zupełnie rozny.
W o wielowątkowości nie wspomnę bo tu zmienna globalna ma bardzo mało do powiedzenia :D

Testy piszesz pod wszystko, nie ważne czy do czy nie.
Możesz sobie wszystkie powiązania klas robić w jakieś metodzie i nadal klasa będzie testowalna (choć dziwna)

Trochę nie rozumiem twojego konta "zagubienia w pytaniu"

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