Nesne Yönelimli Programlama -7- Event ve Delegate Methods

Merhaba ey yazılıma gönül verenler… Nesne yönelimli programlama yazı dizimize kaldığımız yerden devam ediyoruz. Bu yazımda sizlere, OOP’nin anlaşılması belki de en zor konularından biri olan event (olay) ve delegate (delege) metodlardan bahsedeceğim.

Öncelikle, sınıf üyelerinden biri (diğerlerini biliyorsunuz zaten –özellik ve metodlar) olan olayları yazmaya neden ihtiyaç duyarız buradan başlayalım… Olay üyesinin tanımını şöyle yapalım; “nesnenin başına gelebilecek herşey bir olaydır”. Örneğin, Button nesnesinin tıklanması (click), sanırım bu nesnenin başına en çok gelecek şeylerden biridir. Siz bir programcı olarak, button nesnesinin click olayını veya bir başka olayı, “canınız isterse” ya da daha doğrusu, “işinize yarayacaksa” kullanırsınız öyle değil mi?

Tam olarak burada, bir şişman adam örneği gelsin… Normal bir günde yağmur yağması bir olaydır sevgili dostlarım. Siz, bu olaya nasıl yanıt verirsiniz? Bazılarımız şemsiyesini açıp ıslanmaktan korunurken, bazılarımız ise romantik bir yürüyüş yapar. O zaman şöyle diyebilir miyiz; “her olay bir metodu çağırır”. Bu metodun ne yapacağına ise siz karar verirsiniz. Ama bir dakika! Bu metodun, bazı parametrelere ihtiyacı yok mu sizce? Örneğin; yağmurun şiddeti, o an nerede olduğunuz gibi bazı değerleri dikkate almak istemez misiniz?

O halde, olay herhangi bir metodu değil; önceden belirlenmiş, bu olayı yakalamak için yetkilendirilmiş (delege edilmiş) bir kalıba uygun bir metodu çağıracaktır.

Sanırım, hala “neden olay yazarım” sorusuna net bir yanıt vermedim. Şöyle ifade edelim; yazdığınız bir nesnenin, gerçekleştireceği bir eylemin sonucunda, başka bir metodu tetiklemesini ve bu metodun sizin (ya da nesnenizi kullanan başka bir programcının) o anda istediğiniz işlemi yapmasını isteyebilirsiniz. İşte bu isteğinizi gerçekleştirmek için, o nesneye olay yazarsınız…

Yukarıdaki soyut cümleyi, bir örnekle açıklayalım. Veritabanı ile çalışan ve içerisinde kabaca ekleme,silme ve güncelleme işlemlerini yaptığınız bir nesne yarattığınızı ele alalım. Bu nesne; ekleme işlemini gerçekleştirdiğinde siz, kullanıcıyı bilgilendirmek, veritabanında başka bir sorgu çalıştırmak, yapılan işlemi bir dosyaya kaydetmek veya başka herhangi birşey yapmak istiyorsunuz. O halde bir, “eklendi” olayı yazarsınız, bu olayın bir metodu çağırmasını sağlar ve o metoda canınız ne yaptırmak istiyorsa yaptırırsınız.

Şimdi, yukarıdaki yağmur örneğinde belirttiğim,”delege edilmiş bir kalıp” a bir kez daha dikkat çekmek istiyorum. Az önce ihtiyaç duyduğumuz “eklendi” olayının çağıracağı metot, sizin belirlediğiniz bir kalıba uygun olmalı. Çünkü, çalışacak olan metot, yine sizin belirlediğiniz parametrelere ihtiyaç duyabilir. Mesela, hangi datayı eklediniz, saat kaçta eklediniz, eklenen datanın oluşan son id değeri nedir gibi… Madem bunları istiyorsunuz, o halde bunu yapabilmenin sırrını vermemin zamanı geldi; bir olay yazmak istiyorsanız, önce o olayın çağıracağı metodun kalıbını, yani delege metodunu yazmak zorundasınız.

Peki, madem ki delege metodumuz bazı değerlere ihtiyaç duyuyor (yukarıda belirttiğim ihtiyaçlar), o zaman bu değerleri tutan bir sınıf tanımlarız ve bu sınıfı da delege metodun parametresi olarak kullanırız. Böylece bu kalıba uygun metot da bu parametreyi içermek zorunda kalır. İşte bu amaç için yazılan sınıflar, olay argumanları anlamına gelen EventArgs olarak adlandırılılır ve aynı isimli sınıftan kalıtım yoluyla türetilirler. Yine geleneksel olarak, bu argumanlara “e” ismi verilir.

Birazdan kod örneklerine geçeceğim ama ondan önce, birşeyin altını çizmek istiyorum, delegate methods, .NET Framework’ün en önemli yapı taşlarından birisidir ve sadece olay mimarisi için kullanılmaz, çok farklı konseptlerde de karşımıza çıkabilir ama gelin bunu başka bir makaleye bırakalım…

Bir delegate metod, kesinlikle bir sınıf üyesi olmak zorunda değildir. Bu nedenle genellikle namespace alanında tanımlanır. Ancak ben –konu event olduğu için- classın içinde tanımlayacağım.

Senaryomuz, az önceki örnekte olduğu gibi, veritabanına kayıt ekleme üzerine olsun…

Buyrun o zaman;

Önce, delege metodumuzun kullanacağı EventArgs sınıfımızı yazalım.

Konunun özünden uzaklaşmamak için oldukça sade bir EventArgs sınıfı oluşturdum. Şimdi, olay yazacağımız sınıfımıza geçelim.

İşte o kadar dil döküp, anlattığımız şeyin koda yansıması bu kadar 🙂 İşin esprisi bu. Peki ama, bu olay nasıl ve ne zaman fırlayacak? Bunun en net cevabı şudur, “siz istediğiniz zaman ve istediğiniz şekilde”. Buradaki sevimli olayımız, ürün ekleme işlemi bittiğinde fırlayacak. Bunu birazdan yazacağım ama, burada çok önemli bir noktanın üzerinde durmak istiyorum. Bir soru sorarak duruma parmak basalım; “yakalamadığınız bir olay tetiklenir mi?” Cevap hayır. Yani, button nesnesinin Click olayını yakalamazsanız, o olay tetiklenmez. Bunun sebebi şu; eğer bir olay, delegate metoda (kalıba) uygun bir metod ile ilişkilendirilmezse o olay fırlatılmaz. Bunu kontrol edebilmek için biz de fırlatıcı bir metod yazarız. Bu metod, elbette UrunIslemleri sınıfına özel olmalıdır.

Artık fırlatıcımız da hazır olduğuna göre, fırlatalım gitsin…

İşte şimdi, yazılarımın vazgeçilmez anı, kodu test etme zamanı… Bunu yaparken form uygulaması kullandım sevgili dostlarım.

Bakın “islem” nesnesinin UrunEklendi olayı ile, “islem_UrunEklendi” metodunu, “+=” operatörü kullanarak birleştiriyorum. Bunu yaparken, “UrunEklendiEventHandler” kalıbı ile “islem_UrunEklendi” metodunun uyumlu olması gerektiğine de dikkat ediniz.

Hemen bir ipucu vererek sizi rahatlatalım… Bir nesnenin olayına eriştikten sonra += operatörünü yazdıktan sonra iki kez “tab” tuşuna basarsanız, bu kodu sizin yerinize yazacak ve hatta metodu da oluşturarak, size büyük bir kolaylık sağlayacaktır…

Ve şimdi ürünümüzü ekleyip sonucuna bakalım:

İşte sevgili dostlarım. Nesne Yönelimli Programlamanın önemli parçalarından birinin daha sonuna geldik… Umarım bir nebze faydam olabilmiştir.

Görüşmek üzere

Türkay ÜRKMEZ

8 thoughts on “Nesne Yönelimli Programlama -7- Event ve Delegate Methods

  1. 7 Makalelik bu seride, OOP’a dair unuttuklarıma, ihtiyaç duyduklarıma cevap buldum. Emeğinize sağlık hocam teşekkürler.

  2. türkay hocam delegate en çok çeliştiğim nokta şu.Delegate methoduyla madem bir olayı tetikleyip istediğimiz kodları çalıştırıyorsak.Aynı işlemi A fonksiyonu içinden B fonksiyonu çağırarakda yapabiliyoruz farkını anlamadım!

Leave a Reply