โ† Kembali ke Konsep OOP
โœ‚๏ธ
Prinsip

Interface Segregation

Client tidak boleh dipaksa bergantung pada interface atau method yang tidak dipakainya; lebih baik banyak interface kecil yang fokus daripada satu interface besar serbaguna.

Masalahnya

Interface "gemuk" dengan banyak method yang tidak berkaitan memaksa setiap class yang mengimplementasikannya menyediakan (atau membuat stub) method yang tidak dibutuhkan. Hasilnya implementasi kosong atau yang melempar error, serta keterikatan erat antar client yang tidak berhubungan.

Cara Kerja

  • โ€บPecah interface besar menjadi interface kecil sesuai peran (misalnya Printable dan Scannable, bukan satu interface Machine)
  • โ€บClass hanya mengimplementasikan interface yang relevan dengan perilakunya
  • โ€บClient hanya bergantung pada method yang benar-benar dipanggilnya
  • โ€บMengurangi efek berantai: perubahan pada method yang tidak dipakai tidak lagi memaksa perubahan di class yang tidak berkaitan

Kapan Digunakan

โœ“Sebuah interface punya method yang hanya dibutuhkan sebagian implementer
โœ“Class yang mengimplementasikan melempar "not supported" untuk sebagian method interface
โœ“Merancang sistem plugin/kapabilitas (misalnya printer yang bisa mencetak tetapi tidak bisa memindai)

Contoh di Dunia Nyata

๐ŸŽ
iOS

Protocol terpisah seperti UITableViewDataSource dan UITableViewDelegate, bukan satu protocol raksasa

๐Ÿค–
Android

Interface listener terpisah seperti OnClickListener dan OnLongClickListener

๐ŸŒ
Web

Memecah interface Repository generik menjadi interface Readable dan Writable yang terpisah

Contoh Kode

Swift
// โŒ Fat interface forces SimplePrinter to implement scan()/fax() too
// protocol Machine { func print(); func scan(); func fax() }

// โœ… Segregated interfaces โ€” implement only what you support
protocol Printer {
    func print(_ document: String)
}

protocol Scanner {
    func scan() -> String
}

struct SimplePrinter: Printer {
    func print(_ document: String) {
        print("Printing: \(document)")
    }
}

struct AllInOnePrinter: Printer, Scanner {
    func print(_ document: String) { print("Printing: \(document)") }
    func scan() -> String { "Scanned document" }
}