โ 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