codegenius tarafından yazılmış tüm yazılar

Singleton Pattern Nedir? Nerelerde Kullanılır?

Merhaba,

Bugün en yaygın tasarım patternlerinden olan Singleton Pattern’inden bahsedeceğim.  Singleton yazılım patterni  Creational Design Patterns(Yaratıcı Tasarım Kalıpları) kategorisinde yer alır. Oluşturulan sınıfın sadece bir adet instance’ı olmasını garantiler. Tanımı kolay olmasına rağmen konu implementasyona gelince bir çok yöntem bulunmaktadır ve her zaman yazılımcılar arasında hangi yöntemin kullanılması gerektiği tartışmalı bir konudur. Burada singleton tasarım patterninin ilkelerinin neler olduğunu ve bu modeli uygulamak için kullanılan yöntemleri teker teker inceleyeceğiz.

Singleton tasarım patternine tüm örnek Java kodlarını aşağıdaki github reposunda bulabilirsiniz:

Singleton Pattern Örnek Java

Java Singleton Pattern İlkeleri

  • Singleton pattern bir sınıftan birden fazla instance oluşmasını engeller ve sanal makinada oluşturulan tek instance’ın kullanılmasını garanti eder.
  • Singleton sınıfı, sınıfa ait instance’a ulaşmak için global erişim sağlamalıdır.
  • Singleton sınıfının constructor’ı private olmalıdır. Böylece o sınınftan yeni instance oluşturmak engellenmiş olur.
  • Singleton sınıfın instance’ı içeride private static olarak tutulmalıdır.
  • Tutulan instance’ı döndüren bir public static metoda sahip olmalıdır.

Daha önce bahsettiğim gibi bu pattern birden çok şekilde gerçeklenebilir. Bu yöntemler aşağıdaki gibidir:

  1. Sabırsız Gerçekleme (Eager Initialization)
  2. Statik Blok Yöntemi (Static Block Initialization)
  3. Tembel Gerçekleme (Lazy Initialization)
  4.  Thread Safe Gerçekleme (Thread Safe Initialization)
  5. Bill Pugh Singleton Yöntemi (Bill Pugh Singleton Implementation)

1.Sabırsız Gerçekleme (Eager Initialization)

Bu yöntemde sınıfın instance’ı sınıfın yüklenme anında oluşur. Singleton patterninin en kolay implementasyonlarından biridir. Ancak instance, sınıfın yükleme anında oluştuğundan sınıf kullanılmasa bile instance oluşacağından gereksiz yer kaplar.

Bu yöntemle aşağıdaki gibi singleton patternini oluşturabiliriz:

Eğer oluşturğunuz sınıf çok fazla kaynak tarafından kullanılmıyorsa bu yöntemi kullanabilirsiniz. Ancak genelde singleton sınıfları dosya sistemlerine erişim, loglama, veritabanı bağlantıları vs, kullanıldığı için sınıf çağrılmadan instance’ı oluşturmaktan kaçınmalıyız. Yukarıdaki yöntemde oluşacak bir exception’ı da ele almak imkansızdır.

2. Statik Blok Yöntemi (Static Block Initialization)

Statik blok yöntemi de aynı şekilde Eager yönteme benzer ancak aradaki fark oluşacak exceptionları ele alabiliriz. Yine sınıfın instance’ı sınıfın yüklenme anında oluşur. Ve bu az öncede söylediğimiz gibi çokta istediğimiz bir şey değil.

Örnek kod aşağıdaki gibidir:

 

3. Tembel Gerçekleme (Lazy Initialization)

Bu yöntem sınıfın instance’ı o sınıfa erişmek istenildiği anda oluşturulur. Eğer bu sınıfa birden fazla thread erişmiyorsa sorunsuz olarak çalışır. Birden fazla thread instance’ın oluşturulduğu yere aynı anda girerse farklı instance lar oluşur bu da singleton ilkesine aykırıdır. Farklı threadler olmadığı zaman bu yöntemde instance sınıfın yüklenme anında değil çağırılma anında oluştuğu için faydalıdır.

Örnek kod aşağıdaki gibidir:

Bu yöntemi kullanırken  birden fazla thread aynı anda ulaşırsa sorun olacağından bahsetmiştik. Aşağıdaki resimde iki thread singleton instance’ı oluşturuyor ve instance lar birbirinden farklı.

 

Lazy initialization failure.

 

4. Thread Safe Singleton

Az önceki örneğimizde sınıf instance’ı, sınıfın çağırılma anında oluşturularak implement edilen singleton patterninin nasıl thread safe olmadığını kanıtlamıştık. Şimdi lazy initialization yöntemini nasıl thread safe yapabileceğimize göz atalım.

Bunun en kolay yolu sınıfın global erişim metoduna synchronized koymaktır. Böylece metod herhangi bir thread tarafından çağırıldığı anda diğer threadler bu sınıfa erişemez ve birden fazla instance oluşturmanın önüne geçilmiş olur.

Örnek Java kodu:

 

Yukarıdaki metodta birden fazla erişim engellenir ancak synchronized kelimesi sınıfın tamamını kitlediği için performans sorunu yaratır. Örneğin aşağıdaki gibi bir kullanımda sampleMethodA() ve sampleMethodB() fonksiyonları farklı metodlar olmasına rağmen farklı threadler tarafından aynı anda çağırılamaz. Çünkü getInstance’a koyduğumuz synchronized anahtar kelimesi tüm sınıfı kitler ve tek threadin kullanımına sunar. Bu da singleton yapısının bozulmamasını garantiler ancak performans sorunlarına sebep olur.

Yukarıdaki şekilde çağırdığımızda resimde görüleceği gibi threadlerin birbirini blokladığını görüyoruz.

thread block sample.

Thread safe singleton’a bir diğer yaklaşım ise double check yöntemidir. Bu yöntemde sadece instance oluşturulurken sınıf senkronize edileceğinden performans sorununa da yol açmaz.

 

5. Bill Pugh Singleton Yöntemi

Java 5 ve öncesi bellek modelindeki problemden dolayı singleton sınıfına eş zamanlı erişilmeye çalışıldığında sorunlar ortaya çıkıyordu. Bu neden Bill Pugh yardımcı nested sınıf kullanarak singleton yapısı oluşturdu. Böylece sınıfın instance’ı yardımcı sınıfta tutuluyor. Sadece sınıf çağırıldığı zaman yardımcı sınıftan faydalanılarak instance çağrılıyordu. Böylece sınıfın yüklenme zamanında instance oluşmuyor sadece erişilmeye çalışıldığında oluşturuluyordu. Bu yöntemle geliştirilmiş singleton patterni aşağıdaki gibidir:

Singleton sınıfı belleğe yüklendiğinde yardımcı inner sınıf belleğe yüklenmez. Sadece birisi getInstance metodunu çağırdığında yüklenir. Böylece senkronizasyon yapmaya da gerek kalmaz. Genelde en çok kullanılan java singleton patterni budur.

Kaynak: JournalDev

İyi kodlamalar,

185 total views, 0 views today

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Go Kurulumu ve PATH Ayarları (Linux)

Merhaba,

Linux üzerinde Go programlama ortamını kurmak için aşağıdaki adımları takip edelim.

1. Kurulum

  • Buradan en son go versiyonunu indirelim. (Yaklaşık 104mb)
  • İndirdiğimiz klasöre gelerek .tar dosyasını /usr/local içerisine aşağıdaki komutla açalım.
  • sudo tar -C /usr/local/ -xzf go1.9.1.linux-amd64.tar.gz

2. Ortam Değişkenlerini (PATH) Ayarlama

  • PATH ayarlarına go’nun kurulu olduğu yeri eklemek için $HOME/.profile dosyasını favori text editörünüzle açın.
  • sudo vim /home/codemania/.profile
  • export PATH=$PATH:/usr/local/go/bin  kopyalayıp yapıştırın. Böylece path değişkenine go eklenmiş olacaktır.

  • PATH değişkenine eklendiğini görmek için
  • source $HOME/.profile
  • echo $PATH komutlarını sırayla çalıştırın, eğer doğru şekilde eklediyseniz değişkenin sonuda /usr/local/go/bin/ görünecektir.

  • Sonrasında terminale go yazarak ortam değişkeninin çalıştığını gözlemleyebilirsiniz.
  • Önemli Not: Go’yu /usr/local içine açarsanız GOROOT değişkenini ayarlamanıza gerek yok. Başka yere kuracaksınız GOROOT ortam değişkenini de ayarlamayı unutmayın.

Bu kurulum sonucunda GOROOT ve GOPATH değişkenleri aşağıdaki gibi setlemiş olacak. Bu değişkenleri terminale go env yazarak görüntüleyebilirsiniz.

  • GOROOT = /usr/local/go
  • GOPATH = $HOME/$USER/go

Örneğin benim bilgisayarım için ortam değişkenleri:

Son olarak çalışma ortamımızı ayarlayalım.

  • mkdir $HOME/go  komutunu çalıştıralım.
  • Böylece home dizinimizde go klasörü oluşturacağız.

3. Test

Kurulumu tamamladık. Şimdi “hello, world” diyelim.

  • Çalışma ortamımızın olduğu dizine gelelim. Biz o dizini $HOME/go olarak ayarlamıştık.
  • O dizinin altında aşağıdaki komutları uygulayarak src/ ve hello/ dizinini oluşturalım.
  • cd $HOME/go
  • mkdir src
  • cd src
  • mkdir hello
  • cd hello

  • Favori text editörünüzü kullanarak aşağıdaki örnek kodu hello.go olarak kaydedelim.

  • go build yazarak hello.go programımızı derleyelim. Sonucunda hello adında çalıştırılabilir dosya çıkacaktır.

  • Son olarak hello programımızı çalıştıralım.
  • ./hello

Sonuç yukarıdaki gibi olacaktır. İyi kodlamalar.

Kaynakhttps://golang.org/doc/install

74 total views, no views today

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Go Kurulumu ve PATH Ayarları (Windows)

Selam,

Windows üzerinde Go programlama ortamını kurmak için aşağıdaki adımları takip edelim.

1. Kurulum

  • Buradan en son GO versiyonunu indirelim. (Yaklaşık 92mb).
  • Yükleme adımlarını takip ederek kurulumu tamamlayalım.
  • Kurulum sırasında farklı bir yer seçmezseniz Go ortamı C:\Go olarak kurulacaktır. Farklı bir dizine kurmak isterseniz o yerin adresini girin örneğin ben T:\Go olarak değiştirdim.

2. Ortam Değişkenlerini Ayarlama

  • Go kurulumu başarılıyla tamamlandıktan sonra test için Windows PowerShell’i açalım.
  • go yazıp enter’a basalım. Kurulum düzgün bir şekilde yapıldıysa sonuç ekrandaki gibi olacaktır.

Go kurulurken “GOROOT” isimli ortam değişkenini kurduğunuz dizine atayacaktır. Buna ek olarak çalışma dizinini ayarlamamız gerekiyor.

Ortam değişkenleri -> Sistem Değişkenlerine “GOPATH” değişkenini ekleyelim.

Çalışmak istediğiniz dizinde go workspace klasörü oluşturun. Örneğin ben “GoWorkspace” adını verdim.Siz de istediğiniz adı verebilirsiniz.

3. Test

GOROOT ve GOPATH değişkenlerini ayarladıktan sonra şimdi go ortamını örnek bir uygulamayla test edelim.

Daha önce oluşturduğumuz workspace için /src/hello/ adında yeni dizin açalım ve aşağıdaki kodu bu hello.go olarak kaydedelim

 

Programımızı kaydedip çıkalım ve dosyayı oluşturduğumuz klasörde powershell’i açalım.

“go build” yazalım. Böylece programımız derlenecek ve hello.exe oluşacaktır. Daha sonra hello.exe‘yi çalıştırarak aşağıdaki sonucu görelim.

 

Artık go ortamımız hazır. İyi kodlamalar 🙂

Kaynak:  https://golang.org/doc/install

78 total views, no views today

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Fastboot Flash Hatası ((bootloader) Data size exceeds download buffer) Çözümü

Merhaba,

Fastboot scripti ile image atarken bazı durumlarda aşağıdaki hata  ile karşılaşırsanız kesin çözüm için fastboot scriptini güncellemeniz gerekiyor.

Öncelikle android sdk’yı güncelleyelim. Daha sonra sdk/platform-tools/ içerisindeki fastboot scriptine sembolik link yapalım .

#sudo ln -sf [FULL_PATH_TO_ANDROID_SDK]/platform-tools/fastboot  /usr/local/bin/fastboot

komutunu çalıştıralım.

Örneğin benim bilgisayarım için:

sudo şifrenizi girdikten  sonra atacağınız image içerisindeki flash-all.sh komutunu kullanabilirsiniz. Artık hata vermeyecektir.

Windows içinse güncel sdk içerisindeki fastboot’u PATH’e eklemeniz yeterli olacaktır.

İyi çalışmalar,

112 total views, no views today

Facebooktwittergoogle_plusredditpinterestlinkedinmail