Przygotowanie do rozmowy kwalifikacyjnej na iOS 6 — wstrzykiwanie zależności
Pytania do wywiadu
- Co to jest wstrzykiwanie zależności i dlaczego jest przydatne?
- Czy możesz podać przykład, w jaki sposób wstrzykiwanie zależności jest używane w systemie iOS?
- Jakie są różne typy wstrzykiwania zależności (wstrzykiwanie konstruktora, wstrzykiwanie ustawiacza itp.) I kiedy należy stosować każdy typ?
- W jaki sposób można wykorzystać wstrzykiwanie zależności, aby poprawić testowalność aplikacji na iOS?
- Czy możesz omówić niektóre typowe wyzwania lub pułapki, które pojawiają się podczas korzystania z wstrzykiwania zależności w programowaniu na iOS i jak ich uniknąć?
- Jakie są popularne frameworki wstrzykiwania zależności dla systemu iOS i jakie są ich kluczowe cechy i zalety?
- Czy możesz omówić kilka najlepszych praktyk dotyczących wstrzykiwania zależności w programowaniu na iOS?
Odwrócenie kontroli to wzorzec projektowy oprogramowania, który koncentruje się na przekazaniu kontroli od programisty do struktury. Framework jest wtedy odpowiedzialny za tworzenie i zarządzanie instancjami obiektów, podczas gdy programista jest odpowiedzialny za dostarczanie specyficznych konfiguracji aplikacji.
Jest to wzorzec, który pozwala odwrócić przepływ kontroli. Aby to osiągnąć, przenosisz wszystkie obowiązki klasy, z wyjątkiem jej głównej, na zewnątrz, czyniąc je jej zależnościami. Dlatego twój obiekt nie wie, jak je utworzyć. Dzięki temu kod jest testowalny i możliwy do utrzymania dzięki wyeliminowaniu ścisłych relacji między klasami.
Zastrzyk zależności
Dependency Injection to jeden z nielicznych wzorców, który pozwala zastosować zasady Inversion of Control. DI można zaimplementować na kilka sposobów
wtrysk konstruktora
W Constructor Injection przekazujemy wszystkie zależności przez konstruktor jako parametry.
protocol EngineProtocol {
func start()
func stop()
}
protocol TransmissionProtocol {
func changeGear(gear: Gear)
}
final class Car {
private let engine: EngineProtocol
private let transmission: TransmissionProtocol
init(engine: EngineProtocol, transmission: TransmissionProtocol) {
self.engine = engine
self.transmission = transmission
}
}
final class Car {
private var engine: EngineProtocol?
private var transmission: TransmissionProtocol?
func setEngine(engine: EngineProtocol) {
self.engine = engine
}
func setTransmission(transmission: TransmissionProtocol) {
self.transmission = transmission
}
}
Główną ideą jest to, że fragment kodu, który wymaga pewnych zależności, nie stworzy ich dla siebie, a kontrola nad dostarczaniem tych zależności jest odroczona do jakiejś wyższej abstrakcji.
Główną zaletą Inversion of Control jest to
- DI pomaga poprawić modułowość kodu, łatwiej go zrozumieć i utrzymać
- Łatwe wstrzykiwanie próbnych lub fałszywych zależności podczas testowania
- Elastyczność i rozszerzalność Twojej aplikacji, umożliwiając łatwe zastępowanie lub zamianę zależności używanych przez Twoje komponenty.