Singleton Desing Pattern

Singleton patterni ile bir nesnenin çalışma zamanında tek olmasını garanti edebiliriz. Böyle söyleyince kafamızda bir şeyler canlanmadıysa daha somut örnekler veriyim. Örneğin;

  • veritabanı kullandığımız uygulamalarımızda connectionString bilgisini okumak için kullanabiliriz.
  • Projemizdeki konfigürasyon bilgilerini okumak için de kullanabiliriz.

 

İmplementasyonu çok basit. Aşağıdaki UML şemamızı inceleyerek işe başlayalım.

  • Singleton isimli bir class oluşturduk.
  • Bu class’ın constructorını private olarak tanımlıyoruz. Bunun sebebi ise herkes Singleton singleton=new Singleton() şeklinde belleğe yeni bir nesne yaratmasını engellemek.
  • Yine private olarak Singleton tipinde bir _instance yaratıyoruz.
  • Bu nesneye ulaşmak için ReturnInstance tipinde public bir metot yazıyoruz.
Bu şekilde classımız yazmış olduk. Ama asenkron işlemlerde kullanmak istersek bu metodumuzu thread safe hale getirmeliyiz. Bunu da lock koyarak halledebiliriz.
 

 

Nesne Yönelimli Programlama – 2 Encapsulation

Bu yazımda encapsulation (kapsülleme) konusuna değineceğim. Bir önceki makalemde bahsettiğim Telefon sınıfını hatırlayalım. Sınıfımızın içinde bulunan özellikleri public erişim düzenleyicisi ile tanımlamıştık. Bunun bize yaratabileceği bazı sıkıntılar var. Mesela telefonun rengini başka yerden değiştirebiliyoruz. Peki bunu aşmak için ne yapabiliriz?

Bunu aşmak için ilk olarak değişkenlerimizi private yapabiliriz. İçerideki değişkenlere erişmek için ise public metotlar yazabiliriz. Nasıl mı?

Aslında burada yaptığımız şey bir kapsülleme işlemi. Gerçek dünyadan örnek vermek gerekirse; televizyon kumandalarının içerisinde çeşitli devreler, pil yuvası vardır. Ama bunların hepsi bir kapak ile dış dünyadan, son kullanıcıdan soyutlanmıştır. Çünkü içerisinde ne bulunduğu bizi pek de ilgilendirmez. Kanalları değiştirmesi sesi açıp kapatması yeterlidir bizim için.

Peki biz her özellik için oturup metot mu yazmalıyız? Yok mu bunun daha kolay bir yolu? Elbette var. Belkide daha önceki projelerimizde de çokça kullandığımız property kavramı devreye giriyor. Yukarıdaki kodu property kullanarak tekrar yazalım.

Yukarıdaki get ve set bloklarından sadece birini kullanarak read-only ya da write-only özellikler yaratabiliriz. Kısa yol kullanmak isteyenler ise pro tab tab yaparak property yaratabilirler.

Nesne Yönelimli Programlama – 1

Merhaba arkadaşlar nesne yönelimli programlama(object oriented programming) konusunu birkaç makale altında anlatmaya çalışacağım. C#.Net ile program yazmaya başlayanlar bu dilin nesne yönelimli olduğunu duymuştur. Peki nedir bu nesne yönelimli programlama? Ya da neden ihtiyaç duyarız?

Aslında OOP yaklaşımı özü itibariyle insanı taklit eder. Dünya üzerindeki ilk insanlar, kendi ihtiyaçlarını kendileri karşılamak zorundaydılar. Uzun yıllar geçtikten sonra yani toplum kavramı ortaya çıkmaya başladığında insanlar belirli alanlarda branşlaşmaya başladılar. Bu branşlaşma ile birlikte insanlık çok daha hızlı gelişti. Bununla birlikte de insanların ihtiyaçları çok fazlalaştı.

Telefonun icadını örnek vermek gerekirse Graham Bell telefonu icat etti. Telefon seri olarak üretilmeye başlandı. Zaman geçtikçe, telefona yeni özellikler eklendi. Telefonun en ilkel halinde bulunan özelliklere “yeniden kullanılabilirlik” diyebiliriz. Ayrıca zamanla gelişen ve ortaya çıkan özelliklerine de “geliştirilebilirlik” diyebiliriz.

Gelin biraz da programlama mantığıyla işe yaklaşalım… OOP öncesinde; binlerce belki on binlerce satır kod bulunan yazılım ürünleri o zaman da vardı. Bu yazılımları geliştiren insanlar; aynı işi yapacak kodları tekrar tekrar yazdılar. Bu da maliyeti çok artırdı. Çünkü en ufak bir değişiklik bile kodda büyük değişimlere neden oluyordu. Artan yazılım talebi de doğal olarak karşılanamıyordu.

İşte tam bu noktada OOP mantığı devreye girdi. Tıpkı insanların zamanla branşlaşması gibi kodlar da kendi aralarında görevlerine, yaptıkları işlere göre bölümlere ayrıldılar. Bu bölümlere class(sınıf) dersek yanlış olmaz. Biz bu sınıflardan nesneler üreterek ihtiyacımız olan yerlerde kullanmaya başladık. Hem de tekrar tekrar aynı kodları yazmadan.

Yukarıda verdiğim örneği dikkate alarak bir telefon satıcısının kullanacağı programı yazacağımızı düşünelim. Bu tip bir projede telefon nesnesine ihtiyacımız olacak. Peki bu telefonun ne gibi özellikleri olmalı?

  • Marka
  • Model
  • İşlemci
  • Kamera
  • Renk
  • Fiyat

Yukarıdaki özellikler şimdilik yeterli. Bu özelliklere sahip bir telefon nesnesi oluşturalım.

Şimdi Telefon nesnemizi yaratalım ve özelliklerine erişmeye çalışalım.

Gördüğünüz gibi Telefon nesnesi üzerinde tanımladığımız özelliklere erişemedik. Çünkü nesnemizin içindeki özelliklerin erişim düzenleyicisi(access modifier) private yani özel. Bu özelliklerin başına public yazar isek erişim sağlayabiliriz.

Şimdi de yarattığımız nesnemize özellikler ekleyelim.

Basit olarak nesneler bu şekildeler. Peki yukarıda atağım özelliklerden mesela rengi daha sonradan birisi siyah yapar ise ne olacak? İşte tam burada “encapsulation” kavramı devreye giriyor. Bu da bir sonraki makaleme kalsın.