Sobes.tech
Middle

Wat betekent het principe van openheid/sluiting?

sobes.tech AI

Antwoord van AI

Модули должны быть открыты для расширения, но закрыты для модификации. Это означает, что можно добавить новую функциональность, не меняя существующий код. Достигается через использование абстракций (интерфейсов, протоколов, абстрактных классов) и наследования.

Пример: есть протокол PaymentProcessor и реализации для разных платежных систем. Новая платежная система добавляется без изменения существующих реализаций.

protocol PaymentProcessor {
    func processPayment(amount: Double)
}

class StripePaymentProcessor: PaymentProcessor {
    func processPayment(amount: Double) {
        // Логика оплаты через Stripe
        print("Processing \(amount) via Stripe")
    }
}

class PayPalPaymentProcessor: PaymentProcessor {
    func processPayment(amount: Double) {
        // Логика оплаты через PayPal
        print("Processing \(amount) via PayPal")
    }
}

// Добавление новой системы без изменения существующих классов
class ApplePayPaymentProcessor: PaymentProcessor {
    func processPayment(amount: Double) {
        // Логика оплаты через Apple Pay
        print("Processing \(amount) via Apple Pay")
    }
}

class PaymentManager {
    private let processor: PaymentProcessor

    init(processor: PaymentProcessor) {
        self.processor = processor
    }

    func makePayment(amount: Double) {
        processor.processPayment(amount: amount)
    }
}

// Использование
let stripeManager = PaymentManager(processor: StripePaymentProcessor())
stripeManager.makePayment(amount: 100.0)

let applePayManager = PaymentManager(processor: ApplePayPaymentProcessor())
applePayManager.makePayment(amount: 50.0)