Makale Özeti

Event istediğimiz bir olay meydana geldiği zaman o olayı tetiklemek için kullanacağımız kısımdır . Makale boyunca bir aracın devir gecislerini ve vites arttır ım şekillerini inceleyeceğiz .

Makale

Event ve Olay Güdümlü Programlama Mantığı

Event istediğimiz bir olay meydana geldiği zaman o olayı tetiklemek için kullanacağımız kısımdır . Makale boyunca bir aracın devir gecislerini ve vites arttır ım şekillerini inceleyeceğiz . Örneğimizde aracımız 1. vitesten başlayacak ve hız ibresi sona dayanana kadar vitesler arasında geçişler yapıcağız . Vites arasını hesaplama kısmında ilk devir kısmını bizim belirlememiz gerekecek ki arac tipimiz vites geçişlerini ilk bizim verdiğimiz değere göre yapıp daha sonra kendisi hesaplayacaktır . Biz ilk default değeri 30 verdik. Buna oranla arka tarafta bir adet for döngüsüne hız için ve bir kaç tane if ifadesine ihtiyaç duyacağız . en önemli olan if tabiî ki olayımızı tetikleyecek event kontrol if deyimimiz olacaktır .

Bu kadar anlatımdan sonra artık kontağı çevirmeye başlayalım :)

Araç tipimiz içinde bizden örnekler iken aracın marka model ve model uzantı max hız değerlerini isteyecektir .

Simdi araç tipimizi oluşturalım .

Arac.cs

public Otomobil(string marka, string model, string modeluzanti, int hiz)
{
this.Marka = marka;
this.Model = model;
this.ModelUzanti = modeluzanti;
this.Hiz = hiz;
}

Yukarı dada görüldüğü gibi araç tipimizin ctor tarafından örneklenmek istenirken bizden istediği değerler verilmiştir . bu veriler esliğinde otomobil tipimizi örnekleyelim .

Otomobil YeniArac = new Otomobil (“Renault”,”Megane”,”Hb 5Kp 1.6 Auth”,220);

İfadesi ile aracımızın markasını modelini model uzantısını ve max hız değerlerini belirlemis olduk .
[ Property ve ToString() ezme kısımları örnek kodun içerisindedir burada sade bir tip tasarımı yaptık ister isek bunu indexer ve comparable interface ekleyerek daha da geliştirebilir kalıtım yolu ile dallandırabiliriz . ]

Simdi aracımızı yola almanın zamanı geldi .

Yol.cs

Yolumuzu belirlemek için ilk önce yolun adını verelim bos olarakda yola cikarta biliriz aracımızı ama biraz daha göze güzel gözükmesi açısından yol kısmını da tasarlayalım …

public Yol(string YolAdi,int uzunluk)
{
this.Yoladi = YolAdi;
}

Yukarıdaki şekilde sadece yol tipimizi oluşturmak için string değer içeren yol adı tanımı girmemiz şimdilik yeterli olacaktır . Daha fazla geliştirmek istersek bu yol tanımlarını enum enumda belirlediğimiz yol tanımlarının değerlerini değiştirerek yol uzunluk seklinde kullanabiliriz . ve random anahtar söz dizimini kullanarak makineye random ( rasgele ) yol seçtirebiliriz.

Simdi yol tipimiz içinde araç tipimizi çağıralım .

Bunun için bize bir adet metot ve alacağı değer otomobil tipinden bir parametre gerekecektir.

public void KontagiCevir(Otomobil OtoAl)

Yukarıdaki gibi KontagiCevir Metodumuz parametre olarak Otomobil tipinden OtoAl parametresi istemektedir .

Bu metot içerisinde for döngümüz hız kadar dönecektir . her döndüğü hız için bize bilgi verecektir .

For içinde tanımladığımız i değeri bizin o andaki hızımıza oranla değişecektir.

Örnek olarak :


for (int i = 0; i <= OtoAl.Hiz; i++)

otoal.hiz değerimiz bizim aracımızın max değeridir . i değeri küçük eşitse otoal.hiz kadar dönecektir . içerisinde if deyimlerimiz ile kontrollerimizi yaptırdık . ama bundan önce en önemli ihtiyacımız bir adet delegate ve bir adet event gerekecektir .

simdi bir delegate tanımlayalım ve bir adet event ardından tanımlayalım

namespace Arac
{
public delegate void VitesDegistir();

arac tipimiz içerisinde bir adet VitesDegistir delegate tanımladık bu delegate bizden geri dönüş değeri void olan ve parametre almayan metotları temsil edecektir. Ama biz burada bir event yardımı ile sadece event üzerinden işlem yapacağız . event arka alanda delegate imizi tetikleyecektir . buda olay güdümlü programlamanın en basit mantığıdır .

Şimdi yol tipimizin içerisinde bir olay tanımlayalım .

public event VitesDegistir DegistirHandle;

Yukarıdaki event tanımlamasına dikkat edelim . [ erişim belirleyicisi ] event [temsilci] [event vereceğimiz isim ] olarak tanımlanır . Bir event kendisine bağlı olan bir delegate ‘ e ihtiyaç duyar . Çalışma prensibinde ben olayı yakalarım ve bunu temsilciye bildiririm der . event tanımlamayı burada ispiyoncu bir çocuk gibi görebiliriz . Program içinde oluşan hatayı

yakalar ve direk delegate e haber eder . :) Delegate de kendisine bağlı olan metotları çalıştırır . Biraz garip bir örnek oldu kabul ediyorum .

Simdi Kontagi Cevir metot umuzu inceleyelim tüm olaylar burada olacaktır .

public void KontagiCevir(Otomobil OtoAl)
{
for (int i = 0; i <= OtoAl.Hiz; i++)
{
System.Threading.Thread.Sleep(500); // Sistemi Yavaşlatıyoruz .
Console.WriteLine("Marka {0} Model {1} ModelUzanti {2} Su andaki Hızı {3} Vites {4}", OtoAl.Marka, OtoAl.Model, OtoAl.ModelUzanti, i, Vites);

yapilanhiz++;
if (i == Devir) { Vites = Vites + 1; Devir = Devir + 30; }

if (i >= Devir-5 && i <=Devir)
{
if (DegistirHandle != null)
{

DegistirHandle();
}

}
}

Adım, adım ilerleyelim ..

1. kontagiCevir metot tanımlanır iken bizden bir adet örneklenmiş otomobil tipi istemektedir. Değeri verdik ve işlemler başladı .

2. System.Threading.Thread.Sleep(500) işleminde sisteme belirttiğimiz değer kadar yavaşlamasını isteriz bunu yapmamızın tek nedeni bu yordam için sonucu biraz daha yavaş görmek yakalanan eventların çağırdığı temsilcilerin olaylarını daha iyi şekilde incelemek içindir . System.Threading name space ini use kısmı ile yukarı dada tanımlayabilirdim ama yordamımın sadece bu kısmında kullandığım icin namespace tarafımı fazla karıştırmak istemedim .

3. Console.Writeline ile değerlerimizi ekrana bastırdık . metot baslarken otomobil tipinden bir örnek aldığı için console.writeline tarafında bu değerlere ulaşıp ( bunun nedeni property kısımlarında public olarak tanımlanmış olmaları yani dış dünyaya kontrollü açmak ) bunları ConsoleWriteline tarafında bastırdık değişen değerimiz i değeridir . for döngümüz içerisinde { } arasında yaşayacaktır.
4. Yapılan hız bu kısımda yapılan hız değişkenimizi aslında otoal.hiz değerimiz ile aynı olacaktır bunu burada belirtmemizin tek sebebi ilerleyen makalelerde yapılan hız için başka değerler aldırıp belki yakıt durumunu kontrol ettirmek ve benzin biterse aracı durdur gibi işlemler yaptırmamız olabilir .

5. Eğer i eşit ise devir ( if (i == Devir) {içerik}) kısmında yol tanımlaması yaparken ilk devir işlemini belirledik 30 olarak atadık eğer i 30 ise vites 2 olmak zorundadır yani

araç artık bizden devir istemektedir . burada şunuda yaptık yeni devir değerini bulmak bunun içinde devir = devir + 30 ; [ devir += 30] şeklinde bir bildirimde geçerli olacaktır . ] bu tanımlama bizim bir sonraki devir değerimizi devir değişkenimize yazar ve if ifadelerimiz artık yeni devir değeri üzerinden işlem yapar .

6. if (i >= Devir-5 && i <=Devir) kısmında ise eğer i değeri büyük veya eşit ise devir – 5 ( ilk devir için düşünür isek 30-5 = 25 ) ‘ e eşit ise && (ve) i değeri devir (30)’ a eşit veya küçük ise 25 ile 30 arasındaki durumlarda ilk devir için düşünüyoruz . aşağıdaki işlemleri yap …

7. if (DegistirHandle != null) event bos değil ise bunu nesnelerimizi program.cs tarafında örnekleri iken inceleyeceğiz ve bu bizim olay yakalamadaki en önemli kısmımızdır .

8. DegistirHandle(); artık olayımız tüm koşullarımıza uydu simdi sıra artık yakanmış değeri temsilcimize delegate imize bildirmeye geldi ama biz bunu bildirmeden once biraz bunun üzerinde duralım. Nedir bu () parantezler arasına birşey yazılmaması mı gerekiyor . ?

DegistirHandle(); ile event tetikledik arka alanda event da gitti temsilciye bu bilgiyi verdi eğer temsilcimiz int a tipinden bir değer isteseydi ve event ımızda ona oranla bizden bir int a tipinde değer istemiş olsaydı biz u () parantezler arasına değerimizi verip o şekilde çalıştırmak zorunda kalacak tık ama vites delegate ve vites işlemlerini gerçekleştiren event bizden geri dönüş değeri olmayan ve parametre almayan bir metot istediği için biz burada herhangi bir tanımlama yapmadık .

Şimdi Program .cs tarafında örnekleme kısımlarına gecelim ve nesnelerimizi oluşturalım yolumuzu hazırlayalım event bağlayıp kontağı çevirelim ..

1. Otomobil Yeni = new Otomobil("Renault", "Megane", "Hb 1.3", 220);
2. Yol YeniYol = new Yol("E-5");
3. YeniYol.DegistirHandle += new VitesDegistir(YeniYol_DegistirHandle);
4. YeniYol.KontagiCevir(Yeni);

Simdi sırasi ile islemlerimizi tamamlayalım .

1. Otomobil nesnemizden bir örnekleme yardımı ile otomobil değerimizi oluşturduk değerimizin stack kısımda duran pointer adı Yeni olarak belirledik ve heap kısmındaki değerlerimize point ettik artık heap tarafında duran değerlerimize bu pointer kullanarak ulaşacağız .

2. Yol tipimizi oluşturduk tanımlama kısmında görsellik acısından yolun adını girdik içerde default ctor çalıştırdık ve yol tipimiz oluştu yol pointer sayesinde kontağı çevirme işlemlerine ulaşacağız çünkü metodumuzu statik olarak belirlemedik ve nesne create edildiği zaman alt metot olarak ulaşacağız .

3. YeniYol.DegistirHande += new vitesdegistir(YeniYolDegistirHandle) kısmında iste event olayı yakalayacağı zaman delegate kısmına eklediği metodu belirtmiş olduk bu kısım’a kadar delegate event ı event delagate i biliyordu ama ikisi de neyi metot olarak çalıştıracağını bilmiyordu . burada ikisinin de istediği cevabı verdik. artık event delgate e yakaladığı durumu bildirirken delegate de hangi metot u çalıştıracağını biliyor .

4. yeniyol.kontagicevir(yeni); kısmında artık aracımız yollarda içerideki for döngüleri ile if koşullarına takılana kadar (if (DegistirHandle != null)) bomboş ve güvenli bir yolda motor sesini ve vites geçişlerindeki o muazzam tadı hissedemesek de hızlı gitmeyi tek önerdiğim platform c# diyebilirim .

OrNeK KoD