Secara sederhana Interface Segregation Principle (ISP), prinsip yang melarang God Object, yaitu satu interface global yang berisi semua method.
Pendekatan yang disarankan adalah memisahkan interface global tersebut menjadi interface-interface yang lebih spesifik dengan tujuannya masing-masing.
Berikut contoh skenario, dimana kita berusaha membuat satu interface untuk semua.
Misal, kita akan membuat object printer dengan Interface Machine yang memiliki fungsional print, fax dan scan.
Pendekatan diatas tidak masalah, jika memang semua printer adalah printer modern yang dapat melakukan ketiga fungsi tersebut. Namun akan menjadi masalah, misalnya ternyata kita perlu mengimplementasikan juga untuk printer Jadul yang hanya memiliki fungsi print saja.
package main type Document struct { } type Machine interface { Print(d Document) Fax(d Document) Scan(d Document) } // ok if you need a multifunction device type MultiFunctionPrinter struct { // ... } func (m MultiFunctionPrinter) Print(d Document) { } func (m MultiFunctionPrinter) Fax(d Document) { } func (m MultiFunctionPrinter) Scan(d Document) { } type OldFashionedPrinter struct { // ... } func (o OldFashionedPrinter) Print(d Document) { // ok } func (o OldFashionedPrinter) Fax(d Document) { panic("operation not supported") } func (o OldFashionedPrinter) Scan(d Document) { panic("operation not supported") } func main() { }
Akan lebih tepat jika dilakukan pemisahan interface seperti pada contoh code dibawah.
package main type Document struct { } type Machine interface { Print(d Document) Fax(d Document) Scan(d Document) } type Printer interface { Print(d Document) } type Scanner interface { Scan(d Document) } // printer only type MyPrinter struct { // ... } func (m MyPrinter) Print(d Document) { // ... } // combine interfaces type Photocopier struct{} func (p Photocopier) Scan(d Document) { // } func (p Photocopier) Print(d Document) { // } type MultiFunctionDevice interface { Printer Scanner } // interface combination + decorator type MultiFunctionMachine struct { printer Printer scanner Scanner } func (m MultiFunctionMachine) Print(d Document) { m.printer.Print(d) } func (m MultiFunctionMachine) Scan(d Document) { m.scanner.Scan(d) } func main() { }
Pada code diatas diperkenalkan decorator pattern, yang akan dibahas lebih mendalam pada modul terpisah.
Jadi ide dari ISP adalah, jangan paksakan object turunan untuk mengimplementasikan interface yang tidak terdapat pada object tersebut.