โ 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" }
}