Saya dalam proyek sistem terdistribusi yang ditulis dalam java di mana kami memiliki beberapa kelas yang sesuai dengan objek bisnis dunia nyata yang sangat kompleks. Objek-objek ini memiliki banyak metode yang sesuai dengan tindakan yang dapat diterapkan pengguna (atau agen lain) pada objek tersebut. Akibatnya, kelas-kelas ini menjadi sangat kompleks.
Pendekatan arsitektur sistem umum telah menyebabkan banyak perilaku terkonsentrasi pada beberapa kelas dan banyak skenario interaksi yang mungkin.
Sebagai contoh dan untuk menjaga hal-hal mudah dan jelas, katakanlah Robot dan Mobil adalah kelas dalam proyek saya.
Jadi, di kelas Robot saya akan memiliki banyak metode dalam pola berikut:
- tidur(); isSleepAvaliable ();
- bangun(); isAwakeAvaliable ();
- berjalan (Arah); isWalkAvaliable ();
- menembak (Arah); isShootAvaliable ();
- turnOnAlert (); isTurnOnAlertAvailable ();
- turnOffAlert (); isTurnOffAlertAvailable ();
- mengisi ulang (); isRechargeAvailable ();
- matikan(); isPowerOffAvailable ();
- stepInCar (Mobil); isStepInCarAvailable ();
- stepOutCar (Mobil); isStepOutCarAvailable ();
- Penghancuran diri(); isSelfDestructAvailable ();
- mati(); isDieAvailable ();
- hidup(); isAwake (); isAlertOn (); getBatteryLevel (); getCurrentRidingCar (); getAmmo ();
- ...
Di kelas Mobil, akan serupa:
- nyalakan(); isTurnOnAvaliable ();
- matikan(); isTurnOffAvaliable ();
- berjalan (Arah); isWalkAvaliable ();
- mengisi bahan bakar (); isRefuelAvailable ();
- Penghancuran diri(); isSelfDestructAvailable ();
- jatuh(); isCrashAvailable ();
- isOperational (); isOn (); getFuelLevel (); getCurrentPassenger ();
- ...
Masing-masing (Robot dan Mobil) diimplementasikan sebagai mesin negara, di mana beberapa tindakan mungkin di beberapa negara dan beberapa tidak. Tindakan mengubah status objek. Metode tindakan melempar IllegalStateException
ketika dipanggil dalam keadaan tidak valid dan isXXXAvailable()
metode mengetahui apakah tindakan itu mungkin dilakukan saat itu. Meskipun beberapa mudah disimpulkan dari keadaan (misalnya, dalam kondisi tidur, tersedia terjaga), beberapa tidak (untuk menembak, itu harus terjaga, hidup, memiliki amunisi dan tidak mengendarai mobil).
Lebih lanjut, interaksi antara objek juga rumit. Misalnya, Mobil hanya dapat menampung satu penumpang Robot, jadi jika yang lain mencoba masuk, pengecualian harus dilemparkan; Jika mobil menabrak, penumpang harus mati; Jika robot mati di dalam kendaraan, dia tidak bisa keluar, bahkan jika mobil itu sendiri ok; Jika Robot ada di dalam Mobil, dia tidak bisa masuk yang lain sebelum melangkah keluar; dll.
Hasilnya, seperti yang sudah saya katakan, kelas-kelas ini menjadi sangat kompleks. Untuk memperburuk keadaan, ada ratusan skenario yang mungkin terjadi ketika Robot dan Mobil berinteraksi. Lebih jauh, banyak dari logika itu perlu mengakses data jarak jauh di sistem lain. Hasilnya adalah unit-testing menjadi sangat sulit dan kami memiliki banyak masalah pengujian, satu menyebabkan yang lain dalam lingkaran setan:
- Pengaturan testcases sangat kompleks, karena mereka perlu menciptakan dunia yang sangat kompleks untuk berolahraga.
- Jumlah tes sangat besar.
- Test suite membutuhkan waktu beberapa jam untuk berjalan.
- Cakupan pengujian kami sangat rendah.
- Kode pengujian cenderung ditulis berminggu-minggu atau berbulan-bulan lebih lambat daripada kode yang mereka uji, atau tidak pernah sama sekali.
- Banyak tes yang rusak juga, terutama karena persyaratan kode yang diuji berubah.
- Beberapa skenario sangat kompleks, sehingga gagal pada batas waktu selama penyiapan (kami mengonfigurasi batas waktu dalam setiap pengujian, dalam kasus terburuk yang berlangsung 2 menit dan bahkan selama ini mereka kehabisan waktu, kami memastikan bahwa itu bukan loop yang tidak terbatas).
- Bug secara teratur masuk ke lingkungan produksi.
Skenario Robot dan Mobil itu terlalu menyederhanakan apa yang kita miliki dalam kenyataan. Jelas, situasi ini tidak dapat dikelola. Jadi, saya meminta bantuan dan saran untuk: 1, Mengurangi kompleksitas kelas; 2. Sederhanakan skenario interaksi antara objek saya; 3. Kurangi waktu pengujian dan jumlah kode yang akan diuji.
EDIT:
Saya pikir saya tidak jelas tentang mesin negara. Robot itu sendiri adalah mesin negara, dengan negara "tidur", "terjaga", "mengisi ulang", "mati", dll. Mobil adalah mesin negara lain.
EDIT 2: Jika Anda ingin tahu tentang apa sebenarnya sistem saya, kelas-kelas yang berinteraksi adalah hal-hal seperti Server, Alamat IP, Disk, Cadangan, Pengguna, SoftwareLicense, dll. Skenario Robot dan Mobil hanyalah kasus yang saya temukan itu akan cukup sederhana untuk menjelaskan masalah saya.