Pernyataan tidak bertahan dari kenyataan
Biasanya pernyataan tidak bertahan dari kontak dengan data dunia nyata. Ini adalah bagian dari proses rekayasa perangkat lunak untuk memutuskan, dengan data mana yang ingin Anda tangani dan yang di luar jangkauan.
Grafik keluarga siklik
Mengenai "pohon" keluarga (sebenarnya itu adalah grafik yang lengkap, termasuk siklus), ada anekdot yang bagus:
Saya menikahi seorang janda yang memiliki anak perempuan yang sudah dewasa. Ayah saya, yang sering mengunjungi kami, jatuh cinta dengan putri tiriku dan menikahinya. Akibatnya, ayah saya menjadi putra saya, dan putri saya menjadi ibu saya. Beberapa waktu kemudian, saya memberi istri saya seorang putra, yang merupakan saudara lelaki ayah saya, dan paman saya. Istri ayah saya (yang juga anak perempuan saya dan ibu saya) mendapatkan seorang putra. Akibatnya, saya memiliki saudara lelaki dan cucu laki-laki yang sama. Istri saya sekarang adalah nenek saya, karena dia adalah ibu ibu saya. Jadi saya adalah suami dari istri saya, dan pada saat yang sama adalah cucu dari istri saya. Dengan kata lain, saya adalah kakek saya sendiri.
Hal-hal menjadi lebih aneh, ketika Anda mempertimbangkan pengganti atau "ayah kebal" ke dalam akun.
Bagaimana menghadapinya
Tentukan siklus sebagai di luar cakupan
Anda dapat memutuskan bahwa perangkat lunak Anda tidak boleh menangani kasus yang jarang terjadi. Jika hal seperti itu terjadi, pengguna harus menggunakan produk yang berbeda. Ini membuat berurusan dengan kasus-kasus yang lebih umum jauh lebih kuat, karena Anda dapat mempertahankan lebih banyak pernyataan dan model data yang lebih sederhana.
Dalam hal ini, tambahkan beberapa fitur impor dan ekspor yang baik ke perangkat lunak Anda, sehingga pengguna dapat dengan mudah bermigrasi ke produk yang berbeda bila perlu.
Izinkan hubungan manual
Anda dapat mengizinkan pengguna untuk menambahkan hubungan manual. Hubungan ini bukan "warga negara kelas satu", yaitu perangkat lunak mengambil apa adanya, tidak memeriksa mereka dan tidak menangani mereka dalam model data utama.
Pengguna kemudian dapat menangani kasus yang jarang terjadi dengan tangan. Model data Anda akan tetap sederhana dan pernyataan Anda akan tetap bertahan.
Hati-hati dengan hubungan manual. Ada godaan untuk membuatnya benar-benar dapat dikonfigurasi dan karenanya membuat model data yang sepenuhnya dapat dikonfigurasi. Ini tidak akan berfungsi: Perangkat lunak Anda tidak akan skala, Anda akan mendapatkan bug aneh dan akhirnya antarmuka pengguna menjadi tidak dapat digunakan. Anti-pola ini disebut "soft coding" , dan "The WTF daily" penuh dengan contoh untuk itu.
Jadikan model data Anda lebih fleksibel, lewati asersi, uji invarian
Pilihan terakhir adalah membuat model data Anda lebih fleksibel. Anda harus melewati hampir semua asersi dan mendasarkan model data Anda pada grafik lengkap. Seperti yang ditunjukkan contoh di atas, mudah untuk menjadi kakek Anda sendiri, sehingga Anda bahkan dapat memiliki siklus.
Dalam hal ini, Anda harus menguji perangkat lunak Anda secara ekstensif. Anda harus melewati hampir semua pernyataan, jadi ada peluang bagus untuk bug tambahan.
Gunakan generator data uji untuk memeriksa kasus uji yang tidak biasa. Ada cek perpustakaan cepat untuk Haskell , Erlang atau C . Untuk Java / Scala ada ScalaCheck dan Nyaya . Satu ide tes adalah mensimulasikan populasi acak, biarkan kawin silang secara acak, lalu biarkan perangkat lunak Anda terlebih dahulu mengimpor dan kemudian mengekspor hasilnya. Harapannya adalah, bahwa semua koneksi dalam output juga dalam input dan sebaliknya.
Kasing, di mana properti tetap sama disebut invarian. Dalam hal ini, invarian adalah set "hubungan romantis" antara individu dalam populasi yang disimulasikan. Cobalah untuk menemukan invarian sebanyak mungkin dan mengujinya dengan data yang dihasilkan secara acak. Invarian dapat berfungsi, misalnya:
- seorang paman tetap seorang paman, bahkan ketika Anda menambahkan lebih banyak "hubungan romantis"
- setiap anak memiliki orang tua
- populasi dengan dua generasi memiliki setidaknya satu grand-parent
Atau mereka dapat bersifat teknis:
- Perangkat lunak Anda tidak akan macet pada grafik hingga 10 miliar anggota (tidak peduli berapa banyak interkoneksi)
- Perangkat lunak Anda menskala dengan O (jumlah node) dan O (jumlah edge ^ 2)
- Perangkat lunak Anda dapat menyimpan dan memuat ulang setiap grafik keluarga hingga 10 miliar anggota
Dengan menjalankan tes simulasi, Anda akan menemukan banyak kasus sudut aneh. Memperbaikinya akan membutuhkan banyak waktu. Juga Anda akan kehilangan banyak optimasi, perangkat lunak Anda akan berjalan jauh lebih lambat. Anda harus memutuskan, apakah itu layak dan apakah ini dalam lingkup perangkat lunak Anda.