Bence NULL döndürmek, bir miktar boş sonuç döndürmek (örneğin boş dize veya boş bir liste) ve bir istisna atmak arasında bir fark var.
Normalde aşağıdaki yaklaşımı alıyorum. Bir işlevi veya yöntemi f (v1, ..., vn) çağrısı bir işlevin uygulaması olarak kabul ediyorum
f : S x T1 x ... x Tn -> T
burada S, "dünyanın durumu" T1, ..., Tn, giriş parametresi tipleridir ve T, geri dönüş tipidir.
Önce bu işlevi tanımlamaya çalışıyorum. İşlev kısmi ise (yani bunun tanımlanmadığı bazı giriş değerleri var) bunu bildirmek için NULL döndürürüm. Bunun nedeni, hesaplamanın normal şekilde sonlandırılmasını ve istediğim fonksiyonun verilen girişlerde tanımlanmadığını söylemesini istemem. Örneğin, return değeri olarak boş bir dize kullanılması, işlev girişlerde tanımlandığı ve boş dize doğru sonuç olabileceği için belirsizdir.
Kısmi bir işlev uyguladığınız için çağrı kodundaki NULL bir işaretçi için fazladan kontrol yapılması gerekli olduğunu düşünüyorum ve işlev verilen girdi için tanımlanmamışsa, size söylenen yöntemin görevidir.
Hesaplamayı yapmasına izin vermeyen hatalar için istisnalar kullanmayı tercih ederim (yani herhangi bir cevap bulmak mümkün değildi).
Örneğin, bir sınıf Müşterim olduğunu varsayalım ve bir yöntem uygulamak istediğimi varsayalım.
Customer findCustomer(String customerCode)
Uygulama veritabanında bir müşteriyi koduyla aramak için. Bu yöntemde olurdum
- Sorgu başarılı olursa, Müşteri sınıfı bir nesne döndürün,
- Sorgu herhangi bir müşteri bulamazsa null değerini döndür.
- Veritabanına bağlanmak mümkün değilse bir istisna atın.
Null için ekstra çek, örneğin
Customer customer = findCustomer("...");
if (customer != null && customer.getOrders() > 0)
{
...
}
Yaptıklarımın anlambiliminin bir parçası ve kodun daha iyi okunması için sadece "atladım". Eldeki problemin anlamını basitleştirmenin sadece kodu basitleştirmenin iyi bir uygulama olduğunu düşünmüyorum.
Elbette, null kontrolü çok sık gerçekleştiğinden, dilin bunun için bazı özel sözdizimini desteklemesi iyi olur.
Ayrıca, bir sınıfın boş nesnesini diğer tüm nesnelerden ayırt edebildiğim sürece Null Object pattern'ini (Laf tarafından önerildiği şekilde) kullanmayı düşünürdüm.