Selam! Uzun zamandır yazı yazmıyordum falan filan.
Null pattern’ı aslında Agile principles and practices kitabında gördüm ancak burada görmeden önce de bunu zaten kullanıyormuşum sadece adını bilmiyormuşum.
Bu arada böyle söylediğim çok şey var belki bilinçaltımda okuduğum kitaplar veya gördüğüm yazılımlardandır.
Her neyse konumuza gelecek olursak, şunu bir özetleyelim. Veri tabanından c# ve ef ikilisini kullanarak veri çekmeye çalıştığımızda FirstOrDefault() diyerek linq kitiyle birlikte ilk objeyi alabiliyoruz.
Burada şöyle bir problem ortaya çıkıyor Object reference not to set an object evet bakmadan yazdım bu hatayı çünkü çok fazla gördüm ben bu hatayı gördüğümde nullcheck yapılmadığını anlıyorum c# bu hatanın gelmesini önlemek adına nullable value types’ı getirdi ama nafile. bu katı bir kural olarak koyulmadığı müddetçe her şeyin null gelebilme ihtimalini düşünmek gerek.
Özetle null object pattern şu konuyu ele alıyor. Sen objeyi çekebildin mi ve obje null mı değil mi bunun kontrolünü yapabiliyorsunuz.
Aşağıda ufak bir uygulama bırakıyorum, bu uygulama içerisinde order ekleyip sonrasında bu order’ları görüntüleyebiliyorsunuz. Ancak obje null ise Object reference hatası almamak için null mı yoksa değil mi diye kontrol ettik.
Sonrasında ise null object pattern’ını implemente ettik. Normalde veri tabanında sakladığımız order class’ımızı biraz revize ettik.

Burada bulunan Order’a bir abstraction ekledik IsNull methodu
Ve NullOrder değeri de IsNull değerini True olarak dönüyor.

Normalde veri tabanından direk FirstOrDefault demek yerine artık ?? (null coalescing) operatörünü kullanarak artık bu değer null ise varsayılan olarak NullOrder tipinde bir nesne dönüyoruz.
Daha sonrasında ise null kontrolünü yaptığımız yeri şu şekilde değiştiriyoruz.

burada != null diyerek IsNull değerini kontrol ediyoruz.
Burada her şey çözülmüş değil halen daha obje null olmasına rağmen, property’lere erişim sağlamaya çalıştığımızda hata alacağız, kodun bu kısmını kullandık diğer kısımlarında ise bu nullCheck’i gene yapmamız gerekir en azından property’ler için. Tabi bunun yöntemini property’lerin varsayılan değerlerini ayarlayarak çözebilirsiniz.
Tabi bu göstediğim örnek sadece bir problemi öne çıkarıyor belki benim aklıma gelmeyen tonla problem devam etmekte.
Kodların bulunduğu repository:
https://github.com/erdyasan/nullpattern
Direk nullpattern uygulanan branch
https://github.com/erdyasan/nullpattern/tree/nullobjectpattern
İyi çalışmalar dilerim.