Design By Contract (DbC)

Mengenal Design by Contract (DbC)

    Pada salah satu segment di Bab IV 'Pragmatic Paranoia' terdapat sub bab Design by Contract (DbC). Konsep ini menarik bagi saya yang seringkali ingin melakukan tindakan strict/tegas  terhadap suatu aturan jalannya program. Pada tulisan ini saya mencoba menjelaskan apa itu design by contract dan memberikan contohnya menggunakan bahasa pemrograman Java dan Python3. Perlu diingat bahwa design by contract sendiri lebih jelas tereksplisit menggunakan bahasa pemrograman Eifel, tetapi saya tidak menggunakannya karena masa trial Eifel IDE saya habis. 

design by contract

    Design by Contract (DbC) merupakan metode yang simpel tapi sangat powerfull. DbC berfokus pada dokumentasi hak dan kewajiban modul-modul dalam program dalam hal memastikan program berjalan dengan sesuai dan benar. Contract menjelaskan apa saja kebutuhan secara eksplisit dibandingkan implisit, semisalnya kebutuhan nilai tidak boleh kurang dari 0 dsbnya.

Komponen Design by Contract (DbC)

    Konsep DbC menekankan bahwa setiap fungsi atau method pada sebuah program sebelum melakukan prosess utama dari fungsi atau metode tersebut, hendaknya melakukan suatu hal (something) terlebih dahulu. Betrand Meyer pada bahasa pemrograman Eiffel menjabarkan komponen dalam penyusun DBC sebagai berikut:

Preconditions

Preconditions merupakan apa saja yang harus terpenuhi sebelum fungsi / method melakukan tugasnya atau simpelnya bisa diartikan requirements pada istilah kita yang sering gunakan. Ketika ada salah satu atau seluruh pada komponen ini yang tidak terpenuhi maka fungsi / method itu tidak dilanjutkan. komponen ini bertanggungjawab untuk memastikan bahwa data yang akan diproses itu sudah benar. Ketika komponen ini tidak terpenuhi simpelnya kita bisa mengatakan bahwa client / pengirim data terdapat masalah / bug pada programnya.

Postconditions

Komponen ini bertugas untuk memberikan kepastian / guaranted apa yang akan dihasilkan oleh suatu fungsi / method ketika selesai proses. Karena hal tersebut seharusnya  loop tak terhingga (infinite loop) tidak boleh dilakukan pada fungsi / method yang menggunakan konsep DbC. Ketika kondisi ini tidak terpenuhi maka pada fungsi / method yang dibuat terdapat masalah / bug didalamnya.

Class invariants

Komponen ini memastikan apa saja yang tidak boleh dilanggar sebelum dan setelah proses selesai dilakukan. Komponen ini memastikan kestabilan dan konsistensi dari sebuah program.

Kelebihan dan Kekurangan Menggunakan 

Tidak ada sistem yang sempurna begitu pula dengan konsep DbC ini. Jika kita menyadari ada beberapa yang menurut kita sangat aneh dan mungkin kedepannya bisa menjadi terlalu boiler-plate. Menurut beberapa sumber berikut kelebihan dan kekurangan dari konsep DbC ini:

Kelebihan

1. Deteksi issue secara dini

Adanya komponen-komponen pada DbC utamanya komponen pre-conditions mampu mendeteksi issue-issue yang akan muncul karena adanya kesalahan parameter saat dikirim ke dalam sistem. 

2. Meningkatkan dokumentasi dari kode

Adanya komponen pada DbC secara tidak langsung memperjalas apa saja yang menjadi batasan, kontrak, informasi hasil, dan kebutuhan pada sistem yang dibuat. Mempermudah juga ketika program akan berkomunikasi (dijadikan API) ke sistem / program lain.

3. Mempermudah kode dibaca secara sudut pandang manusia

Bagi programmer yang terbiasa membaca kode secara runut adanya komponen semisal preconditions mampu mempermudah pemahaman bagaimana kode membutuhkan apa. Postcondition juga mempermudah kita mengetahui seperti apa output yang akan dihasilkan. Begitu pula invariants bisa memberi pemahaman apa saja yang seharusnya sistem jaga ketika suatu fungsi / metode dipanggil.

Kekurangan

1. Runtime overhead

Melakukan cek pada setiap komponen DbC ketika program berjalan akan mempengaruhi performance jauh lebih lambat, apalagi ketika fungsi / method itu dalam keadaan load yang tinggi. Walaupun demikian, dimasa sekarang banyak cara untuk mengatasi masalah ini.

2. Effort lebih ketika development

Membuat dan maintenance program yang menggunakan DbC bisa menambah effort yang signifikan ketika masa pengembangan software. Termasuk mengecheck komponen-komponen yang dibuat untuk DbC sesuai atau tidaknya.

Contoh Program

Contoh bahasa pemrograman yang menggunakan design by contract diantarnya adalah bahasa pemrograman Eifel. Sayangnya IDE Eifel hanya mempunyai masa trial 14 hari ketika saya menulis artikel ini dan belum sempat untuk mencobanya. Oleh karena itu saya mencoba menggunakan bahasa pemrograman Java dan Python dengan memanfaatkan Exception.

Contoh DbC menggunakan bahasa pemrograman Java

Contoh DbC menggunakan bahasa pemrograman Python 

Kurang lebih seperti itu untuk contoh pengaplikasiannya. Dalam beberapa contoh ada yang menggunakan library pihak ke-3 seperti iContract, JML, dsbnya. Tidak menutup kemungkinan contoh yang saya buat kurang tepat karena menggunakan exception dibandingkan assertion.

Kesimpulan 

DbC mampu meningkatkan readibility dan mencegah issue secara dini. Butuh usaha lebih untuk membuat program mengikuti DbC karena adanya komponen-komponen tambahan yang harus dibuat. 

Sumber:

- https://wiki.c2.com/?DesignByContract diakses 25-Desember-2023

- Hunt Andrew, Thomas David. The pragmatic programmer

- https://objectcomputing.com/resources/publications/sett/september-2011-design-by-contract-in-java-with-google di akses 24-Desember-2023

Apabila ada kesalahan dalam penulisan ini mohon diberitahu agar bisa saya perbaiki. Semoga bermanfaat.


Posting Komentar untuk "Design By Contract (DbC)"