Section 4/71 menit

4. Kapan Harus Digunakan

4. Kapan Harus Digunakan

Gunakan package ketika:

1. Cross-module helpers dalam satu SDK/library

swift
// Core module: helper yang dibutuhkan Analytics tapi bukan end-user API
package extension URLRequest {
    package func addAuthHeaders(_ token: String) -> URLRequest {
        var request = self
        request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
        return request
    }
}

// Analytics module: pakai helper ini
import Core
let authenticated = request.addAuthHeaders(token)  // ✅ OK

2. Shared types antar feature modules

swift
// SharedTypes module (dalam paket yang sama)
package struct AnalyticsEvent {
    package let name: String
    package let properties: [String: String]
    package let timestamp: Date
    
    package init(name: String, properties: [String: String] = [:]) {
        self.name = name
        self.properties = properties
        self.timestamp = Date()
    }
}

// UserFeature module
import SharedTypes
let event = AnalyticsEvent(name: "user_login")  // ✅ OK

// Consumer App: tidak bisa akses AnalyticsEvent langsung
// AnalyticsEvent adalah implementation detail dari SDK

3. Testing yang butuh akses ke internal implementation

swift
// Core module: implementation detail
package class RequestBuilder {
    package var baseURL: URL
    package var headers: [String: String] = [:]
    
    package init(baseURL: URL) { self.baseURL = baseURL }
    package func build() -> URLRequest { URLRequest(url: baseURL) }
}

// CoreTests target (dalam paket yang sama):
import Core
// Bisa test RequestBuilder secara detail tanpa menjadikannya public
let builder = RequestBuilder(baseURL: testURL)
builder.headers["X-Test"] = "true"
let request = builder.build()

4. Plugin/extension point antar module

swift
// PluginCore module
package protocol FeaturePlugin {
    package var identifier: String { get }
    package func activate(with context: PluginContext)
}

package class PluginRegistry {
    package static let shared = PluginRegistry()
    package func register(_ plugin: any FeaturePlugin) { }
}

// FeatureA module
import PluginCore

struct FeatureAPlugin: FeaturePlugin {
    package var identifier = "com.app.featureA"
    package func activate(with context: PluginContext) { }
}

// Registration — tanpa end-user bisa melakukan hal yang sama
PluginRegistry.shared.register(FeatureAPlugin())