Swift Academy · Oppitunti

Riippuvuuksien kääntäminen protokolla-abstraktioilla

Abstraktioihin, ei konkreettisiin toteutuksiin, tukeutuminen Swift-protokollien toimiessa rajoina.

Oppitunti 3/413 vaihetta

Riippuvuuksien kääntäminen protokolla-abstraktioilla on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Riippuvuuksien kääntämisen periaate

Korkean tason moduulien ei pitäisi riippua matalan tason moduuleista. Molempien pitäisi riippua abstraktioista (protokollista).

// WITHOUT DIP:
class OrderService { let db = SQLiteDatabase() }  // depends on concrete
// WITH DIP:
class OrderService { let db: Database }  // depends on abstraction

Abstraktion määrittäminen

Poimikaa protokollaksi sopimus, joka sisältää korkean tason moduulin tarvitsemat toiminnallisuudet.

protocol Database {
  func save<T: Encodable>(_ value: T, key: String) throws
  func load<T: Decodable>(key: String) throws -> T
}

Konkreettiset toteutukset

Tarjotkaa protokollan taakse useita konkreettisia toteutuksia: tuotantoa, testausta ja tulevia vaihtoehtoja varten.

class SQLiteDatabase: Database { ... }
class InMemoryDatabase: Database { ... }
class KeychainDatabase: Database { ... }

Riippuvuuksien injektointi konstruktorilla

Välittäkää abstraktio alustajalle — tämä on selkein ja parhaiten testattava injektointitapa.

class ProfileService {
  private let db: Database
  init(db: Database) { self.db = db }
}

Miksi ei singletonia kaikkeen?

Globaalit singletonit piilottavat riippuvuudet, minkä vuoksi koodia on vaikea testata ja sen toimintaa perustella.

// Hard to test:
class Service { func run() { MySingleton.shared.doWork() } }
// Easy to test:
class Service { let dep: MyProtocol; func run() { dep.doWork() } }

Protokolla-abstraktiot Swiftissä

Swift-protokollat voivat sisältää associated type -tyyppejä, oletustoteutuksia ja koostamista, joten ne sopivat erinomaisesti monipuolisiin abstraktioihin.

protocol Cacheable {
  associatedtype Key: Hashable
  associatedtype Value
  func get(_ key: Key) -> Value?
  func set(_ key: Key, value: Value)
}

Abstraktion rakeisuus

Interface Segregation -periaatteen mukaisesti suosikaa kapeita protokollia laajojen sijaan, jotta toteutusten tarvitsee tarjota vain kutsujien tarvitsemat toiminnot.

// Fat (avoid):
protocol DataStore {
  func save(...); func load(...); func delete(...); func query(...); func migrate()
}
// Narrow (prefer):
protocol Readable { func load<T>(...) throws -> T }
protocol Writable { func save<T>(...) throws }

DIP Combinen kanssa

Palauttakaa protokollan metodeista AnyPublisher, jotta taustalla olevan publisherin tyyppi pysyy piilossa.

protocol UserStream {
  func userUpdates() -> AnyPublisher<User, Never>
}

DIP async/awaitin kanssa

async throws-määreillä merkityt protokollametodit ovat täysin yhteensopivia Swiftin rakenteisen rinnakkaisuuden kanssa.

protocol Analytics {
  func track(event: String) async
}
struct FirebaseAnalytics: Analytics {
  func track(event: String) async { /* Firebase call */ }
}

DIP sovellustasolla

Kytkekää konkreettiset toteutukset sovelluksen aloituspisteessä (Composition Root), jotta kaikki sidonnat pysyvät yhdessä paikassa.

@main
struct MyApp: App {
  let db: Database = SQLiteDatabase()
  let repo: UserRepository = RemoteUserRepository(db: db)
  let useCase = FetchUserUseCase(repo: repo)
  var body: some Scene {
    WindowGroup { ContentView(useCase: useCase) }
  }
}

Testaus DIP:n avulla

Korvatkaa testeissä todelliset toteutukset mock- tai stub-toteutuksilla injektointikohdassa.

let mockDB = InMemoryDatabase()
let service = ProfileService(db: mockDB)
// Exercise service
XCTAssertEqual(try mockDB.load(key: "profile"), expectedProfile)

Pikatarkistus

Mitä Dependency Inversion Principle sanoo korkean tason moduuleista?

Oppitunnin kertaus

DIP:n mukaan korkean tason moduulit riippuvat protokolla-abstraktioista ja konkreettiset tyypit toteuttavat ne. Poimikaa kapeita protokollia, injektoikaa riippuvuudet konstruktoreilla ja kytkekää kaikki Composition Rootissa. Näin toteutukset voidaan vaihtaa testausta, ominaisuuslippuja ja tulevia vaatimuksia varten.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Riippuvuuksien kääntäminen protokolla-abstraktioilla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Riippuvuuksien kääntäminen protokolla-abstraktioilla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Riippuvuuksien kääntäminen protokolla-abstraktioilla”?

Abstraktioihin, ei konkreettisiin toteutuksiin, tukeutuminen Swift-protokollien toimiessa rajoina. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Riippuvuuksien kääntäminen protokolla-abstraktioilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kerroksittainen arkkitehtuuri: toimialue, data ja esityskerros
  2. Käyttötapaus- ja repository-mallit
  3. Riippuvuuksien kääntäminen protokolla-abstraktioilla
  4. Kerrosten yhdistäminen ilman DI-kehystä
← Takaisin: Swift Academy