- Mesajlar
- 2,410
- En iyi cevaplar
- 98
- Beğeniler
- 2,461
- Puanları
- 10,250
- Ruh hali
Ortada bir npe varsa programın çökmesi gerekmez mi? Kendin söylemedin mi hataları susturmak kötü bir şey diye? Hangi söylediğinin doğru olduğunu kabul etmeliyiz? Biz hataları susturmuyorsak ve programımız npe yüzünden çökmüyorsa oluşturduğun bu konunun ne önemi var, niye açtın bu konuyu? Kimsenin zaten npe ile uğraşmaması lazım öyle değil mi? Ha ama sen hataları susturup programın kullanıcıya veya onun deneyimine zarar verebilecek olmasına rağmen çalışmaya devam etmesi gerektiğini düşünüyorsan burada sana söyleyebileceğim hiçbir şey yok; zaten kendinle çelişiyorsun.
Ha sonuna soru işareti koymuşsun ha Optional kullanmışsın ne farkeder? Amaç aynı, sonuç aynı...
Kullancıyı var gibi göstermiyoruz hayır. Eğer ki sen kullanıcının var olup olmadığını kontrol eden bir kod yazmışsan ve bu kod içerisinde kullanıcı varmış gibi davranıp UnknownUser döndürmüşsen bu senin sorunundur. Böyle bir durumda yapman gereken şey ilk örnekteki gibi exception throwlayarak programın sonlanmasını sağlamaktır. Buradaki örnekte kullanıcının varlığını kontrol etmiyoruz; sadece veritabanında kullanıcıyı arayıp bulmaya çalışıyoruz. Kullanıcı bulunamadığında sana sunulan "UnknownUser" objesindeki metotların bazılarını exception throwlayacak şekilde düzenleyebilirsin. Ve kullanıcının varlığını gerektiğindeif (user.exists()) {
benzeri bir biçimde test edebilirsin (bunu sadece bir kere yapman gerekmeli, tüm codebase i bununla doldurmamalısın).
null olamayacağını düşünmek zorunda değil. 40 farklı kişinin elinin değdiği, 50k - 100k ve belki daha fazla satır bir codebasede bir metotun döndürdüğü şeyin null olduğu gözden kaçabiliyor. Bu 50k bile olsa gelen npe nin nereden geldiğini bulmak tam anlamıyla işkence haline dönüşür. Sen en fazla ne kadar büyük bir proje ile çalıştın bilmiyorum fakat bu bahsettiğim şey bütün programcıların kabusudur.
Dikkatini çekerim kod içerisine comment line ekleyip "başka bir yerde" demişim aynı yer olabilir mi? Buradaki olay bütün kaynak kodununif (x == null) {
lerle dolup okunamaz bir hale gelmesi ve her yerde, sürekli null kontrolü yapmak zorunda olmamızdır.
Performans konusunda düşünmen gereken en son şey oluşturacağın basit bir obje olacaktır. Önemli olan o objenin ne yaptığı ve senin o obje ile ne yaptığındır. Yoksa bir kaç yüz tane null objesi oluşturdun diye ram kullanımın artacak değil. GC bununla ilgilenemeyecek kadar zavallı mı? Hayır.
Ortada bir npe varsa programın çökmesi gerekmez mi? Kendin söylemedin mi hataları susturmak kötü bir şey diye? Hangi söylediğinin doğru olduğunu kabul etmeliyiz? Biz hataları susturmuyorsak ve programımız npe yüzünden çökmüyorsa oluşturduğun bu konunun ne önemi var, niye açtın bu konuyu? Kimsenin zaten npe ile uğraşmaması lazım öyle değil mi? Ha ama sen hataları susturup programın kullanıcıya veya onun deneyimine zarar verebilecek olmasına rağmen çalışmaya devam etmesi gerektiğini düşünüyorsan burada sana söyleyebileceğim hiçbir şey yok; zaten kendinle çelişiyorsun.
Benim dediğim durumda hatayı susturmuyorsun sadece programı çökertmiyorsun ve hatayı raporluyorsun, otomatik veya kullanıcıya sorarak. Orada da yazmıştım aynısını neresini anlamadığını anlamadım? Sen demiyor musun programın çökmesi kötü bir şey diye?
Kullanıcı bulunamadığında sana sunulan "UnknownUser" objesindeki metotların bazılarını exception throwlayacak şekilde düzenleyebilirsin.
Olması gerekende bu zaten. Olmayan bir kullanıcı üzerinde işlem yapılmaya neden çalışılsın? İşlem yapılmayacaksa neden boş obje oluşturulsun sadece hata verdirmek için? Exists kodunu yazabiliyoruz da neden null check koyamıyoruz?
Dediğin yöntem bana kalır ise şu durumda mantıklı sadece: "Eğer kullanıcının olup olmaması umurunda değil ise ve sadece kontrol yapmak istiyor isen." Mesela exists methodu bir boolean methodu, kullanıcının olup olmaması farketmiyor olmaması durumunda NPE yerine basitçe false döndürmek daha mantıklı olabilir dediğin gibi.
Dikkatini çekerim kod içerisine comment line ekleyip "başka bir yerde" demişim aynı yer olabilir mi?
Dikkatini çekerim bende orada "farklı yerlerde kullanıyor isek zaten null kontrolü eklemeliyiz" demişim. User#exists methodunu da aynı şekilde başka bir yerde kullanmaya kalkacaksak ve kullanıcının olup olmaması yapacağımız işlemi etkiliyor ise yine User#exists methodunu tekrar kullanmalıyız.
Yani burada null kullanmayarak performanstan readibility den bug free den production ready den her türlü gözle görülür avantajın çıkarın kazancın olması lazım ki bir şeyi kullanmaktan tamamen vazgeçesin. Bana kalırsa bu daha çok tercih meselesi. Sen zaten null kullanmıyorsundur öyle alışmışsındır kullanmazsın, o sana kalmış. Fakat ben null kullanıyorum null checkleri veya conditional expression (C#'da olan ve Java'da görmek istediğim özellik, x?.method/field şeklinde erişebiliyorsun) kullanmayı seviyorum ona alışmışım o da benim bileceğim iş. Kimin ne kullandığı açıkcası benim pekte umurumda değil.
Burada tartıştığımız şey her ne kadar hangisinin daha mantıklı iyi olduğu gibi görünse de benim burada savunduğum şey başından beri zaten "null iyidir, kullanın kullandırtın" değil de "isteyen kullanır, istemeyen kullanmaz" düşüncesi.
Burada konunun başından bari demek istediğim şeye gelir isek "ben null kullanmıyorum sizde kullanmayın, kullandırtmayın" olayı yanlış. Konuda "null şöyle güzeldir böyle güzeldir, her yerde kullanın kullandırtın" da denmediğine göre böyle bir tartışmanın çıkması bile baştan sona saçmalık.
Performans konusunda düşünmen gereken en son şey oluşturacağın basit bir obje olacaktır. Önemli olan o objenin ne yaptığı ve senin o obje ile ne yaptığındır. Yoksa bir kaç yüz tane null objesi oluşturdun diye ram kullanımın artacak değil. GC bununla ilgilenemeyecek kadar zavallı mı? Hayır.
Burada performanstan bahsetmiyorum sadece mantık yolu ile ilerliyorum. Aynı işi sabit bir değer olan ve zaten hiçliği temsil eden null ile de yapabilecekken neden olmayan bir üyeyi temsil eden bir class açıp onun bir instancesini oluşturayım? Bir kaç null kontrolünden zaman kazanmak için mi? Ya da programın çökmesini engellemek için mi? Bu nereden çıktı bilmiyorum ama başta da dediğim gibi; hatalar veya çökmeler doğru yoldan tespit edilip raporlanmalı.