Single Responsibility Principle (SRP) merupakan prinsip SOLID yang menyatakan bahwa sebuah kelas harus hanya memiliki satu tanggung jawab yang spesifik. Jika sebuah kelas memiliki lebih dari satu tanggung jawab dapat memengaruhi tanggung jawab yang lainnya maka dapat meningkatkan risiko bug.
Analoginya untuk studi kasus mengelola sebuah resto akan ada banyak pekerjaan yang harus dilakukan seperti memasak makanan, melayani pengunjung yang datang dan membersihkan meja tamu. jika hanya ada satu petugas yang bertanggung jawab atas seluruh tugas, kemungkinan besar akan kewalahan dalam mengelola resto tersebut. jika tiba tiba ada masalah di dapur maka pengunjung akan menunggu lebih lama untuk mendapatkan pelayanan. disisi lain jika banyak pengunjung yang datang di waktu yang bersamaan maka petugas tersebut mungkin tidak sempat untuk membersihkan ruangan. itu lah mengapa di restoran yang baik, seharusnya memiliki beberapa petugas seperti koki yang fokus untuk memasak hidangan, pelayan yang hanya fokus melayani pengunjung yang datang dan cleaning service yang bertugas untuk membersihkan seluruh ruangan.
Dalam konteks SRP, setiap kelas harus fokus pada tanggung jawab yang spesifik. Jika ada masalah di sebagian kode, seharusnya tidak akan memengaruhi kode yang lain. dengan menerapkan SRP ini maka code akan lebih mudah dikelola dan dipelihara.
mari kita lihat contoh kode tanpa menerapkan single responsibility principle berikut.
type UserService struct {
}
func (us *UserService) CreateUser() {
fmt.Println("create user")
}
func (us *UserService) SendEmail() {
fmt.Println("send email")
}
Pada contoh diatas UserService melanggar konsep SRP karena memiliki 2 tanggung jawab yaitu membuat user dan mengirim email. jika ada perubahan pada cara mengirim email maka kita perlu mengubah UserService padahal seharusnya UserService hanya bertanggung jawab untuk mengelola user saja.
untuk menerapkan konsep SRP maka kita perlu memisahkan tanggung jawab mengelola user dan tanggung jawab mengirim email.
type UserService struct {
}
func (us *UserService) CreateUser() {
fmt.Println("create user")
}
type EmailService struct {
}
func (us *EmailService) SendEmail() {
fmt.Println("send email")
}
Sekarang, UserService hanya memiliki tanggung jawab untuk mengelola user dan EmailService memiliki tanggung jawab untuk pengiriman email.
Beberapa dampak positif dari penerapan SRP:
- Ketika sebuah class/struct dirancang dengan tanggung jawab yang jelas, kita akan lebih mudah memahami fungsi dan tujuan dari class/struct tersebut.
- Dengan memisahkan tanggung jawab pengiriman email ke dalam
EmailService, perubahan pada cara atau logika pengiriman email tidak akan memengaruhiUserService. - Karena
EmailServicememiliki tugas yang lebih spesifik, class/struct tersebut dapat digunakan kembali di bagian lain yang membutuhkan fungsi pengiriman email.
Top comments (0)