Dalam artikel tentang penguatan Standard Library, kita telah melihat bahwa banyak persyaratan library dinyatakan sebagai "kontrak". Postingan ini membahas kontrak di C++26 dan bagaimana kontrak dapat diterapkan pada kode kita sendiri.
Pembahasan dimulai dengan contoh sederhana: sebuah fungsi yang mengembalikan nilai dari std::vector pada indeks tertentu. Secara tradisional, persyaratan bahwa indeks valid ditegakkan dengan assert di dalam badan fungsi. Pendekatan ini memiliki kelemahan. Persyaratan berada di implementasi, sehingga seseorang yang hanya membaca deklarasi melihat sebuah vector dan indeks tanpa hubungan di antara keduanya. Assertion juga hanya dikendalikan oleh NDEBUG, yang menghapus pemeriksaan sepenuhnya ketika didefinisikan.
Kontrak C++26, yang diperkenalkan melalui P2900, memindahkan persyaratan ke dalam signature fungsi dengan klausa pre(...) yang ditempatkan setelah daftar parameter. Prakondisi ini menyatakan kondisi yang diharapkan berlaku saat masuk ke fungsi. Persyaratan yang sama juga dapat muncul pada deklarasi, sehingga terlihat oleh siapa pun yang membaca API. Kontrak menawarkan beberapa semantik evaluasi, termasuk mengabaikan pemeriksaan, melaporkan pelanggaran lalu melanjutkan, atau menghentikan program, dengan implementasi compiler yang menentukan opsi mana yang tersedia dan bagaimana cara memilihnya.
Kontrak juga membedakan antara apa yang harus disediakan pemanggil dan apa yang dijanjikan fungsi untuk dikembalikan. Pascakondisi, yang diperkenalkan dengan post, menyatakan janji-janji tersebut tanpa memerlukan pemeriksaan manual sebelum setiap pernyataan return. Hal ini membuat kontrak berguna untuk mendokumentasikan API bahkan ketika pemeriksaan saat runtime dinonaktifkan.
Artikel ini diakhiri dengan contoh prakondisi yang lengkap dan membahas topik lanjutan seperti pascakondisi, penempatan kontrak pada deklarasi dan definisi, opsi compiler, serta detail yang dapat mengejutkan pengembang.
Sumber: Hacker News · Diringkas oleh HeadlinesBriefing