Topik ini menetapkan bahan proyek penutup jalur sebelum implementasi dimulai. Tiga kandidat layanan domain dibandingkan secara berdampingan, yaitu inventaris gudang, jadwal piket, dan arsip catatan. Satu kandidat dipilih sebagai proyek beserta alasannya, lingkup minimum layanannya ditetapkan, dan bentuk awal tipe layanan dibuat sebagai sketsa yang dapat dijalankan.
Tiga kandidat layanan domain#
Kandidat pertama adalah inventaris gudang yang mencatat barang, jumlah per lokasi rak, dan mutasi masuk keluar. Aturan domainnya berkisar pada angka, misalnya jumlah tidak boleh negatif dan pengurangan yang melebihi stok harus ditolak. Kekayaan aritmetika ini menarik, tetapi daftar mutasi yang terus bertambah menuntut keputusan penyimpanan yang berada di luar materi jalur.
Kandidat kedua adalah jadwal piket untuk satu pekan kerja. Datanya berupa daftar anggota tim beserta status lima hari kerja, dan setiap hari menampung satu petugas. Aturannya jelas berbentuk penolakan, misalnya satu hari tidak boleh berisi dua petugas dan satu anggota tidak boleh bertugas dua kali dalam satu pekan.
Kandidat ketiga adalah arsip catatan tanya jawab dengan status menunggu jawaban atau terarsip. Aturan utamanya menuntut catatan terarsip selalu membawa isi jawabannya, dan perubahan status menjadi satu-satunya transisi yang penting. Bentuk datanya kecil dan aturan statusnya jelas, tetapi contoh serupa sudah menjadi studi kasus pada bahasan idiom pemodelan domain, sehingga pemilihan kandidat ini akan mengulang bentuk latihan yang sama.
Kriteria pemilihan#
Kriteria pemilihan harus mengukur kecocokan kandidat dengan tujuan proyek, yaitu memperlihatkan tipe domain, invarian, dan alur Result tanpa kerumitan lain. Kriteria yang tidak masuk daftar, misalnya potensi pemasaran atau kemudahan antarmuka, tidak digunakan karena bukan tujuan latihan ini. Empat kriteria berikut digunakan untuk menilai setiap kandidat.
- aturan domain cukup banyak yang berbentuk penolakan, sehingga kanal Error pada Result terpakai secara nyata
- model data muat dalam satu berkas skrip tanpa terpecah ke beberapa modul
- tidak menuntut I/O berkas, jaringan, maupun sumber data eksternal
- bentuk datanya bervariasi, ada nilai tunggal, koleksi, dan pemetaan hari ke status
| Kriteria | Inventaris gudang | Jadwal piket | Arsip catatan |
|---|---|---|---|
| Aturan berbentuk penolakan | stok kurang, jumlah negatif | hari terisi, dobel tugas, tim penuh | isi wajib saat terarsip |
| Ukuran model | sedang, memuat barang, lokasi, dan mutasi | kecil, memuat peserta, hari, dan penugasan | kecil, memuat catatan dan status |
| Kebutuhan I/O | tinggi pada daftar mutasi | tidak ada | rendah |
| Variasi bentuk data | angka dan teks | koleksi dan pemetaan | teks dan status |
Tabel memperlihatkan bahwa ketiga kandidat layak dikerjakan, sehingga keputusan tidak berdiri pada kelayakan semata. Yang dibandingkan adalah kesesuaian dengan tujuan latihan, bukan keunggulan domain satu terhadap yang lain. Kriteria penolakan dan variasi bentuk data menjadi pembeda paling menentukan karena keduanya menguji materi jalur secara langsung.
Kandidat terpilih#
Jadwal piket dipilih sebagai proyek. Aturan penolakannya paling padat, karena satu operasi penugasan saja memuat tiga pemeriksaan sekaligus, yaitu peserta harus terdaftar, hari harus masih kosong, dan peserta belum bertugas pada hari lain. Modelnya tidak memuat angka sama sekali, sehingga seluruh layanan muat dalam satu berkas skrip yang terbaca dari atas ke bawah.
Domain ini juga menyentuh banyak materi jalur sekaligus. Hari piket berupa lima kasus discriminated union, jadwal berupa record, dan daftar anggota menggunakan list imutabel. Alur penolakan menggunakan Result, laporan hari disusun dengan pattern matching, sedangkan rangkaian pendaftaran dan penugasan menggunakan operator pipeline.
Keputusan ini tetap membawa konsekuensi yang disadari. Latihan aritmetika stok pada inventaris gudang tidak terpakai, karena jadwal piket hanya menghitung panjang daftar. Kandidat arsip catatan ditinggalkan karena bentuk latihannya sudah diwakili studi kasus yang ada. Yang dikorbankan terbatas pada keluasan domain, sedangkan tujuan latihan tetap terpenuhi.
Lingkup minimum layanan#
Lingkup minimum adalah daftar entitas, operasi, aturan, dan batasan yang disepakati sebelum kode pertama ditulis. Daftar ini menjadi ukuran keberhasilan proyek, karena setiap operasi yang ditulis nanti harus memenuhi setiap aturan yang tercantum. Lingkup berikut ditetapkan untuk layanan jadwal piket.
Entitas
- peserta dengan nomor urut dan nama
- hari piket berupa lima hari kerja, dari Senin sampai Jumat
- status tiap hari, yaitu kosong atau terisi oleh satu peserta
- jadwal berupa daftar anggota beserta status kelima harinya
Operasi
- mendaftarkan peserta baru pada daftar anggota
- menugaskan peserta pada satu hari
- menukar penugasan dua hari
- memeriksa peserta yang tercatat pada lebih dari satu hari
Aturan domain
- nama peserta tidak boleh kembar
- anggota tim maksimal lima orang
- satu hari hanya menampung satu penugasan
- satu peserta hanya bertugas satu kali dalam satu pekan
- penukaran hanya sah antara dua hari yang sudah terisi
Batasan
- tanpa penyimpanan berkas maupun basis data
- pekan bersifat generik tanpa tanggal kalender
- tanpa antarmuka pengguna, hasil kerja berupa skrip yang dijalankan
Sketsa berikut hanya memperkenalkan nama tipe dan bentuk datanya tanpa satu pun fungsi. Field Id masih bertipe int dan Nama masih bertipe string, karena pengetatan tipe merupakan pekerjaan pengerjaan kode, bukan pekerjaan pemilihan proyek. Yang penting pada tahap ini adalah bentuk kasarnya sudah dapat dikompilasi dan dicetak, sehingga keputusan awal dapat diperiksa sebelum perilaku ditambahkan.
// sketsa tipe layanan jadwal piket, ditulis sebelum perilaku apa pun
type Peserta = { Id: int; Nama: string }
type HariPiket = Senin | Selasa | Rabu | Kamis | Jumat
type StatusHari = Kosong | Terisi of Peserta
type JadwalPiket =
{ Anggota: Peserta list
Penugasan: Map<HariPiket, StatusHari> }
let pesertaPertama = { Id = 1; Nama = "Ali" }
let jadwal = { Anggota = []; Penugasan = Map.empty }
printfn "%A" pesertaPertama
printfn "%A" jadwal{ Id = 1
Nama = "Ali" }
{ Anggota = []
Penugasan = map [] }Keluaran memperlihatkan satu peserta dan satu jadwal kosong yang masing-masing dicetak apa adanya. Tipe HariPiket membatasi hari yang sah pada lima kasus, sedangkan StatusHari memisahkan keadaan kosong dari keadaan terisi yang membawa pesertanya. Sketsa ini masih longgar, dan pengetatan tipe serta pengisian perilaku dikerjakan pada pengerjaan kode layanan.
Ringkasan#
- Tiga kandidat dinilai dengan empat kriteria yang sama, yaitu kekayaan aturan penolakan, ukuran model, kebutuhan I/O, dan variasi bentuk data.
- Jadwal piket terpilih karena tiga aturan penolakan bertemu pada satu operasi penugasan dan seluruh model muat dalam satu berkas skrip.
- Lingkup minimum menetapkan entitas, operasi, aturan domain, dan batasan secara tertulis sebelum kode pertama ditulis.
- Sketsa tipe awal sengaja masih menggunakan
intdanstringpolos, sedangkan pengetatan tipe menjadi bagian pengerjaan kode.
Referensi#
- F# language reference — Microsoft Learn — Rujukan sintaks bahasa F# yang menjadi dasar pembacaan tipe pada sketsa.
- F# code formatting conventions — Microsoft Learn — Konvensi penataan kode F# yang diikuti saat menyusun nama tipe dan field pada sketsa.