Merhaba arkadaşlar. Bu yazımda oldukça popüler ve işlevi büyük olan Builder tasarım deseninden bahsetmek istiyorum.

Yapı olarak farklı olsa da Abstract Factory desenine benzerlikleri vardır.

Bazen projelerimizde nesnelerimize ait birçok özellik olabilir ve bu nesnelerimizi farklı farklı özellikler ile oluşturmak isteriz. Dolayısıyla bazen çalıştığımız sınıflar içerisinde çok fazla parametre alan metodlar ve yapılandırıcılar kullanabiliyoruz. Bu kullanılabilirliği ve okunabilirliği oldukça zorlaştıran bir durum. Bazen aynı methodu çok fazla kez overload edip, kendimize iş yükü doğurabiliyoruz. İşte bu kısımda yardımımıza Builder Design Pattern yetişiyor.

Şimdi bu konuyu daha iyi anlamak adına basit kod parçacıklarını paylaşalım.

Nesne sınıfımız

Builder sınıfımız

Test sınıfımız

İşte bir yazının daha sonuna geldik, lütfen yorumunuzu esirgemeyin :) Bir sonraki yazımda görüşmek üzere, hoşçakalın..

Merhaba arkadaşlar. Bu yazımda Java projelerimizde sık bir şekilde kullandığımız instanceof operatöründen bahsedeceğim.

Java instanceof operatörü herhangi bir nesnenin belirtilen türe ait olup, olmadığını öğrenmek için kullanılır. Bu operatör aynı zamanda tip karşılaştırmak için de kullanılır ve Boolean tipinde true yada false  değerini döner. Bu operatör null bir değişkene uygulandığında false değerini dönmekle yükümlüdür.

Şimdi basit bir örnek yapalım.

Output : true

Yukarıda kod bloğunda gördüğünüz üzere Car sınıfından bir nesne yarattık ve bu nesnenin Car sınıfına ait olup, olmadığını ekrana yazdırdık ve sonuç olarak bize true değerini döndürdü.

Alt sınıf nesnesinin türü de aynı zamanda bağlı olduğu üst sınıfının türüyle aynıdır. Yani Car sınıfımızın bir alt sınıfı olarak Opel sınıfı olsun. Opel sınıfından bir nesne yaratıp, bu nesnenin Car sınıfına ait olup olmadığını sorgularsak sonuç olarak bize true dönecektir.

Şimdi bunla ilgili bir örnek yapalım.

Output : true

Yazının başında da bahsettiğim gibi instanceof operatörünü null bir değişkene uygularsak sonuç olarak bize false döner.

Output : false

Lütfen yorumlarınızı esirgemeyin. Bir dahaki yazımda görüşmek üzere, hoşçakalın :)

Merhaba arkadaşlar. Bu yazıda size kısaca çoğu kişinin merak ettiği veri tabanı sistemlerinde kullanılan izolasyon seviyelerinden bahsedeceğim.

Bildiğiniz üzere bir veri tabanında tutarlığı korumak için dört farklı özellik bulunmaktadır. Bunlar; atomicity, consistency, isolation ve durability (Kısaca ACID diye söylenebilir). Biz burada isolation (izolasyon) kısmıyla ilgileneceğiz. İzolasyon bir işlem bütünlüğünün diğer kullanıcı ve sistemlere nasıl göründüğünü ifade eder. İzolasyon seviyesi veri tabanındaki bir işlemin başka işlemlerden nasıl izole edilmesi gerektiğini tanımlar. Kullanılacak olan izolasyon seviyesi aşağıdaki olaylar düşünülerek ve kullanılacak sistemin ihtiyaçlarına göre belirlenebilir.

Dirty Read : Adından da anlaşılacağı gibi kirli bir okumadır. Bir işlemin henüz işlenmemiş bir veriyi okuduğu durumdur. Örnek olarak elimizde T1 ve T2 diye iki işlemimiz olsun. T1 herhangi bir satırı güncelliyor fakat değişikliği onaylamadan işini bırakıyor. Bu arada T2 bu güncellenmiş veriyi okuyabiliyor. Eğer T1 bu işlemi geri alırsa T2 var olmamış veriyi okumaya devam edecektir.

Non-Repeatable Read : Yine elimizde T1 ve T2 diye iki işlemimiz olduğunu varsayalım. Örneğin T1 in bir veriyi okuduğunu varsayalım. Eş zamanlı olarak T2 de bu veriyi güncellemiş olsun. Şimdi T1 aynı verileri tekrar alırsa farklı bir değer okumuş olur.

Şimdi izolasyon seviyelerinden bahsedelim. Bilindiği üzere temelde dört adet izolasyon seviyesi bulunmaktadır.

Read Uncommitted : Read Uncommitted en düşük izolasyon seviyesidir. Adından da anlaşılacağı gibi bu seviyede bir işlem başka bir işlemin henüz onaylamadığı değişiklikleri okuyabilir. Bu sayede yukarıda bahsettiğimiz Dirty Read olayına izin verilmiş olur.

Read Committed :  Bu izolasyon seviyesi okunan herhangi bir verinin okunduğunda verinin önceden işlendiğini garanti eder. Böylece Dirty Read e izin vermez.

Repeatable Read  : En kısıtlayıcı izolasyon seviyesidir. Bu seviyede herhangi bir işlem referans aldığı tüm satırlarda okuma kilitlerini tutar. Diğer işlemler bu satırları okuyamayacağından, güncelleyemediğinden veya silemediğinden, böylece Non-Repeatable Read ı önlemiş olur.

Serializable : Bu en yüksek izolasyon seviyesidir. Seri hale getirilebilir bir yürütmenin serileştirilmesi garanti edilir.

 

Bu izolasyonların seviyeleri için şu en iyisidir veya şu en kötüsüdür diye bir yorumda bulunamayız. Hangisinin bizim için iyi veya kötü olduğu var olan uygulamamızın ihtiyaçlarına göre değişebilir.

Lütfen yorumlarınızı esirgemeyin. Bir dahaki yazıda görüşmek üzere, hoşçakalın :)

Merhaba arkadaşlar, uzun bir süre yazmaktan ve sizden uzak kaldım, aranıza tekrar döndüğüm için ve uzun bir zaman sonra tekrar yazmaya başladığım için mutluyum açıkcası. Bugün size Singleton Design Pattern hakkında biraz bahsetmek istiyorum.

Singleton design pattern creational design pattern ailesine ait olan bir tasarım desenidir. Bu tasarım deseninin kullanım amacı bazı durumlarda bir sınıftan birden fazla nesne oluşturulmasına gerek yoktur. Örneğin; uygulama katmanımızın veri tabanına bağlantısını yöneten sınıftan birden fazla nesne oluşturmaya gerek yoktur. Her çağıran için bu sınıftan ayrı ayrı nesne oluşturmak uygulama verimliliğini düşürecektir. İşte singleton deseni bize bu konuda yardımcı oluyor. Bu tasarım deseni ile ilgili sınıftan birden fazla nesne oluşturulmasının önüne geçmiş oluruz.

Bir sınıfı singleton prensibine uyarlamak için yapılandırıcısının erişim belirtecini private yapmamız yeterlidir.

Şimdi gelin bu konuyu daha iyi anlamak adına şu basit kod parçacıklarına bakalım.

Bir yazımın daha sonuna gelmiş bulunmaktayız. Lütfen yorumlarınızı esirgemeyin :) Bir sonrakinde görüşmek üzere, hoşçakalın.

Merhaba arkadaşlar. Bu yazımda Java’da kullanılan throw ve throws kavramlarını ele alacağım.

Throw Kavramı

Yazdığımız Java programında açıkca throw  ifadesini kullanarak bir istisna fırlatmak mümkündür. throw ifadesinin genel formu aşağıdaki gibidir.

throw FırlatılabilirNesne;

Burada FirlatilabilirNesne, Throwable veya onun herhangi bir alt sınıfı tipinde bir nesne olmak zorundadır. Throwable olmayan String, Object, Int, Char.. gibi tipler istisna olarak kullanılamaz. Throwable bir nesne elde etmenin iki yolu vardır. Birinci yolu catch cümleciği içinde parametre olarak kullanılabilir ya da new operatörü ile yeni bir nesne oluşturabilirsiniz.

Programın işleyişi throw ifadesinden hemen sonra durur ve sonra hiçbir ifade çalıştırılamaz. Kapsayan en yakın try bloğunda istisna tipiyle eşleşen bir catch cümleciği aranır. Bulunmaz ise sıradaki kapsayan try bloğu denetlenir. Denetleme try bloklarının sonuna kadar devam eder. Eğer istisna tipiyle eşleşen bir catch bulunamazsa program durur.

Şimdi bir istisna oluşturan ve bunu fırlatan basit bir örneği inceleyelim.

Ekran Alıntısı

Bu program aynı hatayı yakalamak için iki şansa sahiptir. Birincisi main() metodunun içinde çağırılan olustur_firlat metodunun try bloğunda hata oluşturulur ve catch bloğunda yakalanır. İkincisi main() metodunun içindeki catch bloğudur. Örnek kodumuzda kullanılan  new kelimesini hata nesnesi oluşturmak için kullanırız.

Throws Kavramı

Eğer bir metot yakalayamadığı bir istisnaya neden olursa, metodu çağıranların kendilerini istisnaya karşı koruyabilmeleri için çağıran metodun bu davranışı belirtmesi gerekir. Bunu metodun bildirimine bir throws ifadesi ekleyerek yapabilirsiniz. throws ifadesi bir metodun fırlatabileceği istisna tiplerini belirtir. Eğer belirtilmez ise derleme zamanı hatası alınır.

throws ifadesinin genel formu aşağıdaki gibidir.

tip metot_adi (parametreler) throws istisna_listesi {

//metot gövdesi

}

Burada istisna_listesi metodun fırlatabileceği istisna tiplerinin virgülle ayrılmış halidir.

Aşağıdaki örnek kodumuza bakalım.

Ekran Alıntısı

Kodda gördüğünüz IllegalAccessException ifadesi metodumuzun fırlatabileceği hatanın tipidir. Bunu yazmazsak derleme hatası alırız. throwOne() metodunun içinde yeni bir hata nesnesi yaratılıp, fırlatılmıştır. Fırlatılan bu hata main() metodumuzun catch bloğunda yakalanmaktadır. Bu şekilde hata potansiyeline sahip metotlarımızın hata bildirimini yaparak bu metotları çağıran programların herhangi bir çalışma hatasıyla karşılaşmadan işleyişine devam etmesini sağlayabiliriz.

Bir daha ki yazımda görüşmek üzere..