Wydaje się, że istnieje wiele zamieszania na temat wzoru Inversion of Control (IoC). Wiele osób utożsamiło go ze Wzorcem Strategii lub Modelem Składowym, ale te porównania nie oddają w rzeczywistości tego, o co chodzi w IoC. IoC naprawdę dotyczy sposobu uzyskania zależności. Dam ci przykład:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
W powyższym jasne jest, że Sprite.Load
ma zależność od FileReader
. Aby przetestować metodę, potrzebujesz:
- System plików na miejscu
- Plik testowy do załadowania z systemu plików
- Możliwość wyzwalania typowych błędów systemu plików
Pierwsze dwa są oczywiste, ale jeśli chcesz mieć pewność, że obsługa błędów działa zgodnie z oczekiwaniami, naprawdę potrzebujesz również # 3. W obu przypadkach potencjalnie spowolniłeś swoje testy, ponieważ muszą teraz przejść na dysk i prawdopodobnie sprawiłeś, że środowisko testowe jest bardziej skomplikowane.
Celem IoC jest oddzielenie użycia zachowania od jego budowy. Zauważ, że różni się to od wzorca strategii. W przypadku wzorca strategii celem jest kapsułkowanie zachowania, które można ponownie wykorzystać, aby można go było łatwo przedłużyć w przyszłości; nie ma nic do powiedzenia na temat budowy strategii.
Gdybyśmy przepisali Sprite.Load
powyższą metodę, prawdopodobnie otrzymalibyśmy:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
Teraz oddzieliliśmy konstrukcję czytnika od jego użycia. Dlatego podczas testowania można zamienić czytnik testowy. Oznacza to, że środowisko testowe nie potrzebuje już systemu plików, plików testowych i może łatwo symulować zdarzenia błędów.
Zauważ, że zrobiłem dwie rzeczy podczas mojego przepisywania. Stworzyłem interfejs, IReader
który zawierał pewne zachowania - tj. Wdrożyłem wzorzec strategii. Ponadto przeniosłem odpowiedzialność za stworzenie odpowiedniego czytelnika na inną klasę.
Może nie potrzebujemy nowej nazwy wzoru do opisania powyższego. Uderza mnie to jako połączenie strategii i wzorców fabrycznych (dla kontenerów IoC). Biorąc to pod uwagę, nie jestem pewien, z jakich powodów ludzie sprzeciwiają się temu wzorowi, ponieważ jest jasne, że rozwiązuje on prawdziwy problem, a na pewno nie jest dla mnie oczywiste, co to ma wspólnego z Javą.