Saya akan melalui seri ini . Penulis menyebutkan bahwa karena keadaan dipertahankan dalam pemrograman berorientasi objek, lebih sulit untuk menulis tes unit. Dia juga mengatakan bahwa karena pemrograman fungsional tidak mempertahankan keadaan (tidak selalu), lebih mudah untuk menulis tes unit. Saya tidak melihat contoh yang menunjukkan masalah ini. Jika ini benar, dapatkah Anda memberi saya contoh membandingkan pengujian unit dalam pemrograman berorientasi objek dan fungsional?
9
State
monad (yang mengemulasikan state). Anda memiliki sebagian titik - kode yang ditulis dengan gaya itu memang memiliki interaksi non-lokal - tetapi untuk keperluan pengujian unit Anda masih bisa secara eksplisit lulus dalam keadaan, Anda tidak perlu mengejek apa pun. Di sisi lain, dengan monad sukaST
danIO
(yang memiliki benar, negara bisa berubah implisit), Anda hanya sedang melakukan pemrograman stateful, dan unit pengujian itu akan ada lebih mudah daripada dalam bahasa lain.Jawaban:
Saya ingin membedakan antara dua cara yang berbeda dalam mendekati pemrograman berorientasi objek
Aturan praktisnya adalah bahwa objek yang diprogram dengan cara pertama akan memiliki lebih banyak metode dan lebih banyak
void
metode daripada cara kedua. Katakanlah kita akan menulis simulator penerbangan dan merancang kelas pesawat. Kami akan memiliki sesuatu seperti:Ini mungkin sedikit lebih ekstrem daripada yang mungkin ditemui, tetapi hal ini jelas. Jika Anda ingin mengimplementasikan antarmuka semacam ini, Anda harus tetap di dalam objek:
Menulis unit test untuk objek yang ditulis dalam mode ini sangat sulit karena:
Pada dasarnya Anda mulai dengan antarmuka yang terlihat masuk akal dan seperti itu cocok dengan domain dengan baik, tetapi kebaikan simulasi telah membuat Anda tertarik untuk membuat objek yang benar-benar sulit untuk diuji.
Namun, Anda dapat membuat objek yang akan memenuhi tujuan yang sama. Anda ingin rem
Plane
menjadi bit yang lebih kecil. MemilikiPlaneParticle
yang melacak bit fisik pesawat, posisi, kecepatan, akselerasi, roll, yaw, dll, dll, mengungkap dan memungkinkan seseorang untuk memanipulasi ini. Kemudian suatuPlaneParts
objek dapat melacak status. Anda akan mengirimtick()
ke tempat yang sama sekali berbeda, misalnya memilikiPlanePhysics
parameter objek oleh, misalnya, gaya gravitasi, yang tahu diberiPlaneParticle
danPlaneParts
bagaimana meludahkan yang baruPlaneParticle
. Semua ini bisa sepenuhnya berubah, meskipun tidak harus untuk beberapa contoh.Anda sekarang memiliki keunggulan ini dalam hal pengujian:
Inilah triknya: pendekatan berorientasi objek kedua yang saya jelaskan sangat dekat dengan pemrograman fungsional. Mungkin dalam program fungsional murni catatan Anda dan fungsi Anda terpisah dan tidak terikat bersama dalam objek, pasti program fungsional akan memastikan bahwa semua hal ini. Apa yang saya pikir benar-benar membuat unit testing mudah adalah
Pemrograman fungsional mendorong hal-hal ini (tetapi seseorang dapat menulis program yang buruk dalam paradigma apa pun) tetapi mereka dapat dicapai dalam program berorientasi objek. Dan saya akan lebih menekankan bahwa pemrograman fungsional dan pemrograman berorientasi objek tidak kompatibel.
sumber