Nie jestem eksperę ale wydaje mi się że nie. Bo tu nie masz dependency injection. Po prostu tworzysz nowy obiekt typu Mailer. Nie “wstrzykujesz” do obiektu typu Trial już istniejącego obiektu którego instancja (wraz z istniejącymi właściwościami tej konkretnej instancji) może być np. współdzielona pomiędzy innymi obiektami tylko tworzysz zupełnie nową instancję.
Dependency Injection mogło by wyglądać np. tak:
class Config
def initialize(a, b, c)
@a = a
@b = b
@c = c
def do_something
....
end
def do_something_else
....
end
end
class A
def initialize
....
end
def set_config config
# setting an INSTANCE of config with
@config = config
end
def do_something
# retuns '1' + 'a', where 'a' is kept in config and is shared beetween between other classes
x = 1 + @config.a
a++
return x
end
end
class B
def initialize
....
end
def set_config config
# setting an INSTANCE of config with
@config = config
end
def do_something_else
# retuns '1' + 'a', where 'a' is kept in config and is shared beetween between other classes
x = 1 + @config.a
a++
return x
end
end
class C
def initialize
@config = new Config 1 2 3
object_a = new A
object_b = new B
# injecting config to objects, so they can share all the properties of config
object_a.set_config @config
object_b.set_config @config
# line below will return 2
object_a.do_something
# line below will return 3, because we have incremented a that's in shared config in line above
object_b.do_something_else
end
end
Tak jak pisałem nie jestem ekspertem, ale nie znalazłem zastosowania dla Dependency Injecton w prostych aplikacjach webowych w których. Bo są one praktycznie bezstanowe, to znaczy stan aplikacji pomiędzy poszczególnymi wywołaniami danej strony jest trzymany w bazie danych, albo w ciasteczku, a nie bezpośrednio w pamięci komputera. Aplikacja startuje, obsługuje żądanie i kończy swoją pracę, następne żądanie jest już obsługiwane przez na nowo wystartowaną aplikację (w skrócie)
Dependency Injection przydaje się w aplikacjach desktopowych. Jeżeli masz np. okno w którym coś wyświetlasz, to nie będziesz za każdym razem na nowo tworzył okna przez “new Okno” bo albo byś miał ich tysiące, albo byś musiał zamykać okno i dopiero nowe tworzyć, tylko będziesz przekazywał instancję okna do poszczególnych obiektów które mają akurat coś w tym oknie narysować. To tak trochę chaotycznie i skrótowo, ale może Ci coś pomoże
Ps. Co do ostatniego akapitu a propos desktopu, wyobraź sobie że masz grę 2d. W głównej pętli możesz albo pobierać od wszystkich postaci na ekranie ich pozycję, potem pobierać informację jaki mają obrazek, sprawdzić czy się mogą ruszyć tam gdzie chcą (czy też nie bo tam jest np. ściana) potem te informację zebrać do kupy i wyświetlić na “Ekranie”. Wtedy będziesz miał wiele liniijek kodu w swojej głównej klasie, albo możesz wywołać metodę każdej z postaci która wszystko posprawdza, ruszy się i narysuje swój obrazek na 'Ekranie" (czyli jednej instancji tego ekranu czy okna).
PPS: Tu chyba najlepiej jest opisane co to w ogóle jest Dependency Injection http://stackoverflow.com/a/140655/3373872 Sam używałem od dawna Dependency Injection, ale dopiero całkiem nie dawno się dowiedziałem że to co robię tak się właśnie nazywa