Apakah pengembangan berbasis tes memaksa saya untuk mengikuti SOLID?

15

Saya mendengar banyak dari praktisi TDD bahwa salah satu keuntungan TDD adalah memaksa pengembang untuk mengikuti prinsip-prinsip SOLID (Tanggung jawab tunggal, Open-closed, substitusi Liskov, segregasi Antarmuka, dan inversi Ketergantungan). Tetapi bagi saya itu cukup dengan hanya menulis beberapa tes (terutama tes unit) untuk memahami adalah penting untuk mengikuti SOLID (dan dengan demikian membuat arsitektur yang dapat diuji).

Apakah TDD memaksa pengembang untuk mengikuti SOLID lebih aktif daripada hanya menulis tes unit?

SiberianGuy
sumber
1
TDD terutama tentang memaksa pengembang untuk menulis tes. Jadi jika Anda mengatakan penulisan unit test membuat Anda menulis kode SOLID, saya kira itu mengatakan bahwa TDD memaksa Anda untuk menulis kode SOLID. Ini hanya berdasarkan pada apa yang Anda katakan, dan tidak secara akurat mencerminkan pendapat saya, yang dapat Anda lihat dalam jawaban saya.
Yam Marcovic
1
Yam: Saya tidak setuju, TDD bukan tentang penulisan tes unit. TDD adalah tentang mencapai solusi minimal yang kompleks dan benar untuk masalah yang dihadapi. Tes hanyalah produk sampingan dari prosedur
Amit Wadhwa
TDD menurut definisi adalah tentang penulisan tes sebelum kode. Secara teoritis Anda dapat membuat solusi minimal yang rumit dan benar bahkan tanpa tes. Tes hanya memberi Anda umpan balik instan dan kesadaran regresi. Karena masih mungkin untuk membuat solusi over-kompleks dengan pengujian, TDD bukan tentang menciptakan solusi minimal kompleks per se. Ini kebalikan dari apa yang Anda katakan. Solusi elegan adalah produk sampingan dari prosedur, bukan sebaliknya.
Yam Marcovic

Jawaban:

24

Pertama-tama, TDD tidak memaksa Anda untuk menulis kode SOLID. Anda dapat melakukan TDD dan membuat satu kekacauan besar jika Anda mau.

Tentu saja, mengetahui prinsip-prinsip SOLID membantu, karena jika tidak, Anda mungkin berakhir tidak memiliki jawaban yang baik untuk banyak masalah Anda, dan karenanya menulis kode yang buruk disertai dengan tes yang buruk.

Jika Anda sudah tahu tentang prinsip-prinsip SOLID, TDD akan mendorong Anda untuk memikirkannya dan menggunakannya secara aktif.

Yang mengatakan, itu tidak harus mencakup semua huruf dalam SOLID , tetapi sangat mendorong dan mempromosikan Anda untuk menulis setidaknya sebagian kode SOLID, karena itu membuat konsekuensi dari tidak melakukannya segera terlihat dan mengganggu.

Sebagai contoh:

  1. Anda harus menulis kode yang dipisahkan sehingga Anda dapat mengejek apa yang Anda butuhkan. Ini mendukung Prinsip Ketergantungan Inversi .
  2. Anda perlu menulis tes yang jelas dan singkat sehingga Anda tidak perlu mengubah terlalu banyak dalam tes (yang dapat menjadi sumber kebisingan kode yang besar jika dilakukan sebaliknya). Ini mendukung Prinsip Tanggung Jawab Tunggal .
  3. Ini mungkin diperdebatkan, tetapi Prinsip Segregasi Antarmuka memungkinkan kelas untuk bergantung pada antarmuka yang lebih ringan yang membuat ejekan lebih mudah diikuti dan dipahami, karena Anda tidak perlu bertanya "Mengapa 5 metode ini tidak diejek juga?", Atau bahkan yang lebih penting, Anda tidak punya banyak pilihan ketika memutuskan metode mana yang harus diejek. Ini bagus ketika Anda tidak benar-benar ingin membahas seluruh kode kelas sebelum Anda mengujinya, dan gunakan saja trial and error untuk mendapatkan pemahaman dasar tentang cara kerjanya.

Mematuhi prinsip Terbuka / Tertutup mungkin membantu tes yang ditulis setelah kode, karena biasanya memungkinkan Anda untuk mengesampingkan panggilan layanan eksternal di kelas uji yang berasal dari kelas yang diuji. Dalam TDD saya percaya ini tidak diperlukan seperti prinsip lain, tapi saya mungkin salah.

Mengikuti aturan substitusi Liskov sangat bagus jika Anda ingin meminimalkan perubahan untuk kelas Anda untuk menerima contoh yang tidak didukung yang kebetulan menerapkan antarmuka yang diketik secara statis yang sama, tetapi kemungkinan tidak akan terjadi dalam kasus uji yang tepat karena Anda umumnya tidak akan lulus dari setiap kelas-menguji implementasi dunia nyata dari dependensinya.

Yang paling penting, prinsip-prinsip SOLID dibuat untuk mendorong Anda untuk menulis kode yang lebih bersih, lebih mudah dipahami dan dipelihara, dan begitu juga TDD. Jadi, jika Anda melakukan TDD dengan benar, dan Anda memperhatikan bagaimana kode dan pengujian Anda terlihat (dan itu tidak terlalu sulit karena Anda mendapatkan umpan balik langsung, API, dan bijak kebenarannya), Anda dapat lebih sedikit khawatir tentang prinsip SOLID, secara umum.

Yam Marcovic
sumber
Juga kecuali Anda mengikuti Open / closed dan substitusi Liskov, ejekan Anda akan pecah nanti. Jadi, bahkan jika TDD mungkin tidak membantu Anda menegakkan OCP dan LSP tes yang dibuat akan memberi tahu Anda ketika Anda mematahkannya. Lebih banyak efek pengujian secara umum, tetapi masih layak disebut.
Jonas Schubert Erlandsson
9

Tidak

TDD dapat membuatnya lebih mudah untuk mengikuti praktik yang baik karena refactoring berkelanjutan, tetapi itu tidak memaksa Anda mengikuti prinsip apa pun. Yang dilakukan adalah memastikan kode yang Anda tulis diuji. Anda dapat mengikuti prinsip apa pun yang Anda suka saat menulis kode untuk memenuhi ujian; atau tidak ada prinsip sama sekali.

dietbuddha
sumber
2

Pemahaman saya tentang Prinsip SOLID diperluas oleh urutan besarnya ketika saya mulai melakukan TDD. Segera setelah saya mulai berpikir tentang bagaimana mengolok-olok dependensi saya menyadari hampir setiap komponen dalam basis kode memiliki implementasi alternatif yang potensial. Dan seberapa mudah untuk menguji API publik sederhana.

Ini juga memberikan pemahaman yang lebih kuat tentang sebagian besar pola desain. Terutama Pola Strategi.

Heath Lilley
sumber