Published on

Encapsulation

Authors

Mühendislikte güvenlik son kullanıcı için çok kritik bir kavram. Güvenlik sorunu belki istemeyeceğimiz sorunların başında geliyor. Fakat bu problemden yalnızca son kullanıcılar muzdarip olacak diye bir kaide yok. Aynı durum ürün, proje vs. üzerinde çalışan mühendis içinde geçerli. Kontrolsüz erişim ve güvenlik problemi işin uzmanı olan mühendisler için de ciddi bir problem. “Kim neye, ne kadar erişecek?” diye bir soru sorduğumuzda ise karşımıza Encapsulation diye bir kavram ortaya çıkıyor.

Anlatmak istediğimi şöyle örneklendirebiliriz:

Bir mühendislik ürünü olarak arabayı düşünelim. Arabanın kaportası yalnızca ona şekil veren ve estetik gözükmesini sağlayan bir parça değil. Kaporta aynı zamanda arabanın içerisinde çalışan parçalara mühendis haricinde erişimi engelleyen bir kabuk. Bu sayede motora ve diğer parçalara son kullanıcının yanlışlıkla erişmesinin önüne geçmiş oluyoruz ve parçaları koruyoruz.

Nesne Yönelimli Programlamada da karşımıza bir erişim problemi çıkıyor: “Programcı, ilgili sınıfın hangi veri elemanlarına ne kadar erişecek?”

Programcı yazdığı sınıfın veri elemanını read-only yapabilir veya dışarıdan ne kadar değiştirilebileceğini kontrol edebilir. İşte bu kontrolleri yapabilmemiz için sınıfın veri elemanlarına direkt erişimi engellememiz gerekiyor. Erişim belirleyicisini private olarak belirleyerek diğer sınıflardan direkt olarak erişimi engellemiş oluyoruz. Erişimi artık metotlar ile veya varsa dilin property’leri ile gerçekleştireceğiz.

Aşağıdaki kodu inceleyelim:

using System;
namespace Tutorial;
{
  public Class Product{
    private int ID;

    //Constructor
    public Product(int newID){
      ID = newID;
    }

    //Get method
    public int getID(){
      return ID;
    }

    //Set Method
    public void setID(int newID){
        ID = newID;
    }
  }
}

Product isimli sınıfın ID isimli bir veri elemanı olsun. Bu veri elemanının erişim belirleyicisi private olarak belirlenmiş yani direkt olarak dışarıdan erişemiyoruz. Erişimi getID ve setID isimli metotlarla gerçekleştirmemiz gerekiyor. Yani main sınıfından Product sınıfına erişim şu şekilde olacak:

using System;
namespace Tutorial;
{
  public class main{
    public static void Main(){
      Product item = new Product(20);

      Console.WriteLine(item.getID()); //20

      item.setID(50); // set operation with method

      Console.WriteLine(item.getID()); //50
    }
  }
}

C# Programlama dilinde bu işler için property yazılmış. id içerisindeki get ve set property’leri sayesinde yukarıdaki işlemin aynısını aşağıdaki kodlar ile de yapabiliyoruz. Fakat bu property’lerin C# dilinin özelliği olduğunu unutmayalım başka dillerde olabilir de olmayabilir de.

using System;
namespace Tutorial;
{
  public Class Product{
    private int ID;

    //Constructor
    public Product(int newID){
      ID = newID;
    }

    //Set and Get property
    public int id
    {
      get
      {
        return ID;
      }
      set
      {
        ID = value;
      }
    }
  }

main sınıfında get ve set kullanımı şu şekilde olacak:

using System;
namespace Tutorial;
{
  public class main{
    public static void Main(){
      Product item = new Product(20);

      //get with property
      Console.WriteLine(item.id); // 20

      //set with property
      item.id = 50 

      Console.WriteLine(item.id); // 50
    }
  }
}

yukarıda item.id dediğimizde direkt olarak get property’si sayesinde ID değerine erişebildik ve item.id ye bir değer ataması yaptığımızda set property’si sayesinde değeri değiştirebildik.

Not: Bu yazı ilk olarak 2019'da yazılmış ve yayınlanmıştır. Platform değişikliği sebebiyle Medium'dan buraya taşınmıştır. İmla hatası veya bir bug olabilir.