Ketika saya memiliki banyak data yang perlu divalidasi, haruskah saya membuat kelas baru untuk tujuan validasi saja atau haruskah saya tetap menggunakan validasi dalam metode?
Contoh khusus saya merenungkan turnamen dan kelas acara / kategori: Tournament
dan Event
, yang menjadi model turnamen olahraga dan setiap turnamen memiliki satu atau banyak kategori.
Ada semua hal yang perlu divalidasi dalam kelas-kelas ini: para pemain harus kosong, harus unik, jumlah pertandingan yang harus dimainkan setiap pemain, jumlah pemain yang dimiliki, pertandingan yang telah ditentukan, dan sebagainya yang sangat besar termasuk banyak lagi aturan yang rumit.
Ada juga beberapa bagian yang perlu saya validasi secara keseluruhan, seperti bagaimana kelas terintegrasi satu sama lain. Misalnya, validasi kesatuan aPlayer
bisa baik-baik saja, tetapi jika suatu peristiwa memiliki pemain yang sama dua kali, itu adalah kesalahan validasi.
Jadi bagaimana dengan ini?
Jadi kita akan memiliki sesuatu seperti EventValidator
dengan Event
sebagai anggota, dan validate()
metode yang memvalidasi seluruh objek, ditambah metode tunggal untuk memvalidasi aturan semua anggota.
Kemudian, sebelum membuat instance objek yang valid, saya akan menjalankan validasi untuk mencegah nilai ilegal.
Apakah desain saya benar? Haruskah saya melakukan sesuatu yang berbeda?
Juga, haruskah saya menggunakan metode validasi pengembalian boolean? Atau hanya melempar pengecualian jika validasi gagal? Menurut saya pilihan terbaik adalah metode pengembalian boolean dan melemparkan pengecualian ketika objek instantiant, misalnya:
public Event() {
EventValidator eventValidator = new EventValidator(this);
if (!eventValidator.validate()) {
// show error messages with methods defined in the validator
throw new Exception(); // what type of exception would be best? should I create custom ones?
}
}
sumber
Validator
atau di dalamValidable
? Dan bagaimana saya bisa mengerjakan pesan-pesan ini dalam hubungannya denganValidationException
?Validatable
adalah nama yang jauh lebih baik daripadaValidable
kata sifat yang sebenarnyaItulah masalahnya. Idealnya Anda harus mencegah objek Anda memiliki keadaan tidak valid: Jangan biarkan instantiasi dengan keadaan tidak valid dan jika Anda harus memiliki setter dan metode perubahan negara lainnya, lempar pengecualian di sana.
Ini bukan contradictionary. Jika logika validasi cukup kompleks untuk menjamin kelasnya sendiri, Anda masih dapat mendelegasikan validasi. Dan jika saya mengerti Anda benar, inilah yang sedang Anda lakukan sekarang:
Jika Anda masih memiliki setter yang mungkin menghasilkan keadaan tidak valid, pastikan untuk memvalidasi sebelum benar-benar mengubah keadaan. Kalau tidak, Anda akan memiliki pesan kesalahan tetapi masih meninggalkan objek Anda dengan keadaan tidak valid. Sekali lagi: mencegah objek Anda memiliki keadaan tidak valid
Kedengarannya bagus bagi saya, karena validator mengharapkan input yang valid atau tidak valid sehingga dari perspektifnya, input yang tidak valid bukanlah pengecualian.
Pembaruan: Jika "sistem secara keseluruhan" menjadi tidak valid, alasannya adalah bahwa beberapa objek harus berubah (misalnya pemain) dan beberapa objek tingkat yang mungkin lebih tinggi (misalnya suatu peristiwa) yang merujuk objek ini memiliki kondisi yang tidak terpenuhi lagi . Sekarang solusinya adalah dengan tidak mengizinkan perubahan langsung ke pemain yang bisa membuat sesuatu menjadi tidak valid di level yang lebih tinggi. Di sinilah objek abadi membantu. Kemudian pemain yang diubah adalah objek yang berbeda. Setelah pemain dikaitkan dengan suatu peristiwa, Anda hanya dapat mengubahnya dari acara itu sendiri (karena Anda harus mengubah referensi ke objek baru) dan segera memvalidasi kembali.
sumber