30 Ekim 2013 Çarşamba

C# Dilinde Özellikler

Nesne yönelimli programlamanın günümüzde ne kadar yaygın olduğunu programlama ile ilgilenen herkes bilmektedir. Nesne Yönelimli Programlama (NYP) yaklaşımında temel olan prensiplerden birisi bilgi gizleme (information hiding)'dır. Bu prensibi projelerimizde uygulamak için C#'in sunduğu en önemli araçlardan biri olan sınıf özellikleri (class properties) konusunu inceleyeceğiz.

Bildiginiz gibi, C# dilinde tasarlanmis bir sinifta iki temel unsur bulunur. Birincisi sinifin özellikleri (fields), ikinicisi ise sinifin metodlari (methods)'dir. Herhangi bir sinifin özellikeri sinifta tutulan ilisikili verilerlerdir. Diger taraftan sinifin bizim için degisik isleri yapmasini metodlari vasitasiyla saglariz. Sinif tasarimi çok önemli bir is olup; deneyim, konsantrasyon ve dikkat ister. Sinifimizin özelliklerini tutan veriler program akisi sirasinda sinif disinda degistirilebilir veya bu degerlere ulasmak istenebilir.
Bu durumda akla ilk gelen çözüm sinifin verilerinin hepsinin disaridan ulasilabilmesini ve degistirilebilmesine olanak saglayan public anahtari ile tanimlamakdir. Asagidaki programda bu tür bir çözümün uygun olabilecegi düsünülmüstür:
using System;
namespace Property_Makale
{
    class Otomobil
    {
        public int model;
        public string marka;
        public string renk;

        public Otomobil(int model, string marka, string renk)
        {
            if(model>DateTime.Now.Year)
                    this.model=DateTime.Now.Year;
            else this.model=model;

            this.marka=marka;
            this.renk=renk;
        }

        public void OzellikleriGoster()
        {
            Console.WriteLine("\nOtomobilimizin Özellikleri: ");
            Console.WriteLine("\t Marka: "+ marka);
            Console.WriteLine("\t Model: "+ model);
            Console.WriteLine("\t Renk: "+ renk+"\n" );
        }
    }

    class OtomobilTest
    {
        static void Main(string[] args)
        {
            Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
            oto1.OzellikleriGoster();

            oto1.model=300;
            oto1.OzellikleriGoster();
        }
    }
}

Yukaridaki kod örnegimizde iki tane sinif bulunmaktadir. Otomobil sinifi ile otomobil nesnelerimizi olusturabiliriz. Ayrica bu sinifin OzellikleriGoster() metodu ile herhangi bir otomobil nesnemizin özelliklerini görmek için ekrarana yazdiriyoruz. Ikinci sinifimizda (OtomobilTest) ise Otomobil sinifimizdan nesneler olusturmak ve onlarin özellikerini çagirmak için kullanacagiz. Simdi isterseniz Main() fonksiyonunu incelemeye baslayalim. Metodun hemen ilk basinda oto1 isimli nesnemizi olusturuyoruz. oto1 nesnemizin özellikleri 2000 model siyah bir BMW olsun. Bir sonraki satirda oto1 nesnemizin modelini 300 yapiyoruz. Iste burda büyük bir hata yapiliyor! Çünkü 300 yilinda otomobil üretilmemisti. Böyle bir hatayi nasil önleriz? Bunun için otomobil nesnemizin herhangi bir özelligini degistirmek için ayri metod yazmamiz gerekir. O zaman programizi su sekilde degistirmemiz gerekiyor:
using System;
namespace Property_Makale
{
    class Otomobil
    {
        private int model;
        public string marka;
        public string renk;

        public Otomobil(int model, string marka, string renk)
        {
            if(model>DateTime.Now.Year)
                    this.model=DateTime.Now.Year;
            else this.model=model;

            this.marka=marka;
            this.renk=renk;
        }

        public void OzellikleriGoster()
        {
            Console.WriteLine("\nOtomobilimizin Özellikleri: ");
            Console.WriteLine("\t Marka: "+ marka);
            Console.WriteLine("\t Model: "+ model);
            Console.WriteLine("\t Renk: "+ renk+"\n" );
        }

        public void ModelDegistir(int yeniModel)
        {
            if( (yeniModel>DateTime.Now.Year)||(yeniModel<1900) )          
                Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! ");          
            else this.model=yeniModel;
        }
    }

    class OtomobilTest
    {
        static void Main(string[] args)
        {
            Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
            oto1.OzellikleriGoster();

            oto1.ModelDegistir(300);
            oto1.OzellikleriGoster();
        }
    }
}

Yukaridaki programda Otomobil sinifina ModelDegistir(int yeniModel) metodunu ekledik. Bu metod ile modeli degistirilecek nesnenin modelinin su anda bulunulan yildan sonra ve 1900'den önce yapilmak istendiginde hata mesaji veriyor ve modelini degistirmiyor. Ayrica sinif içindeki model degiskenin tanimlanmasinda private anahtarini da kullandigimiza dikkat ediniz. Bu sekildeki yaklasim ile hem sinifin iç isleyisini sinif disindan saklamis oluyoruz hem de sinifa ait verilerin degistirilmesini sirasindaki hatalari en az seviyede tutmayi sagliyoruz.
Fakat yukaridaki yöntemi genelde C++ programcilari kullanir(di). Bizler C# programcilari olarak daha gelismis bir yöntem ile sinif içindeki degerleri degistirmek ve ulasmak için özellik (Property) aracini kullaniriz. Asagidaki program ise C#'in özellikleri nasil kullandigina bir örnektir.
using System;
namespace Property_Makale
{
    class Otomobil
    {
         private int model;
         public string marka;
         public string renk;

         public Otomobil(int model, string marka, string renk)
         {
              if(model>DateTime.Now.Year)
                   this.model=DateTime.Now.Year;
              else this.model=model;

              this.marka=marka;

              this.renk=renk;
         }
         public void OzellikleriGoster()
         {
              Console.WriteLine("\nOtomobilimizin Özellikleri: ");
              Console.WriteLine("\t Marka: "+ marka);
              Console.WriteLine("\t Model: "+ model);
              Console.WriteLine("\t Renk: "+ renk+"\n" );
         }

        public int Model
        {
              get
              {
                   return model ;
              }

              set
              {
                   if( (value>DateTime.Now.Year)||(value<1900) )
                   {
                        Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
                   }
                   else this.model=value;
              }
        }
    }

    class OtomobilTest
    {
         static void Main(string[] args)
         {
              Otomobil oto = new Otomobil(2000, "BMW" , "Siyah");
              Console.WriteLine("Otomobilimizin modeli: "+ oto.Model);

              oto.Model=300;
              oto.OzellikleriGoster();
         }
    }
}

Yukaridaki program kodunda C#'in özellik tanimlama ve kullanma yöntemini kullandik. Özellikler sinifa ile bir degiskenin degerini ögrenebilir ve degistirebiliriz. Yukaridaki örnek kodda yeralan asagdaki kisimda bir özellik(Property) tanimliyoruz. Genellikle bir özelligin ismi üzerinde is yaptigi degiskenin ismi ile ayni olup sadece ilk harfi büyük olur. Aslinda bu bir zorunluluk degil. Sadece C#'da bu bir gelenektir. Bu sekilde bir kullanim bizim kodumuzu okuyanlarin kodu daha kolay anlamasi ve bizim baskalarinin kodlarini daha kolay anlamamiza yardimci olur. Bir özelligin taniminda özellik isminden önce ne tür bir deger dönderecekse onun tipini belirtmeliyiz. Bu genelde özelligin ilgili oldugu degiskenin tipidir :-)
    public int Model
        {
              get
              {
                   return model ;
              }

              set
              {
                   if( (value>DateTime.Now.Year)||(value<1900) )
                   {
                        Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
                   }
                   else this.model=value;
              }
        }
    }

Özellikler içinde get ve set olmak üzere iki ayri blok kod olur. Istersek sadece get veya sadece set bloklari olan özellikler de yazabiliriz. get blogunda ilgili degiskenimizin degerini disariya döndeririz. set blogunda ise degiskenimizin degerini degistiririz. Burda gereken kontrolleri yapip daha sonra uygunsa girilen degeri kabul edebiliriz. Eminimki get blogu içinde dikkattinizi degiskeni ismi yerine value seklinde çagirdik. Böylelikle kod içinde karisiklik olmaz. Zaten sadece bir tane degisken üzerinde çalisiyorsunuz.
Bu makalemizde C# dilinde yeralan özellik (Property) kavramini inceledik. Bir ilerleyen makalelerimizde sadece yazilabilir (read-only) ve sadece okunabilir (write-only) özellik yazmayi ve kullanmayi inceleyecegiz.


Hiç yorum yok:

Yorum Gönder