Object Oriented Programming Events & Delegate Methods (Olaylar ve Delege Methodları) Ders 6
Merhaba,
Bu yazımda başlıktanda anlaşılacağı üzere Events ve Delegate Methods konusunu işleyeceğim. Aslında OOP temelleri arasında ne mantıkla olduğunu bilmesemde zor bir konu olarak düşünülür. Halbuki mantığı ve kullanımı gayet basit bir yapıdır. Kod kısmına geçmeden önce sizlere bir kaç örnek ile konuyu açıklamak istiyorum.
Event = olay
Yani bir durum, olay vs gibi düşünebiliriz. Programlama mantığında düşünür isek misal bir buttona basmamız, buttondan mouse’ı çekmemiz, bir textbox’a yazı yazmamız. Gerçek hayat üzerinden gidersek. Karnımızın acıkması, Yorulmamız, akÅŸam eve yorgun gelmemiz, eÅŸimizle kavga etmemiz…. gibi gibi gibi. Bunların hepsi birer olaydır. Umarım kafamızda bir ÅŸeyler canlanıyordur. Peki ben diyorum ki yukarıda saydığım her bir olayın bir sonraki aÅŸaması olabilirde olmayabilir de. Yani ;
Acıktığımızda yemek yiyebilirizde, yemeyebilirizde
Ya da EÅŸimizle kavga ettikten sonra gidip özür dileyebilirizde dilemeyebilirizde…
Buraya kadar olan mantıkta eğer bir olay oluyor ise olduğu an itibari ile başka bir methodu tetikleme durumu var ise işte bunada Delegate Methods diyoruz.
Yani ;
Olay 1. Acıktık
Delegate method (Acıktıysan yemek yersin)
Method 1 : Yemek ye
Bu örnekten anlaşılacağı üzere eğer bir event bir başka methodu tetikliyor ise bu tetikleme işlemini yapan methoda biz Delegate Method diyoruz.
Kodlamaya başlamadan önce ne yapacağımızı bir planlayalım.
- İlk olarak tetikleyici bir mekanizmaya ihtiyacımız var. Yani acıkmamız. Buna birde parametre tanımlayalım. Örn: Mide gurultusu J
- Sonrasında Tetikleyiciyi dinleyecek bir mekanizmaya ihtiyacımız var. Yani acıkmama istinaden hemen aksiyon alacak bir yapı. OnAciktiysam
- Tetiklenen bir mekanizma lazım. Gel sana yemek ısmarlıyım.
Yapıyı 3 işlem gibi basit bir yapıya indirdik. Şimdi girelim kodumuza ;
1 2 3 4 5 6 7 8 9 10 |
public class AcikmaDurumlariEventArgs : EventArgs        {            public string MideGurultusu { get; set; }            public AcikmaDurumlariEventArgs(string gurultu)            {                MideGurultusu = gurultu;            }        } |
İlk olarak mide gurultusunu tanımladık. Buna bizim olayımızın propertyleri  gözü ile bakabiliriz. Yani mide gurultusu, soğuk soğuk terleme, halsizlik gibi. Bunları neden anlatıyorum burada belirttiğimiz tüm propertyleri parametre olarak kullanabiliriz.Bunların hepsi acıkma olayımızın parametreleridir.
Şimdi acıkma işlemimizi ve acıktığımız anda devreye girecek olan öneri yapımızı yazmaya başlayalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class AcikmaDurumAnalizi        {            public delegate void AcikmaEventHandler(AcikmaDurumlariEventArgs e);            //delegate methodumuzu oluşturduk, parametre olarak ben sadece miğde gurultusunu tanımlamıstım yukarıda ancak orada ne kadar parametre var ise hepsini alabilir yapıda olduğundan neden bir tane diye sormayın istediğiniz kadar parametre tanımalayabilirsiniz.            public event AcikmaEventHandler AcikmaYakalayici;            //burada acikmakontrol methodumuzu izleyip çalıştığı anda diğer methoduda devreye alacak olan yakalayiciyi tanımlıyoruz..            private void OnAciktiysam(AcikmaDurumlariEventArgs e)            {                if (AcikmaYakalayici != null)                {                    //burası normal methodumuz çalıştıktan sonra çalışacak olan yani tetiklenecek olan method.                    MessageBox.Show("feci acıkmışsın yemek ye bence bak midenden gelen ses bu " + e.MideGurultusu);                }            }             public void Aciktim (string midegurultusu)            {                MessageBox.Show("Bildiğin acıktım");               //burası asıl calısan methodumuz. Burada ister bir database de veri girişi yapalım, ister bir şeyler sildirelim. Konunun ne olduğunun önemi yok. Burada ana methodumuz bulunmaktadır.                AcikmaDurumlariEventArgs e = new AcikmaDurumlariEventArgs(midegurultusu);                //burası acıkma yakalayıcının çalıştığı nokta. Bu method çalışır çalıştığı gibi onaciktiysam methoduda çalışır.                OnAciktiysam(e);            }        } |
Buraya kadar olan kısımda ilk olarak mide gurultumuzu tanımladık.Bu datayı parametre olarak alıp gönderebilmek.
Acıkma kontrol methodumuzu oluşturduk. (Bu method bizim main methodumuz yani tüm yapı aslında bu method çalışınca çalışacak şekilde işlemektedir.)
Acıkma kontrol methodumuz çalıştığı anda çalışacak olan onaciktiyasam methodumuzu oluşturduk.
Aslında tüm yapıyı kurduk şimdi sıra geldi çalıştırmaya.
Formumuzun load eventinin içerisine ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
  private void Form2_Load(object sender, EventArgs e)        {            AcikmaDurumAnalizi yyi = new AcikmaDurumAnalizi();            yyi.AcikmaYakalayici += new AcikmaDurumAnalizi.AcikmaEventHandler(yyi_AcikmaYakalayici);            yyi.Aciktim ("gguuurruuuurrgghhh");        }        //Hemen altınada (yyi.AcikmaYakalayici += yazdıktan sonra 2        //kere tab tuşuna basarsanız aşağıdaki method otomatik oluşur. Hemen içindeki        //throw new NotImplementedException(); exception fırlatma mekanizmasını        //silerseniz yukarıda tanımladığımız OnAciktiysam methodu çalışacaktır.         void yyi_AcikmaYakalayici(Form2.AcikmaDurumlariEventArgs e)        {         } |
Gördüğümüz üzere formumuz load olduğunda karşımıza bir yes no messagebox’u hemen ardından da onAciktiysam methodunun altındaki
1 |
MessageBox.Show("feci acıkmışsın yemek ye bence bak midenden gelen ses bu " + e.MideGurultusu); |
Uyarısı karşımıza gelmektedir.
Umarım yapıyı anlatabilmişimdir. Aslında konu çok basit ancak anlatımlar nedeni ile karmaşık gözükmektedir.
Bu yapı eğer bir database ile çalışıyor iseniz trigger yapısına benzemektedir. Bir insert sonrası git şu işlemi yap gibi. Genelde ben sql tarafında trigger leri kullanmaktayım. Ancak bunu program tarafında yapmak istiyor isek örneğin loglama işlemlerini events ve delegate method kullanımı biçilmiş kaftandır.
Konu hakkında dilediğiniz zaman benimle irtibata geçebilirsiniz. Bir sonraki yazımızda Abstract class yapısını inceleyip üzerine örnekler geliştireceğiz.
İyi Günler Dilerim,