SOLID: Interface Segregation Principle

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.

Sharing is caring:

Leave a Comment