Saya sering mengalami masalah ini, terutama di Jawa, bahkan jika saya pikir itu adalah masalah OOP umum. Yaitu: menaikkan pengecualian mengungkapkan masalah desain.
Misalkan saya memiliki kelas yang memiliki String name
bidang dan String surname
bidang.
Kemudian ia menggunakan bidang-bidang itu untuk menulis nama lengkap seseorang untuk menampilkannya pada semacam dokumen, misalnya faktur.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Sekarang saya ingin memperkuat perilaku kelas saya dengan melemparkan kesalahan jika displayCompleteNameOnInvoice
dipanggil sebelum nama telah ditetapkan. Sepertinya ide yang bagus, bukan?
Saya dapat menambahkan kode yang meningkatkan pengecualian ke getCompleteName
metode. Tetapi dengan cara ini saya melanggar kontrak 'implisit' dengan pengguna kelas; pada umumnya getter tidak seharusnya melempar pengecualian jika nilainya tidak disetel. Ok, ini bukan pengambil standar karena tidak mengembalikan satu bidang, tetapi dari sudut pandang pengguna perbedaannya mungkin terlalu halus untuk dipikirkan.
Atau saya bisa melempar pengecualian dari dalam displayCompleteNameOnInvoice
. Tetapi untuk melakukannya saya harus menguji secara langsung name
atau surname
bidang dan melakukannya saya akan melanggar abstraksi yang diwakili oleh getCompleteName
. Metode ini bertanggung jawab untuk memeriksa dan membuat nama lengkap. Bahkan bisa memutuskan, mendasarkan keputusan pada data lain, bahwa dalam beberapa kasus itu cukup surname
.
Jadi satu-satunya kemungkinan tampaknya mengubah semantik metode getCompleteName
untuk composeCompleteName
, yang menunjukkan lebih 'aktif' perilaku dan, dengan itu, kemampuan melempar pengecualian.
Apakah ini solusi desain yang lebih baik? Saya selalu mencari keseimbangan terbaik antara kesederhanaan dan kebenaran. Apakah ada referensi desain untuk masalah ini?
displayCompleteNameOnInvoice
bisa saja melempar pengecualian jika getCompleteName
kembali null
, bukan?