Prinsip Tanggung Jawab Tunggal di Jawa

1. Ikhtisar

Dalam tutorial ini, kita akan membahas Prinsip Tanggung Jawab Tunggal, sebagai salah satu prinsip SOLID dari pemrograman berorientasi objek.

Secara keseluruhan, kita akan membahas secara mendalam tentang apa prinsip ini dan bagaimana menerapkannya saat merancang perangkat lunak kita. Selanjutnya, kami akan menjelaskan kapan prinsip ini bisa menyesatkan.

* SRP = Prinsip Tanggung Jawab Tunggal

2. Prinsip Tanggung Jawab Tunggal

Seperti namanya, asas ini menyatakan bahwa setiap kelas hendaknya memiliki satu tanggung jawab, satu tujuan tunggal . Ini berarti bahwa kelas hanya akan melakukan satu tugas, yang membuat kita menyimpulkan bahwa kelas hanya akan memiliki satu alasan untuk berubah .

Kami tidak ingin objek yang tahu terlalu banyak dan memiliki perilaku yang tidak terkait. Kelas-kelas ini lebih sulit dipertahankan. Misalnya, jika kita memiliki kelas yang banyak kita ubah, dan karena alasan yang berbeda, maka kelas ini harus dipecah menjadi lebih banyak kelas, masing-masing menangani satu perhatian. Tentunya jika terjadi kesalahan, akan lebih mudah untuk menemukannya.

Mari pertimbangkan kelas yang berisi kode yang mengubah teks dalam beberapa cara. Satu-satunya tugas kelas ini adalah memanipulasi teks .

public class TextManipulator { private String text; public TextManipulator(String text) { this.text = text; } public String getText() { return text; } public void appendText(String newText) { text = text.concat(newText); } public String findWordAndReplace(String word, String replacementWord) { if (text.contains(word)) { text = text.replace(word, replacementWord); } return text; } public String findWordAndDelete(String word) { if (text.contains(word)) { text = text.replace(word, ""); } return text; } public void printText() { System.out.println(textManipulator.getText()); } }

Meskipun ini mungkin tampak bagus, ini bukan contoh SRP yang baik. Di sini kami memiliki dua tanggung jawab : memanipulasi dan mencetak teks .

Memiliki metode yang mencetak teks di kelas ini melanggar Prinsip Tanggung Jawab Tunggal. Untuk tujuan ini, kita harus membuat kelas lain, yang hanya akan menangani teks pencetakan:

public class TextPrinter { TextManipulator textManipulator; public TextPrinter(TextManipulator textManipulator) { this.textManipulator = textManipulator; } public void printText() { System.out.println(textManipulator.getText()); } public void printOutEachWordOfText() { System.out.println(Arrays.toString(textManipulator.getText().split(" "))); } public void printRangeOfCharacters(int startingIndex, int endIndex) { System.out.println(textManipulator.getText().substring(startingIndex, endIndex)); } }

Sekarang, di kelas ini, kita dapat membuat metode untuk variasi teks pencetakan sebanyak yang kita inginkan, karena itulah tugasnya.

3. Bagaimana Prinsip Ini Bisa Menyesatkan?

Trik penerapan SRP di perangkat lunak kami adalah mengetahui tanggung jawab masing-masing kelas.

Namun, setiap pengembang memiliki visi mereka tentang tujuan kelas , yang membuat segalanya menjadi rumit. Karena kami tidak memiliki instruksi ketat tentang bagaimana menerapkan prinsip ini, kami ditinggalkan dengan interpretasi kami tentang apa tanggung jawabnya.

Artinya, terkadang hanya kita, sebagai desainer aplikasi kita, yang dapat memutuskan apakah ada sesuatu dalam ruang lingkup kelas atau tidak.

Saat menulis kelas berdasarkan prinsip SRP, kita harus memikirkan domain masalah, kebutuhan bisnis, dan arsitektur aplikasi. Ini sangat subjektif, yang membuat penerapan prinsip ini lebih sulit daripada yang terlihat. Ini tidak akan sesederhana contoh yang kita miliki di tutorial ini.

Ini membawa kita ke poin berikutnya.

4. Kohesi

Mengikuti prinsip SRP, kelas kami akan mematuhi satu fungsi. Metode dan data mereka akan berkaitan dengan satu tujuan yang jelas. Ini berarti kohesi tinggi, serta ketahanan, yang bersama-sama mengurangi kesalahan .

Saat merancang perangkat lunak berdasarkan prinsip SRP, keterpaduan sangat penting, karena membantu kita menemukan tanggung jawab tunggal untuk kelas kita. Konsep ini juga membantu kita menemukan kelas yang memiliki lebih dari satu tanggung jawab.

Mari kembali ke metode kelas TextManipulator kita :

... public void appendText(String newText) { text = text.concat(newText); } public String findWordAndReplace(String word, String replacementWord) { if (text.contains(word)) { text = text.replace(word, replacementWord); } return text; } public String findWordAndDelete(String word) { if (text.contains(word)) { text = text.replace(word, ""); } return text; } ...

Di sini, kami memiliki representasi yang jelas tentang apa yang dilakukan kelas ini: Manipulasi teks.

Tetapi, jika kita tidak memikirkan tentang kohesi dan kita tidak memiliki definisi yang jelas tentang apa tanggung jawab kelas ini, kita dapat mengatakan bahwa menulis dan memperbarui teks adalah dua pekerjaan yang berbeda dan terpisah. Dipimpin oleh pemikiran ini, kita dapat menyimpulkan daripada ini harus menjadi dua kelas yang terpisah: WriteText dan UpdateText .

Pada kenyataannya, kami akan mendapatkan dua kelas yang berpasangan erat dan kohesif secara longgar , yang hampir selalu harus digunakan bersama. Ketiga metode ini dapat melakukan operasi yang berbeda, tetapi pada dasarnya memiliki satu tujuan : Manipulasi teks. Kuncinya adalah jangan terlalu banyak berpikir.

Salah satu alat yang dapat membantu mencapai kohesi tinggi dalam metode adalah LCOM. Pada dasarnya, LCOM mengukur hubungan antara komponen kelas dan hubungannya satu sama lain.

Martin Hitz dan Behzad Montazeri memperkenalkan LCOM4, ​​yang diukur oleh Sonarqube untuk sementara waktu, tetapi tidak digunakan lagi.

5. Kesimpulan

Meskipun nama prinsip sudah cukup jelas, kita dapat melihat betapa mudahnya penerapan prinsip tersebut secara tidak benar. Pastikan untuk membedakan tanggung jawab setiap kelas saat mengembangkan proyek dan berikan perhatian ekstra pada kohesi.

Seperti biasa, kode tersedia di GitHub.