SOLID: Single Responsibility Principle

Single Responsibility Principle (SRP), adalah sebuah type (class, structure) hanya boleh memiliki satu responsibility.

Agar mudah, langsung kita gunakan contoh, sebuah struct Journal. Responsibility yang terubung dengan struct tersebut harus berupa menyimpan data. Dan method yang terhubung pun harus berhubungan dengan struct tersebut, misalnya untuk menambahkan data, membuang data atau manipulasi lainnya.

Misalnya, Anda ingin meimplementasikan data persistence. Maka function atau method untuk melakukan data persistence (save file) harus dipisahkan, karena sudah berbeda responsibility-nya.

Pemisahan responsibility ini dapat mencegah penulisan fungsi yang berulang, karena dapat digunakan oleh type lainnya.

package main

import (
	"fmt"
	"io/ioutil"
	"strings"
)

var entryCount = 0

type Journal struct {
	entries []string
}

func (j *Journal) String() string {
	return strings.Join(j.entries, "\n")
}

func (j *Journal) AddEntry(txt string) int {
	entryCount++
	entry := fmt.Sprintf("%d, %s", entryCount, txt)
	j.entries = append(j.entries, entry)
	return entryCount
}

func (j *Journal) DelEntry(idx int) {
	// implementation goes here
}

//method dibawah melanggar SRP
func (j *Journal) Save(filename string) {
	_ = ioutil.WriteFile(filename, []byte(j.String()), 0664)
}

//SRP pendekatan 1
//contoh, diperlukan setup lineseparator untuk menyimpan data
//function dibawah sudah berbeda responsibility dengan struct Journal
var LineSeparator = "\n"

func SaveToFile(j *Journal, filename string) {
	_ = ioutil.WriteFile(filename, []byte(strings.Join(j.entries, LineSeparator)), 0664)
}

//SRP pendekatan 2
type Persistence struct {
	lineSeparator string
}

func (p *Persistence) SaveToFile(j *Journal, filename string) {
	_ = ioutil.WriteFile(filename, []byte(strings.Join(j.entries, p.lineSeparator)), 0664)
}

func main() {
	j := Journal{}
	j.AddEntry("Test 1")
	j.AddEntry("Test 2")

	fmt.Println(j.String())

	//melanggar pattern SRP
	j.Save("journal0.txt")

	//persistence 1
	SaveToFile(&j, "journal1.txt")

	//persistence 2
	p := Persistence{"\r\n"}
	p.SaveToFile(&j, "journal2.txt")

}
Sharing is caring:

Leave a Comment