Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


Zirveye Çıkaran Programcılık Teknikleri 2

Yazar: Memik YANIK

Kategori: C#.NET & VB.NET

Eklenme Tarihi: 26.05.2009 01:24:30

Zirveye Çıkaran Programcılık Teknikleri adı altında bir araya getirdiğim makalelerin ikincisinde 2 programcılık tekniğinden söz etmekteyim. Bir önceki makalede olduğu gibi söz konusu programcılık tekniklerini önce Zirveye Çıkmak İsteyenler, ardından Çukura İnmek İsteyenler için ayrıca kaleme aldım.

Bu tekniğimiz Visual Basic 3.0 çıktığından, yani önceleri RAD adı verilen görsel uygulama geliştirme araçları çıktığından bu yana programcıların sık yaptıkları işlemlerden birisi olan event ve kontrol oluşturmaktan söz edeceğiz. Tabi bazılarınız "ben yıllardır programcıyım ama en son ne zaman event oluşturdum hatırlamıyorum" diyenler olabilir ama biz size inanmıyoruz deyip eventların ve kontrollerin nasıl oluşturulduğunu bir güzel size anlatacağız.

Event ve Kontrol Oluşturmak – Zirveye Çıkmak İsteyenler İçin

Eventların nasıl oluşturulduğunu anlatmak için öncelikle şunu bilmeliyiz: C#’ta çalıştırılan kod bloklarına event denilmektedir. Bu konuda itiraz kabul edilmez. Madem amacınız zirveye çıkmaktır verdiğimiz her tekniği olduğu gibi kabul etmelisiniz, başka kaynaklarda yazılanlarla ilginmemelisiniz. Bu konuda yazdıklarımın anlaşılması için basitten zora doğru işlemleri açıklayacağım. Bu amaçla kodla bir Button kontrolü oluşturacağım. 

private
void button1_Click(object sender, EventArgs e)

 {

    Button miss_gibi_button = new Button(); // kontrol oluşturuldu

    Controls.Add(miss_gibi_button);

    miss_gibi_button.Text = "Miss Buton";

 }

Gördüğünüz gibi C#’ta kontrol oluşturmak böyle teknik bir işlemdir. Zirveye çıkmak isteyenlerin kontrol oluşturma işlemini her seferinde Microsoft’un programcıları tarafından tarif edilen şekilde yapılmasını engellemeleri gerekir. Madem bu şekilde kontrol oluşturduk bir de event oluşturalım. Böylece kontrolümüz eventsız kalmaz. Bu düşünce ile yukarıda button oluşturduğum koda yeni satırlar ekledim ve event oluşturdum. 

private
void button1_Click(object sender, EventArgs e)

  {

    Button miss_gibi_button = new Button(); // Kontrol oluşturuldu

    miss_gibi_button.Text = "Miss Buton";

    this.Controls.Add(miss_gibi_button);

    miss_gibi_button.Click += new EventHandler(tikla_gozum); 

  }

 private
void tikla_gozum(System.Object sender, EventArgs  e) // event oluşturuldu

  {

     MessageBox.Show("Ne güzel tıkladın"); 

  }

Hazırladığım eventa akılda kalıcı bir isim verdim.
Gördüğünüz gibi kontrol oluşturmak ve event yaratmak son derece teknik bir konu olsa bile bizimle kolaydır. Şimdi ise aynı anlayışla bir de TextBox kontrolü oluşturup bu kontrol için bir Event yaratalım.

private
void button1_Click_1(object sender, EventArgs e)

 {

    TextBox acer_text = new TextBox();

    this.Controls.Add(acer_text);

    acer_text.TextChanged += new EventHandler(kardes_bilgi_girdin); 

  }

private void kardes_bilgi_girdin(System.Object sender, EventArgs  e)

 {

    MessageBox.Show("Bir harf girdin, eline sağlık"); 

 }

İşin özü şudur:Her kim Event ve kontrol hazırlama konusunda yukarıda söylenenlerden farklı bir şey söylerse onun programcılık konusundaki yeri kesin çukurdur, çukurda kalmaya mahkumdur. Biz hayatımızı C#'a verdik. Nasıl ki Türkiye'de C# bizden soruluyor, bizden öğreniliyor; kontrol ve eventlar yukarıda anlatıldığı şekilde hazırlanır.

Event ve Kontrol Oluşturmamak – Çukura İnmek İsteyenler İçin

Button ve TextBox gibi sınıfların Event’ları zaten olduğu için tekrar oluşturulmaları mümkün değildir. Tabi bazılarınız .NET Framework ile gelen Button ve TextBox gibi sınıfların orijinal hallerini beğenmeyip bu sınıflardan yola çıkıp kendi özel sınıflarını(Toolbox’ta birer düğme ile temsil edilen sınıflara kontrol deme alışkanlığı vardır) oluştururken bu sınıflar için yeni event’lar oluşturabilirler. Yoksa Button ve TextBox gibi sınıflar için yukarıda anlatılan şekilde Event oluşturmak mümkün değildir. Tabi sihirbazlık becerisi olanlar belki bunu başarabilirler. 

Şimdi ise kontrol oluşturmayı deneyelim. Zirveye çıkanların affına sığınıp kontrol oluşturmanın bir bakıma yeni bir sınıf hazırlamak olduğunu işaret edelim. Yani ne zaman ki .NET Framework ile gelen kontroller işinizi görmez o zaman yeni kontroller oluşturmak gerekir ki bu son derece teknik bir işlemdir. Yani durup dururken 3 satır kodla kontrol oluşturmanın hem bir mantığı yoktur hem de mümkün değildir.


Madem kontrol oluşturamıyoruz bari bir button nesnesi oluşturalım. Visual Studio’nun Toolbox penceresinden Button kontrolünü temsil eden düğmeyi sürükleyip mevcut bir formun üzerine bırakırsanız "button1" adında bir Button nesnesi hazırlamış olursunuz. Bu sırada forma ikinci bir button nesnesi yerleştirmeniz halinde Visual Studio bu button nesnesine button2 adını verir.



Başka bir deyişle Toolbox’tan Button kontrolünü temsil eden düğmeyi sürükleyip forma bırakmakla Visual Studio’ya demiş oluyoruz ki “bana standart özelliklere sahip bir button nesnesi hazırla”. Visual Studio bizi kırmayıp bu nesneyi oluşturmaktadır. Tekrar edelim: Toolbox'tan yararlanıp forma yani Form sınıfının mirasçısı sınıfta button1 adında bir button1 nesne hazırlamak demek bir bakıma Visual Studio bu işlem için gereken kodları git benim için Form1.Designer.cs dosyasına yaz demektir. İşte forma button1 adında button nesnesi yerleştirdiğinizde geri planda hazırlanan kodlar.



Bu sırada yani formun üzerinde button1 adındaki bir Button nesnesi varken bu nesneyi çift tıklarsanız Visual Studio sizin bu nesnenin Click olayını temsil eden bir metot hazırlamak istediğinizi varsayar. Aşağıda verdiğim kodu tasarım anında button1 adlı button nesnesini(kontrol değil nesne) çift tıkladıktan sonra aldım. 

private
void button1_Click(object sender, EventArgs e)

  {

  }

Gördüğünüz gibi bu bir event değil bir metottur. Visual Studio bu metoda ad seçerken nesne ile bu metodun temsil edeceği olayın adını birleştirip bir metot adı meydana getirdi. Yani programcı bu metoda istediği adı verebilir. Örneğin programcı bu metodun adını aşağıdaki gibi değiştirebilir.

private
void button1_Tokmakci(object sender, EventArgs e)

  {

  }

Anlatılan şekilde button1 nesnesi tasarım anında çift tıklandığında Visual Studio metot hazırlamaktan öte ayrıca bu metot ile Button nesnesinin Click olayını ilişkilendirir. Bu ilişkilendirme Designer.cs adlı dosyada yapılır. Tasarım anında button1 adlı nesneyi çift tıkladığım için Visual Studio geri planda Form1.Designer.cs dosyasına aşağıda işaret edilen satır gibi bir satır ekleyerek bu metotla button1 nesnesinin Click olayını ilişkilendirdi.



Varsayalım ki Visual Studio'nun button1_Click() adını verdiği metodun adını beğenmediğiniz veya bu metot adı yerli programcılık kitabı yazarları tarafından daha önceden register edilmiş olduğundan kullanmak istemiyor olabilirsiniz. Bu durumda Form1.cs dosyasına gidip metodun adını istediğiniz gibi  değiştirebilirsiniz. Tabi sonradan kendiniz metodunun adını değiştirirseniz Form1.Designer.cs dosyasındaki metotla Click olayı arasında ilişki kuran satırı da aşağıdaki gibi değiştirmeniz gerekir.



Yukarıda zirveye çıkmak isteyenler için yazılan metinde kod yazılarak yani Visual Studio’dan yararlanılmadan bir kontrol hazırlanmıştı. Pardon nesne hazırlanmıştı. Şimdi aynı işlemi iflah olmaz çukurcular yani zirveye çıkmak istemeyenler için yapalım.

private
voidForm1_Load(objectsender, EventArgse)

  {

   

Buttonbutton2 = newButton();

    button2.Text = "buton2";

    button2.Left = 25;

    button2.Top = 50;

   this.Controls.Add(button2);

 }

Bu kodları Form1’in Load olayını temsil eden metoda yazdığım için proje çalıştırıldığında forma button2 adında bir nesne yerleştirilir. Çalışma anında button2 tıklansa bile herhangi bir tepki alınmaz. Çünkü bu nesnenin Click olayını temsil eden bir metot henüz yoktur.

Şimdi örnek olması için bir metot hazırlayacağım. Aşağıda verdiğim ekran görüntüsünde tespit edeceğiniz gibi hazırlayıp button2_Tokmakci() adını verdiğim metot object ve EventArgs tipinde 2 parametreye sahiptir. Hazırladığım metoda özellikle argo bir ad verdim ki yarın bir gün birileri çıkıp metodumuzun adını çalmışsın demesinler.



Bu metodun button2 adını verdiğim button nesnesinin Click olayını temsil etmesini istiyorum. Button nesnelerinin Click olayını ancak object ve EventArgs tipinde 2 parametreye sahip metotlar temsil edebildiği için metodun parametre yapısını ona göre düzenledim. 

Şimdi sırada bu metot ile, kod yazarak hazırladığım button nesnesinin Click olayı arasında ilişki kurmak var. Bu amaçla yukarıda verdiğim koda ekleme yaptım. Gördüğünüz gibi ne kontrol hazırladık ne de Event. Bu nedenle zirveye çıkmayı kafalarına koyanlar metot hazırlama işleminden Event hazırlama diye söz ederlerse inanmayınız.



Out Bildirili Değişkenler - Zirveye Çıkmak İsteyenler İçin

Bu makalede her C# programcısının çok faydasını gördüğü out bildirisinden söz edeceğim. Daha önce sözü edilen tekniklerde işaret edildiği gibi C#’taki procedure’ler fonksiyonlardan daha gelişmiş bir yapıya sahip olduğu için out bildirisini fonksiyonlar yerine Procedureler üzerinde anlatmayı tercih ettim.

En başta belirtelim ki out bildirili parametreler yani out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılamaz. Bazen insana komut gibi görünün bu bildiri hakkında bilgi vermek için aşağıdaki gibi güzel bir kodlama yaptım. Aşağıda verdiğim kodda şartları zorlayıp out bildirisiyle tanımladığım değişkenin soluna eşittir yazdım. 

namespace
uzayli_zekiye

{

    class hakiki_sinif

    {

        public void benzersiz_metot(out string str)

        {

            string ilimiz;

            ilimiz = str; // Hata meydana gelir, çünkü solunda ‘=’ var.

            str = "ADANA";

        }

    }

}

Bu kodu yazıp işletmek istediğinizde hata meydana gelir. Çünkü Out bildirisiyle tanımlanıp deklare edilen değişkenlerin soluna “=”, eşittirin sağına ise out bildirili değişken yazılamaz. Bu kodda “=” operatörünün sağına burada “str” adını verdiğim out bildirili yani out olmuş değişkenin adını yazdığım için hata meydana gelmektedir. Başka bir anlatımla out bildirisiyle tanımlanan değişkenlerin değeri başka bir değişkene aktarılamaz. 

Out Bildirili Değişkenler – Çukura İnmek İsteyenler İçin
 

Yukarıda out anahtar kelimesiyle ilgili olarak zirveye çıkmak isteyenler yazılanları okudunuz. Bakalım yukarıda yazılanları okuduktan sonra yanlış bildiğinizde ısrar mı edeceksiniz yoksa Visual Studio’yu açıp zirveye çıkmak için yazılanları üç beş dakikada test edip gerçeği görmeyi deneyecek misiniz? İlk olarak yukarıda zirveye çıkmak için yazılan koddaki out bildirisini silip değişen bir şeyin olup olmadığını görmekle Out anahtar kelimesiyle ilgili gerçekleri görmeye başlayabilirsiniz.

namespace
uzayli_zekiye

{
   class hakiki_sinif
    {
        public void benzersiz_metot(string str)
        {

            string ilimiz;

            ilimiz = str; // Yine hata meydana gelir

            str = "ADANA";

        }

    }

}

Tabi out anahtar kelimesinin işlevini tam olarak anlamak için reference tipler nedir, Value tipler nedir sorularına verilecek cevabınızın olması gerek. Sizleri çukura çekmeye kararlı olduğum için işe aşağıdaki gibi basit bir sınıf hazırlayacak başladım.

class
in_out

  {

      public static void metot_bir(int x)

        {

            x = 200;

            return;

        }

   }

Dikkat ederseniz bu Class’in "metot_bir" adını verdiğim bir metodu bulunmakta ve kendisine parametre olarak verilen değişkenin içeriğini değiştirmektedir. Bu sınıfı ve metodunu test etmek için üzerinde çalıştığım projenin formuna bir düğme ve ListBox yerleştirip düğmenin Click olayını temsil eden metodunu aşağıdaki gibi düzenledim.

private
void button1_Click(object sender, EventArgs e)

  {

     int rakam = 100;

     listBox1.Items.Add(rakam);

     in_out.metot_bir(rakam);

     listBox1.Items.Add(rakam);

  }

Bu kod işletildiğinde tahmininizde yanılmazsınız ve ListBox’a 2 kez 100 yazılır. Çünkü “rakam” adını verdiğim değişkenin içeriğini (yani referansını değil) metoda parametre olarak verdim.




“rakam” adlı değişkenin içeriği yerine referansını metoda göndermiş olsaydım durum farklı olurdu. Metotlara değişkenlerin içerikleri yerine referansları yani adreslerini parametre olarak göndermek istiyorsanız ref anahtar kelimesinden yararlanmanız gerekir. Ref anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.

public
partial class Form1 : Form

  {

     public Form1()

      {

         InitializeComponent();

      }

     private void button1_Click(object sender, EventArgs e)

      {

         int rakam = 100;

         listBox1.Items.Add(rakam);

         in_out.metot_bir(ref rakam);

         listBox1.Items.Add(rakam);

      }

    }

class
in_out
  {
     public static void metot_bir(int x)
      {
        x = 200;
        return;    
     }
  }

"metot_bir" adını verdiğim metodu işletirken parametrenin önüne ref anahtar kelimesini yazdığım için hata meydana gelir. Çünkü metodun yapısında metoda parametre aracılığıyla bilgiler değer gönderilmek üzere hazırlık yapılmış. Bu nedenle metodun yapısında aşağıdaki gibi değişiklik yaptım.

class
in_out
  {
     public static void metot_bir(ref int x)
        {
           x = 200;
           return;
        }
   }


Bu hazırlıktan sonra formdaki düğme tıklanıp button1_Click() metodu işletilirse bu kez ListBox’a önce 100 sonra 200 yazılır. Çünkü “rakam” değişkeni metoda referans olarak gönderildi ve “metot_bir” adını vermiş olduğum metotta bu bellek adresinin içeriği değiştirildi.



ref
anahtar kelimesi sayesinde metotlara parametre aracılığıyla değer yerine referansı gönderilir. Referans derken “rakam” değişkenin bellekteki adresinden söz etmekteyim. Bu uygulamada int tipindeki “rakam” değişkenine ilk değer vermeden aşağıdaki gibi metodu işletmiş olsaydım hata meydana gelirdi. 

private
void button1_Click(object sender, EventArgs e)

  {

     int rakam;

     in_out.metot_bir(ref rakam); // Hata meydana gelir.

     listBox1.Items.Add(rakam);

   }

Bu metodu düz mantıkla incelediğinizde hata meydana gelmemesi gerekir diye düşünebilirsiniz. Çünkü referans olarak gönderilen değişkene metotta zaten bilgi aktarılıyor ve bilgi aktarıldıktan sonra bu bellek adresinin içeriği ListBox’a aktarılmaya çalışılıyor. Buna rağmen bu kod çalıştırıldığında hata meydana gelir. Çünkü değişkenlere ilk değer aktarılmadan kendilerine tahsis edilen bir adresleri olmuyor. Bu tip hataların önüne geçmek için ref yerine out anahtar kelimesini kullanabilirsiniz. Out anahtar kelimesinin nasıl kullanıldığını aşağıda görebilirsiniz.

namespace
WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            int rakam;

            in_out.metot_bir(out rakam);

            listBox1.Items.Add(rakam);

        }

    }

   class in_out

    {

        public static void metot_bir(out int x)

        {

            x = 200;

            return;

        }

    }

 }

Şimdi gelelim Zirveye Çıkmak isteyenler için yazılan metindeki ender rastlanılan hatadan söz etmeye. Aşağıda verilen kodu tek gözüyle bile inceleyenlerin hatanın nedeninin out bildirisi olmayıp str adlı değişkene ilk değer aktarılmadan içeriğinin okunmak istenmesidir.

namespace
uzayli_zekiye

{
    class hakiki_sinif
    {
        public void benzersiz_metot(out string str)
        {
            str = "ADANA";
            string ilimiz;
            ilimiz = str; // Hata meydana gelmez
        }
    }
}

D

olayısıyla zirveye çıkmak isteyenler için hazırlanan metindeki “out bildirisi ile deklare edilen değişkenlerin soluna “=” yazılmaz” cümlesi şeytanın katkısıyla yanlışlıkla kullanılmıştır.

Yazar Hakkında 1 Yorum Yorum Yaz Yazara ait diğer Makaleler
Tema
Anket
ASP.NET MVC'yi Projeleriniz de kullandınız mı?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.