Aktywne Wpisy
Van-der-Ledre +39
Jeden lotniskowiec, drugi lotniskowiec, dziesiątki okrętów, teraz mobilizowana jest jeszcze marynarka Grecji, Izrael wedle źródeł powoła łącznie mln żołnierzy. Połączcie kropki. Tu nie chodzi o Palestynę. Do pacyfikacji hamasu nie jest potrzebna taka potęga, nawet do uszczelnienia granic, też nie. Tam zajdzie coś większego, tylko my jeszcze o tym nie wiemy. Stawiam, że w bliżej nieokreślonym czasie w akcję włączą się inne państwa arabskie, Iran, Syria, Liban, Jordania itd. (Z naciskiem na
repro5 +149
Jakim cudem PIS ma wciąż 36%, ku***. Partia powinna mieć poniżej 30 po ostatnich aferach. Czyżby elektorat byłby tak odporny na fakty?
#wybory
#wybory
W ten sposób nigdy "nie szyję" zależności, tylko odwołuję się przez XXX.Services.Collaborator.DoSmthg().
Każdy konkretny service jest już normalną klasą, z góry zakładam, że jest bezstanowy (polecam ten styl życia) i ma domyślny konstruktor. Używając nunita jest to testowalne (wymaga troche brzydkiego myku - opieram się na nazwie testu, tj. gdy test odwołuje się do jakiegoś servicu po raz pierwszy, to wtedy tworzę double'a - nową instancję dla każego testu), w kodzie 'produkcyjnym' używa się wybitnie wygodnie - można żonglować zależnościami do woli i bez bólu.
Po co o tym pisze? Bo 1) #chwalesie i 2) rozwiązanie wydaje mi się aż za proste i szukam ukrytych wad ( ͡° ͜ʖ ͡°)
edit: nie umiem zrobić spacji ( ͡° ʖ̯ ͡°)
#programowanie #csharp #ddd #tdd #designpatterns
Poza tym: https://en.wikipedia.org/wiki/Service_locator_pattern#Disadvantages
- moje serwisy są bezstanowe, problem wątkowości rozwiązany,
- nie utrudniają testów, ponieważ każdy test ma swoją instancję zależności
- nie ma opcji, by brakowało zależności (załatwia to trywialny test, którego nie trzeba modyfikować po dodaniu nowych zależności)
Dlaczego nie standardowe podejście? Bo większość rozwiązań, które widziałem, opierała się na słownikach (typ, instancja) lub podobnych rozwiązaniach. Moje bazuje na konkretach i ma
Po pierwsze są już różne istniejące implementacje, więc rozumiem, że tworzysz nową dla sportu, a nie na produkcję?
Po drugie (i to ważniejsze): nie uzależniaj swojego kodu od SL. To odwrotnie: SL może być „centrum” aplikacji, gdzie budujesz wszystkie obiekty, konfigurujesz – ale reszta aplikacji ma nie wiedzieć o SL.
Przykład o co mi chodzi…
Masz powiedzmy klasę
HelloController
. Masz też usługęSerwis A używa Serwisu B.
Jak to rozwiązujesz? Strzelam, że masz tam po prostu
class A
{
public void DoSomething()
{
ServiceLocator.B.DoSomethingElse();
//some code here
}
}
Co ma poważną wadę - ukrywasz zależności. Na pierwszy rzut oka nie widać, że A zależy od B (jakby to było w standardowym DI - A prawdopodobnie przyjmowałby B jako parametr konstruktora).
Edit. widzę, że
@MacDada się faktycznie rozpisał :) nawet prawie wszystko udało mi się zrozumieć. Nie czuję tylko bólu w postaci ograniczenia do bezparametrowych konstruktorów - to się da prosto załatwić metodą typu Initialize, a sam konstruktor ma być bezparametrowy, żeby łatwiej mocki
Obczaj sobie to. Autorzy przechodzą przez często spotykane zagadnienia i wyjaśniają dlaczego tak jest źle i jak temu zaradzić. Ma to już parę lat, ale myślę, że za mocno się nie zestarzało :)
@sasik520: A z drugiej strony
@sasik520: :P
To nie jest tak. Skoro robisz w kodzie coś, żeby był łatwo testowalny to prawdopodobnie gdzieś indziej sprataczyłeś (w 99% przypadków). Owszem dobry kod jest testowalny, ale to jest tak naprawdę efekt uboczny. Po prostu ktoś kiedyś zauważył, że jedną z cech dobrego
Masz rację z narzucaniem architektury. w moim przypadku to nie problem (wszystko, czego używam w sl jest internal), ale to rzeczywisty i duży minus tego rozwiązania.
Nie masz racji z "nie masz nawet pojęcia, które mocki będą ci potrzebne" - i nie potrzebuję. Każdy mock zostanie stworzony na potrzeby testu w momencie jego pierwszego użycia. Każdy test dysponuje swoim własnym mockiem. Ten
@sasik520: Trochę kupuję, trochę nie. To rozwiązuje problem zależności w pewnym sensie. Zastanawia mnie jak sobie radzisz
Klasyczne DI "lśni" w twoim scenariuszu, czyli gdy chcesz reużyć klasy w innym miejscu. Moje podejście z kolei jest bardzo wygodne w trakcie projektowania komponentu - mogę dowolnie przenosić zależności z jednego komponentu na drugi i nie kosztuje mnie to nic.