Python ile Çeşitli Yazılım Geliştirme Desenleri (Design Patterns)
İnsan programlamayı kendi çabalarıyla öğrenince, işin okulunu okumuş insanlardan bazı konularda eksik kalıyor. En azından ben böyle hissediyorum. Hem aradaki açığı kapatmak, hem de kendimi geliştirmek adına, birkaç yazılım geliştirme deseni öğrenmek ve bunları Python ile uygulamaya geçirmek istedim. Bunu yapmanın hem kendi gelişimime faydası olacağını düşünüyorum, hem de bunu okuyan birkaç kişinin, en azından konuya giriş yapmış olması açısından, işini kolaylaştıracağını zannediyorum.
Singleton
Bu desende, bir sınıfın sadece tek bir sınıf örneği (class instance) oluşturmasını sağlayacak bir mekanizma oluşturuyoruz.Böylece programın tüm parçalarının tek bir obje üzerinden işlem yapmasını sağlayabiliriz1. Benim uygulamam şu şekilde oldu.
Burada, instance
isminde bir sınıf değişkeni tuttum. Bu
sınıf değişkenini None
olarak ayarladım. Bildiğiniz gibi,
__new__()
metoduyla yeni bir sınıf örneği oluşturulmasını
kontrol ediyoruz. Burada, eğer instance
değişkeni
None
ise, yeni bir örnek oluşturup, bunu
instance
değişkenine atıyorum. Daha sonra, her yeni sınıf
örneği oluşturulmaya çalışıldığında, daha önce oluşturmuş olduğum örneği
döndürüyorum.
__new__()
metodu her çalıştığında, eğer bir sınıf örneği
döndürüyorsa, __init__()
metodu da çalışıyor. Bu yüzden,
her seferinde __init__()
metodunda yapılan işlerin
yinelenmesi, her yeni sınıf çağırılışında, burada tanımlanan değerlerin
sıfırlanması anlamına geliyordu. Bu yüzden, örneğe ait yeni bir değişken
oluştururken, bunun daha önce var olmadığından emin olmak gerekiyor.
Böylece üstüne yazmamış oluyoruz.
Bir google aramasıyla birkaç farklı singleton uygulanışı bulmak mümkün. Benim bulduklarım arasından en ilginç gelen bir SO sorusundaki dekoratör fonksiyon. Ancak yine de, kendi yazdığım şekli bana daha düzgün bir kodlama gibi geliyor. Tabii ki bunlar kişisel görüşlere bakan şeyler.
Sorumluluk Zinciri (Chain Of Responsibility)
Bu yöntem zannımca en çok olay yönetiminde kullanılıyordur. Örneğin arayüz uygulamalarının çeşitli klavye ve fare olaylarını halledişi gibi. Bu desende, bir objeden bir iş istediğinizde, mesela bir tuşa basılma olayının halledilmesi gerektiğinde, eğer bu işi kendi üstlenebiliyorsa, kendi üstleniyor, yoksa, ebeveyn objeden bu işi yapmasını istiyor. Ebeveyn obje de aynı şekilde kendisi yapamıyorsa, bir üst objeye yönlendiriyor ve böylece bir sorumluluk zinciri oluşturulmuş oluyor. Bu deseni uygulamak için, oluşturduğumuz objenin iki yapıyı kurması gerekiyor. Birincisi, hangi işi yapabileceğine karar vermek için gereken bir mantık, ikincisi de ebeveyn objeye ulaşması için gereken bir erişim noktası. Gerçek hayatta kullanılamayacak kadar aptal bir örnek olsa da, şöyle birşey yazdım bununla ilgili:
Burada, aslında hiçbir işe yaramayan bir sınıf tanımladım. Bu sınıfın,
canHandle
listesi, bu sınıfın hangi yazıların
işlenmesinden yükümlü olduğunu belirtiyor. Daha sonra, bu sınıftan miras
alan iki yeni sınıf daha tanımladım. Bunlardan birinin işi "osman"
kelimesini işlemek, diğerinin işi de "orhan" kelimesini işlemek gibi
düşünebilirsiniz. Bu sınıfların yeni bir örneğini oluştururken, hangi
sınıfın bunun ebeveyni olacağını belirleyebiliyoruz. Eğer belirtmezsek,
bu sınıf en tepe sınıfmış gibi kabul edilecek. Herhangi bir sınıfın
handle(string)
metodu çağırıldığında, kendisi bu yazıyı
işleyebiliyorsa işleyecek, işleyemiyorsa, bir üst objeye gönderecek.
Tepeye kadar işlenmeden gelirse, ve tepe obje de bunu işleyemezse,
öntanımlı metod (defaultHandler) çalışacak.
Ara objeler (Proxy)
Bu desende, asıl objeye, başka bir obje üzerinden ulaşılıyor. Bunun amacı, asıl objeye erişimi kontrol etmek. Asıl objeye erişimi neden kontrol etmek isteyeceğiniz programınızın gereksinimlerine göre değişir. Ben göstermelik olsun diye, şöyle birşey yaptım.
Burada kullandığım yöntemin herhalde en can sıkıcı noktası çift alt
çizgili bütün metotların tek tek üzerine yazmanın gerekliliği. Çünkü, bu
metotları çağırmak için __getattribute__()
metodu
kullanılmıyor. Bunun üstesinden gelmek için, zannediyorum bir çok
akrobasi yapılabilir, ancak, onlara girmeye yeltenmeyeceğim bile.
Düzenleme: Onun için de şöyle birşey düşündüm: