18 Haziran 2013 Salı

C# Kapsülleme (Encapsulation)

Kapsülleme (Encapsulation): Verilerin ve kodların dış etkenlerden korumaktır.
Özellikleri:
* Bir nesnenin dış dünyadan soyutlanıp iç dünyasında işlem yapması
* Başka kod ve sınıflar tarafından kulanılmaması için koruyucu bariyer görevi görür.
*Kodları erişilmez hale getirir.
*Nesne tabanlı programlamanın temel ilkelerinden birisidir.
Not : Class içinde bir değişkene ulaşılmaması için private olarak tanımlamalsınız.

Encapsulation programcıya nesneleri koruma gücünü verir.



 Örneğin emlak işlemleri yapan bir programımız olduğunu varsayalım. Emlak programında olması gereken bir ev nesnemiz bulunmaktadır. Bu ev nesnemizin kaç metrekare olduğu, kaç odasının olduğu, hangi semtte olduğu gibi bir sürü özelliği bulunmaktadır. Visual Studio yu açarak ConsoleApplication projesi açıyoruz. EmlakciApp ismini veriyoruz. Kodlarımız aşağıda ki gibi. Açıklama satırlarında açıklamaları yaptım.

EmlakciApp: Console Application
EmlakciLib: Class Libary










using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EmlakciLib;

namespace EmlakciApp
{
    class Program
    {

        static void Main(string[] args)
        {
            Ev evim = new Ev(); // ev class ından yeni evim isminde türetiyoruz.
            //Ev classının elemanlarına değer atıyoruz.
            evim.Alan = 85; // burada -85 şeklinde negatif bir değer girseydik kapsülleme özelliği sayesinde
            //bize mutlak değerini alıp o şekilde değerini getirecekti.
            evim.Semt = "Isparta-Cunur";
            evim.Katno = 5;
            evim.Odasayisi = 3;

           Console.WriteLine( evim.EvBilgileriniGetir()); // EvBilgileriniGetir metodu string döndürdüğü için Console.WriteLine metodu ile kullanılması gerekir.
           Console.ReadKey();


        }

    }
}

Programımız main bloğundan itibaren çalışmaya başlayacak. Namaspace kısmında

using EmlakciLib; bu satır bulunmaktadır. Aslında ev class ını EmlakciApp projesinin içersinde de yazabilirdik fakat ayrı bir ClassLibary projesi açarak ev class ını oluşturduk ve özelliklerini kapsülledik. Class Libary projesi oluşturmak için Solution üzerinde sağ tıklayıp Add > New Project adımlarını takip ederek Windows C# menüsü altında Windows un altında Class Libary seçiyoruz ve  Name ine EmlakciLib adını veriyoruz.


//Class Libary projemizin kodları.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace EmlakciLib
{
    public class Ev // Class Libary projesi. Çıktısı dll dosyasıdır. İstenilen projede add reference diyerek kullanılabilir.
    {
        // hiyerarşi namespace, sınıf, metod
        //field ları kapsüllemek için field e (örneğin semt in üzerine) sağ tıklayıp refactor sonra encapsuolate field seçeneği ile otomatik oluşturabilir.
        //Yada klavyeden control + r + e tuş kombinasyonları

        private string semt;

        public string Semt // Control + r + e kısayolu kullanarak semt alanını kapsülledik
        {
            get { return semt; }
            set { semt = value; }
        }
        private int katno;

        public int Katno // Control + r + e kısayolu kullanarak Katno alanını kapsülledik
        {
            get { return katno; }
            set { katno = value; }
        }
        private int odasayisi;

        public int Odasayisi // Control + r + e kısayolu kullanarak Odasayisi alanını kapsülledik
        {
            get { return odasayisi; }
            set { odasayisi = value; }
        }
       private double alan; // Control + r + e kısayolu kullanarak alan alanını kapsülledik

       public double Alan // privare double alan field nın properties i
       {
           get
           {
               return alan;
           }

           set  // Burada sadece değerleri kontrol etmedik. Şart deyimleri ile loglama işlemlerinide yaptık
           {
               if (value < 0)
               {
                   // FileMode.Append eğer gösterilen dizinde dosya yoksa hata verir. Dosyayı açar üzerine yazar
                   //OpenOrCreate olursa her seferinde aynı dosyayı yolu gösterilen dizine üretir.
                   FileInfo fi = new FileInfo("c:/loglar.txt");
                   FileStream fs;
                   
                   if (fi.Exists) // Eğer dosya daha önce oluşmuşsa append ile aç
                   {
                       fs = new FileStream("c:/loglar.txt", FileMode.Append);
                   }
                   else // eğer açılmamışsa dosya yazılan dizine verilen isim ve türde dosya oluştur.
                   {
                       fs = new FileStream("c:/loglar.txt", FileMode.Create);

                   }
                  
                   StreamWriter sw = new StreamWriter(fs);
                   sw.WriteLine("Alan bilgisi " + DateTime.Now + " tarihinde hatalı girildi. Girilen değer: " + value);
                   sw.Flush();
                   fs.Close();                  
               }
               alan = Math.Abs(value);  // mutlak değer fonksiyonu ile değerler pozitif yapılıyor
           }
       }


        public string EvBilgileriniGetir() // Dışarıya yani çağrıldığı yere biçimlenmiş string olarak ev bilgilerini gönderen metod
        {
            return string.Format("Kat No : {0} \n Oda Sayisi: {0} \n Semt: {2} \n Alan: {3}", katno, odasayisi, semt, alan);
        }


    }
}





1 yorum:

Unknown dedi ki...

elinize saglık cok güzel anlatmıssınız cidden