← Kembali ke Konsep OOP
1️⃣
Prinsip
Single Responsibility
Sebuah class seharusnya hanya punya satu alasan untuk berubah; lakukan satu hal dan lakukan dengan baik.
Masalahnya
Class yang menangani banyak tanggung jawab (misalnya business logic, persistence, dan formatting sekaligus) jadi rapuh: perubahan kecil pada satu tanggung jawab berisiko merusak yang lain, dan class itu terus menarik perubahan lain yang tidak berkaitan.
Cara Kerja
- ›Setiap class atau module membungkus satu fungsionalitas saja
- ›Tanggung jawab dipecah ke class terpisah, masing-masing dengan tujuan yang fokus
- ›Meningkatkan testability: class kecil dengan sedikit dependency lebih mudah dites secara terisolasi
- ›Patokan utamanya adalah "alasan untuk berubah", bukan "jumlah method"
Kapan Digunakan
✓Sebuah class mencampur akses data, aturan bisnis, dan logika tampilan
✓Refactoring "god class" yang sudah tumbuh mengerjakan segalanya
✓Merancang class baru: tanyakan "apa satu tugas class ini?"
Contoh di Dunia Nyata
🍎
iOS
Memisahkan networking (APIClient), persistence (Storage), dan presentation (ViewModel)
🤖
Android
Memecah Activity yang gemuk menjadi lapisan ViewModel, Repository, dan UI
🌐
Web
Memisahkan route handler, logika bisnis/service, dan lapisan akses data
Contoh Kode
Swift
// Each type has exactly one responsibility
struct Invoice {
let id: String
let amount: Double
}
struct InvoiceCalculator {
func total(for invoice: Invoice, taxRate: Double) -> Double {
invoice.amount * (1 + taxRate)
}
}
struct InvoicePrinter {
func format(_ invoice: Invoice) -> String {
"Invoice #\(invoice.id): $\(invoice.amount)"
}
}
struct InvoiceRepository {
func save(_ invoice: Invoice) {
// persist to database
print("Saved invoice \(invoice.id)")
}
}