Ya, SOLID adalah cara yang sangat baik untuk merancang kode yang dapat dengan mudah diuji. Sebagai primer pendek:
S - Prinsip Tanggung Jawab Tunggal: Suatu objek harus melakukan tepat satu hal, dan harus menjadi satu-satunya objek dalam basis kode yang melakukan satu hal itu. Misalnya, ambil kelas domain, ucapkan Faktur. Kelas Faktur harus mewakili struktur data dan aturan bisnis faktur seperti yang digunakan dalam sistem. Itu harus menjadi satu-satunya kelas yang mewakili faktur dalam basis kode. Ini dapat dipecah lebih lanjut untuk mengatakan bahwa suatu metode harus memiliki satu tujuan dan harus menjadi satu-satunya metode dalam basis kode yang memenuhi kebutuhan ini.
Dengan mengikuti prinsip ini, Anda meningkatkan testabilitas desain Anda dengan mengurangi jumlah tes yang harus Anda tulis yang menguji fungsionalitas yang sama pada objek yang berbeda, dan Anda juga biasanya berakhir dengan potongan-potongan kecil fungsionalitas yang lebih mudah untuk diuji secara terpisah.
O - Prinsip Terbuka / Tertutup: Kelas harus terbuka untuk ekstensi, tetapi tertutup untuk berubah . Setelah suatu objek ada dan bekerja dengan benar, idealnya tidak perlu kembali ke objek itu untuk membuat perubahan yang menambah fungsionalitas baru. Sebagai gantinya, objek harus diperluas, baik dengan menurunkannya atau dengan memasukkan implementasi dependensi baru atau berbeda ke dalamnya, untuk menyediakan fungsionalitas baru tersebut. Ini menghindari regresi; Anda dapat memperkenalkan fungsionalitas baru kapan dan di mana dibutuhkan, tanpa mengubah perilaku objek seperti yang sudah digunakan di tempat lain.
Dengan mematuhi prinsip ini, Anda biasanya meningkatkan kemampuan kode untuk mentolerir "ejekan", dan Anda juga menghindari keharusan menulis ulang tes untuk mengantisipasi perilaku baru; semua tes yang ada untuk objek masih harus bekerja pada implementasi yang tidak diperpanjang, sementara tes baru untuk fungsionalitas baru menggunakan implementasi yang diperluas juga harus bekerja.
Prinsip Substitusi L - Liskov: Kelas A, bergantung pada kelas B, harus dapat menggunakan X: B tanpa mengetahui perbedaannya. Ini pada dasarnya berarti bahwa apa pun yang Anda gunakan sebagai dependensi harus memiliki perilaku yang sama seperti yang terlihat oleh kelas dependen. Sebagai contoh singkat, katakan Anda memiliki antarmuka IWriter yang mengekspos Write (string), yang diimplementasikan oleh ConsoleWriter. Sekarang Anda harus menulis ke file, jadi Anda membuat FileWriter. Dalam melakukannya, Anda harus memastikan bahwa FileWriter dapat digunakan dengan cara yang sama seperti yang dilakukan ConsoleWriter (artinya satu-satunya cara dependen dapat berinteraksi dengannya adalah dengan memanggil Write (string)), dan dengan demikian informasi tambahan yang mungkin diperlukan FileWriter untuk melakukan itu pekerjaan (seperti jalur dan file untuk menulis) harus disediakan dari tempat lain selain tanggungan.
Ini sangat besar untuk menulis kode yang dapat diuji, karena desain yang sesuai dengan LSP dapat memiliki objek "diejek" diganti dengan benda nyata di setiap titik tanpa mengubah perilaku yang diharapkan, memungkinkan potongan kecil kode diuji dalam isolasi dengan keyakinan bahwa sistem kemudian akan bekerja dengan benda-benda nyata yang terhubung.
Prinsip Pemisahan Antarmuka I: Antarmuka harus memiliki metode sesedikit mungkin untuk menyediakan fungsionalitas peran yang ditentukan oleh antarmuka . Sederhananya, lebih banyak antarmuka yang lebih kecil lebih baik daripada lebih sedikit antarmuka yang lebih besar. Ini karena antarmuka yang besar memiliki lebih banyak alasan untuk berubah, dan menyebabkan lebih banyak perubahan di tempat lain dalam basis kode yang mungkin tidak diperlukan.
Ketaatan pada ISP meningkatkan testabilitas dengan mengurangi kompleksitas sistem yang diuji dan ketergantungan dari SUT tersebut. Jika objek yang Anda uji tergantung pada antarmuka IDoThreeThings yang mengekspos DoOne (), DoTwo () dan DoThree (), Anda harus mengejek objek yang mengimplementasikan ketiga metode bahkan jika objek hanya menggunakan metode DoTwo. Tetapi, jika objek hanya bergantung pada IDoTwo (yang hanya memperlihatkan DoTwo), Anda dapat lebih mudah mengejek objek yang memiliki satu metode itu.
D - Ketergantungan Prinsip Pembalikan: Konkret dan abstraksi tidak boleh bergantung pada konkret lain, tetapi pada abstraksi . Prinsip ini secara langsung menegakkan prinsip longgar kopling. Suatu objek seharusnya tidak perlu tahu apa objek itu; melainkan harus peduli apa objek TIDAK. Jadi, penggunaan antarmuka dan / atau kelas dasar abstrak selalu lebih disukai daripada penggunaan implementasi konkret ketika mendefinisikan properti dan parameter suatu objek atau metode. Itu memungkinkan Anda untuk menukar satu implementasi dengan yang lain tanpa harus mengubah penggunaan (jika Anda juga mengikuti LSP, yang sejalan dengan DIP).
Sekali lagi, ini sangat besar untuk testabilitas, karena memungkinkan Anda, sekali lagi, untuk menyuntikkan implementasi tiruan dari ketergantungan alih-alih implementasi "produksi" ke objek Anda yang sedang diuji, sementara masih menguji objek dalam bentuk persis seperti yang akan ia miliki saat ini. dalam produksi. Ini adalah kunci untuk pengujian unit "secara terpisah".