Proyek akhir jalur ini dimulai dari satu keputusan, yaitu memilih proyek yang akan dikerjakan. Dua kandidat tersedia, yakni pengendali lift dan sistem interlocking lampu lalu lintas. Topik ini membandingkan kedua kandidat pada empat dimensi, memilih satu kandidat dengan alasan teknis, menetapkan lingkup minimum proyek terpilih, dan membuktikan aturan inti kandidat tersebut dengan kerangka kecil yang dikompilasi nyata.
Dua kandidat proyek#
Kandidat pertama adalah pengendali lift untuk satu unit lift pada bangunan dengan beberapa lantai. Lingkupnya mencakup antrean permintaan lantai, keputusan arah gerak, penggerakan antarlantai, dan siklus pintu yang membuka serta menutup dalam waktu tetap. Bagian konkuren kandidat ini berupa task penggerak, task pintu, dan objek terlindungi untuk antrean permintaan. Kontrak domainnya melarang gerak ketika pintu terbuka dan melarang satu permintaan lantai tersimpan dua kali dalam antrean. Semakin banyak lantai yang dilayani, semakin banyak pula state dan task pada kandidat ini.
Kandidat kedua adalah sistem interlocking lampu lalu lintas untuk satu persimpangan dua arah, yaitu pasangan utara-selatan dan pasangan barat-timur. Istilah interlocking menunjuk aturan yang melarang kombinasi lampu yang tidak aman, yakni dua pasang arah tidak boleh hijau bersamaan dan setiap perpindahan hijau wajib melewati kuning. Lingkup kandidat ini berupa siklus empat fase dengan durasi tetap, satu task pengendali, dan satu objek terlindungi untuk fase berjalan. Kontrak domainnya berupa tabel transisi empat perpindahan sah beserta rentang durasi setiap jenis fase. Ruang state kandidat ini tidak tumbuh seiring waktu karena siklusnya tertutup dan jumlah fasenya tetap.
Perbandingan empat dimensi#
Kedua kandidat dibandingkan pada empat dimensi, yaitu lingkup state, bagian konkuren, bentuk kontrak domain, dan risiko utama. Keempatnya dipilih karena langsung menentukan bobot pengerjaan dan risiko melebarnya lingkup proyek. Tabel berikut merangkum hasil perbandingannya.
| Dimensi | Pengendali lift | Interlocking lampu lalu lintas |
|---|---|---|
| Lingkup state | antrean permintaan, arah, lantai berjalan, fase pintu | satu variabel fase dengan empat nilai |
| Bagian konkuren | minimal tiga unit, yaitu task penggerak, task pintu, dan antrean terlindungi | dua unit, yaitu satu task dan satu objek terlindungi |
| Kontrak domain | aturan antrean dan larangan gerak saat pintu terbuka | tabel transisi empat perpindahan dan rentang durasi fase |
| Risiko utama | lingkup membesar setiap kali fitur permintaan ditambah | kecil, karena ruang state tertutup dan siklus dapat diuji penuh |
Perbedaan paling menentukan berada pada ruang state. Ruang state lift tumbuh mengikuti jumlah lantai dan kebijakan antrean yang dipilih, sehingga daftar kontraknya ikut memanjang. Ruang state interlocking tertutup pada empat nilai fase, sehingga seluruh perpindahan yang sah dapat didaftar satu per satu dan sisanya otomatis terlarang. Kontrak yang pendek dan lengkap semacam itu dapat ditulis sebagai aspek Pre dan Post serta predikat subtipe, dan semuanya diperiksa saat run time dengan flag -gnata.
Dimensi risiko mengikuti dimensi state. Setiap fitur tambahan pada lift, misalnya pintu yang terbuka kembali ketika ada sensor, menambah state baru sekaligus aturan antar-task. Pada interlocking, fitur tambahan berupa permintaan penyeberang tetap menggunakan state yang sama, yaitu fase berjalan, sehingga kontrak lama tidak berubah. Proyek terpandu membutuhkan ruang state yang stabil sejak awal karena arsitektur digambar lebih dahulu sebelum perilaku lengkap diisi.
Keputusan dan lingkup minimum#
Kandidat yang dipilih adalah sistem interlocking lampu lalu lintas. Alasannya bersifat teknis dan terukur. Pertama, ruang state kandidat ini tertutup pada empat nilai, sehingga tabel transisinya dapat ditulis penuh dan diperiksa penuh. Kedua, kebutuhan konkurensinya tepat sebesar satu task dan satu objek terlindungi, tanpa antrean yang menuntut kebijakan pelayanan tersendiri. Ketiga, siklusnya deterministik, sehingga keluaran setiap pengujian selalu sama persis.
Lingkup minimum proyek terpilih ditetapkan sebagai berikut.
- siklus empat fase, yaitu hijau dan kuning utara-selatan, lalu hijau dan kuning barat-timur
- durasi tetap untuk setiap fase yang tercatat pada jadwal di dalam spesifikasi package domain
- satu task pengendali yang memutar fase melalui satu objek terlindungi
- kontrak domain berupa tabel transisi, rentang durasi, dan predikat jadwal
Hal-hal di luar daftar tersebut ditunda sampai lingkup minimum selesai, misalnya tombol penyeberang, mode pemeliharaan, dan persimpangan kedua.
Diagram transisi berikut menampilkan lingkup minimum tersebut. Keempat kotak adalah nilai fase, sedangkan panah adalah empat perpindahan yang sah menurut tabel transisi.
Sebelum keputusan dikunci, aturan inti kandidat terpilih diuji lebih dahulu dalam satu berkas. Kerangka uji berikut memutar satu siklus penuh dan memeriksa setiap perpindahan dengan assertion. Berkas ini sengaja sekali pakai karena arsitektur proyek sebenarnya disusun sebagai package tersendiri.
with Ada.Text_IO;
-- Uji cepat aturan inti kandidat interlocking: satu variabel fase dan
-- empat perpindahan yang sah. Kerangka sekali pakai ini dibongkar
-- setelah arsitektur proyek berdiri.
procedure Uji_Interlock is
type Fase is (Hijau_UTS, Kuning_UTS, Hijau_BRT, Kuning_BRT);
function Sah (Dari, Ke : Fase) return Boolean is
(case Dari is
when Hijau_UTS => Ke = Kuning_UTS,
when Kuning_UTS => Ke = Hijau_BRT,
when Hijau_BRT => Ke = Kuning_BRT,
when Kuning_BRT => Ke = Hijau_UTS);
function Penerus (Dari : Fase) return Fase is
(case Dari is
when Hijau_UTS => Kuning_UTS,
when Kuning_UTS => Hijau_BRT,
when Hijau_BRT => Kuning_BRT,
when Kuning_BRT => Hijau_UTS);
F : Fase := Hijau_UTS;
F_Berikut : Fase;
begin
for Urut in 1 .. 4 loop
F_Berikut := Penerus (F);
pragma Assert (Sah (F, F_Berikut));
Ada.Text_IO.Put_Line
(Fase'Image (F) & " -> " & Fase'Image (F_Berikut) & " sah");
F := F_Berikut;
end loop;
end Uji_Interlock;# kompilasi uji aturan inti dengan pemeriksaan kontrak aktif
gnatmake -q -gnata uji_interlock.adb
# jalankan uji aturan inti
./uji_interlockHIJAU_UTS -> KUNING_UTS sah
KUNING_UTS -> HIJAU_BRT sah
HIJAU_BRT -> KUNING_BRT sah
KUNING_BRT -> HIJAU_UTS sahEmpat perpindahan tercetak dengan tanda sah, dan assertion pada setiap langkah memastikan perpindahan itu sah menurut fungsi Sah. Apabila salah satu pemetaan pada fungsi Penerus ditulis keliru, assertion yang diaktifkan flag -gnata gagal dan program berhenti dengan pesan assertion. Bukti kecil ini menegaskan bahwa seluruh aturan inti proyek dapat diekspresikan sebagai kontrak pada tingkat bahasa, sehingga keputusan pemilihan memiliki dasar yang sudah teruji.
Kesalahan umum#
Empat kekeliruan berikut sering muncul ketika proyek akhir dipilih.
- Memilih kandidat berdasarkan banyaknya fitur. Kandidat yang kaya fitur terlihat menarik, tetapi lingkupnya melebar setiap minggu dan arsitekturnya sulit dikunci. Perbaikannya, bandingkan kandidat pada dimensi state, konkuren, kontrak, dan risiko sebagaimana tabel di atas.
- Menulis kode sebelum aturan domain ditulis. Tanpa tabel transisi tertulis, aturan interlocking tersebar di dalam badan task dan sulit diperiksa. Perbaikannya, tulis tabel transisi dan rentang durasi lebih dahulu, lalu tulis kode yang mematuhinya.
- Menetapkan lingkup tanpa daftar pengecualian. Lingkup yang hanya menyebut hal yang dikerjakan mudah diperluas karena batasnya tidak tertulis. Perbaikannya, catat pula hal yang ditunda, misalnya tombol penyeberang dan mode pemeliharaan.
- Mengunci keputusan tanpa bukti yang dapat dijalankan. Perbandingan yang hanya berisi penilaian naratif sulit dibela ketika lingkup mulai melebar di tengah pengerjaan. Perbaikannya, sertakan bukti kecil yang dapat dikompilasi, sebagaimana kerangka uji satu berkas pada bagian keputusan.
Ringkasan#
- Dua kandidat proyek dibandingkan pada dimensi lingkup state, bagian konkuren, kontrak domain, dan risiko.
- Kandidat interlocking lampu lalu lintas dipilih karena ruang state tertutup, kebutuhan konkurensinya kecil, dan siklusnya deterministik.
- Lingkup minimum proyek mencakup siklus empat fase, jadwal durasi tetap, satu task pengendali, satu objek terlindungi, dan kontrak domain lengkap.
Referensi#
- 9. Tasks and Synchronization — Ada Reference Manual 2022 — Menetapkan model task dan objek terlindungi yang menjadi dasar perbandingan bagian konkuren.
- Introduction to Ada: Contracts — AdaCore — Membahas aspek Pre dan Post yang digunakan untuk menuliskan kontrak domain.