Genelde bir OOP sorunu olduğunu düşünmeme rağmen, özellikle Java'da sık sık bu soruna rastlarım. Yani: bir istisna yaratmak, bir tasarım problemini ortaya çıkarır.
Bir String name
alan ve bir String surname
alan olan bir sınıfım olduğunu varsayalım .
Daha sonra bu alanları bir tür belgede görüntülemek üzere bir kişinin tam adını oluşturmak için kullanır, bir fatura söyleyin.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Şimdi displayCompleteNameOnInvoice
ismim atanmadan önce çağrılırsa , sınıfımın davranışını bir hata atarak güçlendirmek istiyorum . İyi bir fikir gibi görünüyor, değil mi?
İstisna yükseltme kodunu getCompleteName
metoda ekleyebilirim . Ancak bu şekilde, sınıf kullanıcısı ile 'örtük' bir sözleşmeyi ihlal ediyorum; Genelde, alıcıların, değerleri belirlenmemişse istisnalar atması beklenmez. Tamam, bu standart bir alıcı değil, çünkü tek bir alanı geri getirmiyor, ancak kullanıcı bakış açısından bu ayrım düşünmek için çok ince olabilir.
Veya istisnayı içinden fırlatabilirim displayCompleteNameOnInvoice
. Fakat bunu yapmak için doğrudan name
veya surname
alanları test etmeliyim ve böyle yapmak, onu temsil ettiğim soyutlamayı ihlal eder getCompleteName
. Adın tamamını kontrol etmek ve oluşturmak bu yöntem sorumluluğudur. Kararı diğer verilere dayanarak, bazı durumlarda yeterli olduğuna bile karar verebilirdi surname
.
Yani tek olasılık yönteminin semantik değiştirmek gibi görünüyor getCompleteName
için composeCompleteName
, onunla bir daha 'etkin' davranış ve, istisna atan yeteneğini gösteriyor ki.
Bu daha iyi tasarım çözümü mü? Her zaman sadelik ve doğruluk arasındaki en iyi dengeyi arıyorum. Bu sorun için tasarım referansı var mı?
displayCompleteNameOnInvoice
eğer getCompleteName
geri dönerse bir istisna atabilir null
, değil mi?