← 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)")
    }
}