โ† Kembali ke Konsep OOP
๐Ÿ”“
Prinsip

Open/Closed

Entitas software seharusnya terbuka untuk perluasan tetapi tertutup untuk modifikasi; tambahkan perilaku baru tanpa mengubah kode yang sudah ada dan sudah dites.

Masalahnya

Saat kebutuhan baru ditangani dengan mengedit class yang sudah ada, misalnya menambah cabang `if` untuk setiap tipe baru, setiap perubahan berisiko merusak fungsionalitas yang ada dan menuntut seluruh class dites ulang.

Cara Kerja

  • โ€บPerilaku baru ditambahkan dengan membuat class/implementasi baru, bukan mengedit yang lama
  • โ€บDicapai lewat abstraksi: interface atau protocol yang menjadi sandaran kode yang ada
  • โ€บKode lama yang sudah dites tetap utuh dan stabil
  • โ€บSering diwujudkan lewat Strategy pattern, polimorfisme, atau arsitektur plugin

Kapan Digunakan

โœ“Sistem yang sering butuh varian baru (metode pembayaran, exporter file, aturan diskon)
โœ“Menghindari rantai if/else atau switch panjang yang terus bertambah setiap ada tipe baru
โœ“Merancang arsitektur berbasis plugin

Contoh di Dunia Nyata

๐ŸŽ
iOS

Menambahkan subclass UIView baru tanpa mengubah UIKit itu sendiri

๐Ÿค–
Android

Menambahkan implementasi PaymentMethod baru tanpa menyentuh alur checkout

๐ŸŒ
Web

Menambahkan format ekspor baru dengan mengimplementasikan interface Exporter

Contoh Kode

Swift
protocol DiscountStrategy {
    func apply(to price: Double) -> Double
}

struct NoDiscount: DiscountStrategy {
    func apply(to price: Double) -> Double { price }
}

struct PercentageDiscount: DiscountStrategy {
    let percent: Double
    func apply(to price: Double) -> Double { price * (1 - percent / 100) }
}

// New discount types are added without modifying PriceCalculator
struct PriceCalculator {
    let strategy: DiscountStrategy
    func finalPrice(for price: Double) -> Double {
        strategy.apply(to: price)
    }
}

let calculator = PriceCalculator(strategy: PercentageDiscount(percent: 20))
print(calculator.finalPrice(for: 100))  // 80.0