Prinsip Single Responsibility


Prinsip kedua dari SOLID yang dianut dalam perancangan berbasis objek adalah Single Responsibility. Sesuai dengan namanya maka prinsip ini memegang pemahaman sebagai berikut (seperti tertulis di wikipedia): “every class should have a single responsibility, and that responsibility should be entirely encapsulated by the class.” Pada halaman wikipedia tersebut juga disebutkan sebuah gambaran contoh bagaimana prinsip ini harus diterapkan.

Salah satu hal yang ingin ditekankan dengan prinsip ini adalah agar rancangan yang dihasilkan tetap dapat memberikan faktor kohesi yang tinggi. Kohesi dalam perangkat lunak merujuk pada pemahaman tentang seberapa dekat hubungan ketergantungan antara method (fungsi) dan atribut dalam sebuah class.  Sebuah class akan memiliki kohesi tinggi jika menggunakan method-method dan variabel level class secara utuh untuk menyelesaikan suatu pekerjaan tertentu. Sebaliknya sebuah class dinilai memiliki kohesi yang rendah jika memiliki method-method yang disisipkan secara acak dan digunakan untuk memenuhi berbagai macam pekerjaan.

Boleh dikatakan bahwa prinsip Single Responsibility ini mutlak harus diwujudkan dalam perancangan suatu class. Saya mencoba memberikan contoh sebuah class yang melanggar prinsip ini, dimana secara tidak langsung akan memiliki kohesi yang rendah.

package com.wordpress.budsus.nonsingle;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Halaman {
	private StringBuffer isi;
	private int nohal;

	public Halaman(int nohal, StringBuffer isi) {
		this.isi = isi;
		this.nohal = nohal;
	}

	public int getNohal() {
		return nohal;
	}

	public StringBuffer getIsi() {
		return isi;
	}

	public void saveHal(File file) throws FileNotFoundException {
		PrintWriter pr = new PrintWriter(file);
		pr.println(isi.toString());
		pr.close();
	}
}

Dari deklarasi class Halaman tersebut, seharusnya memiliki satu jenis tanggung jawab, yaitu untuk menyatakan tentang objek sebuah halaman buku. Sedangkan jika kita lihat method saveHal() sebenarnya bukan merupakan tanggung jawab murni dari sebuah objek Halaman, karena fungsi tersebut menyediakan fungsi untuk menyimpan sebuah String ke dalam sebuah File. Untuk itu, agar class Halaman tersebut memenuhi prinsip Single Responsibility, maka sebaiknya dibuatkan sebuah class yang berfungsi untuk penyimpanan sebuah string ke file. Berikut adalah contoh modifikasi dari class Halaman tersebut.

Halaman.java

package com.wordpress.budsus.nonsingle;

public class Halaman {
	private StringBuffer isi;
	private int nohal;

	public Halaman(int nohal, StringBuffer isi) {
		this.isi = isi;
		this.nohal = nohal;
	}

	public int getNohal() {
		return nohal;
	}

	public StringBuffer getIsi() {
		return isi;
	}

}

FileOperation.java

package com.wordpress.budsus.nonsingle;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class FileOperation {

	public void saveHal(File file, StringBuffer isi) throws FileNotFoundException {
		PrintWriter pr = new PrintWriter(file);
		pr.println(isi.toString());
		pr.close();
	}

}

Sedangkan untuk unit classnya adalah sebagai berikut :

import static org.junit.Assert.*;

import java.io.File;
import java.io.FileNotFoundException;

import org.junit.Before;
import org.junit.Test;

import com.wordpress.budsus.nonsingle.FileOperation;
import com.wordpress.budsus.nonsingle.Halaman;

public class HalamanTest {
	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void test() throws FileNotFoundException {
		StringBuffer str = new StringBuffer();
		str.append("Ini adalah halaman pengantar yang berisi penjelasan");
		str.append("tentang latar belakang mengapa buku ini ditulis.");
		Halaman hal = new Halaman(2, str);

		FileOperation fo = new FileOperation();

		File f = new File("/Users/budisusanto/hal.txt");
		fo.saveHal(f, hal.getIsi());

		assertTrue("File teks telah terbentuk!", f.exists());
	}
}

Jika ada masukan terhadap contoh dari saya, dengan senang hati kita dapat berdiskusi melalui komentar terhadap artikel saya ini.

3 thoughts on “Prinsip Single Responsibility

  1. *angkat tangan* tanya pak. dengan demikian jika kita mengikuti prinsip ini maka dalam aplikasi kita akan banyak class2 yang memiliki tanggungjawabnya masing2, apakah dimungkinkan adanya toleransi seberapa jauh prinsip ini diterapkan, jika kita bicara soal keterbatasan resource dan keterbatasan yang lain.
    sebagai contoh, dengan kondisi contoh yang bapak berikan memakan media penyimpanan sebanyak(dicompile dengan java version 1.6.0_45):
    Halaman.class > 828 bytes

    Halaman.class > 494 bytes
    FileOperation.class > 604 bytes

    kalau dijumlah maka akan lebih efisien hanya dengan satu class saja tetapi dengan kondisi bawah menyalahi prinsip OOP. bagaimana pak?

    • Halo Daniel, bagaimana khabar? waduh saya juga belum sempat buat daftar isinya… Terkait dengan ukuran file, menurut saya tidak menjadi masalah besar jika dibanding dengan effort untuk maintenance source code aplikasi nantinya… sehingga akan lebih baik jika menerapkan konsep perancangan OO yang baik agar terasa manfaatnya diwaktu kemudian….

      • Kabar baik pak, ditunggu daftar isinya sembari saya belajar huga…hehe

        Oow begitu ya pak, memang sih kalau kita tinjau dari sisi maintenance source code pasti akan sangat memudahkan dengan prinsip ini ya…..🙂

Komentar ditutup.