Encapsulation, object oriented programlamada, implementasyon detaylarına erişimi kısıtlama anlamına gelir.

Object oriented programlamada, abstraction(soyutlama) ve encapsulation(sarmalama) benzer özelliklerdir. Abstraction, kod yazarken sadece konuyla alakalı bilginin gözükmesini sağlar. Bazen bir kütüphaneyi kullanırken, işin mutfağına erişmemeniz gerekebilir. Encapsulation da programcının istenen abstraction seviyelerini implemente etmesine olanak tanır.

Encapsulation access specifiers(erişim belirticileri) kullanılarak implemente edilir. Access specifier, bir class üyesinin görünürlüğünü(kod yazarken ki erişimini) ve faaliyet alanını belirler.

Bunlar;

  • Public
  • Private
  • Protected
  • Internal
  • Protected internal

Public Access Specifier

Public Access Specifier bir class’ ın, üye değişkenlerini ve üye metodlarını diğer metodlara ve objelere açmasını sağlar.Her bir üye kendi class’ ının dışından da erişilebilir.

using System;

namespace RectangleApplication {

   class Rectangle {

      //üye değişkenler
      public double length;
      public double width;

      public double GetArea() {
         return length * width;
      }

      public void Display() {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }

   }//end class Rectangle

   class ExecuteRectangle {

      static void Main(string[] args) {
         Rectangle r = new Rectangle();
         r.length = 4.5;
         r.width = 3.5;
         r.Display();
      }

   }
}

Rectangle’ ın class’ ın dan bir obje yarattık ve üye değişkenlerine erişip değerlerini verdik, Display metodunu kullandık. Rectangle class’ ı kendi üye değişkenlerine ve metodlarına sadece kendisi erişmekle kalmıyor, public ile tanımlanmış üyelerine, kendisinden oluşturulan objelerinde erişmesine izin veriyor.

Private Access Specifier

Private Access Specifier bir class’ ın, üye değişkenlerini ve üye metodlarını diğer metodlar ve objelerden gizlemesini sağlar. Bir class’ tan oluşturulmuş obje dahi, private üyelerine erişemez. Modern ide(kod geliştirme programı) ler
yaratılmış olan objelerde otomatik tamamlama yaparken, bahsi geçen private üyeleri göstermez. Programcı bu üyelere erişmek için kod yazıp çalıştırdığında ise hata alır.

using System;

namespace RectangleApplication {
   class Rectangle {
      //member variables
      private double length;
      private double width;

      public void Acceptdetails() {
         Console.WriteLine("Enter Length: ");
         length = Convert.ToDouble(Console.ReadLine());
         Console.WriteLine("Enter Width: ");
         width = Convert.ToDouble(Console.ReadLine());
      }
      public double GetArea() {
         return length * width;
      }
      public void Display() {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle

   class ExecuteRectangle {
      static void Main(string[] args) {
         Rectangle r = new Rectangle();
         r.Acceptdetails();
         r.Display();
         Console.ReadLine();
      }
   }
}

Rectangle class’ ının length ve width üyeleri private olduğu için sadece kendi metodları kendi içinde erişebiliyor. Bu class’ tan yaratılmış olan obje erişemiyor ve bu yüzden, AcceptDetails metodunu kullanmak durumunda kalıyor.

Programlama’ da üye değişkenleri ve metodları private yapmak teknik bir zorunluluk değildir. Yazılacak programların daha sağlıklı geliştirilebilmesini sağlamak amacıyla vardır. Programcı kod yazarken, kodu düz yazı olarak okur. Class’ ların içindeki bazı üyelerin direk değiştirilmemesi gerektiğini ilk bakışta çözemeyebilir. Bu yüzden işlerin sağlıklı yürütülmesi açısından bu tarz çözümler uygulanmıştır.

Neden private ?

Bu soruyu sormaya devam ediyorsanız, çok basit ve gerçek hayattan bir örnek verelim.

Bir oyunumuz var, ve bu oyunda kediler var. Kedi yi tanımladığımız class’ ı aşağıdaki grafikte inceleyelim.

Kedi’ nin mood, hungry, energy gibi öznitelikleri, sleep, play, feed gibi metodları var.

Bir canlı’ nın yaşam döngüsü karmaşıktır. Hele ki kediler 🙂
Kedileri seversiniz, beslersiniz, oynarsınız ama duygu durumu neşeli ye geçmeyebilir. Çünkü duygusal olarak farklı bir dönemdedir ve 2 + 2 = 4 etmeyebilir. Keza energy’ si yüksek iken oyun oynamak ta istemeyebilir. Yada oyun oynamadan asla enerjisi yükselmeyebilir. Ama siz bu özniteliklere direk erişir de değiştirirseniz, sistem saçmalamaya başlayacaktır. Yemek yedirmeden, hungry niteliğini false yaparsanız, play metodu çalıştırılırken tutarsızlık gözlenecektir.

Bu yüzden, bazı üyelere asla direk erişilmemeli. o üyelere sarmalanmalıdır.

Protected Access Specifier

Protected Access Specifier türetilmiş bir class’ ın, türediği class’ ın üye değişkenlerine ve metodlarına erişmesine imkan tanır. Lakin public’ ten farklı olarak, dış dünyadan erişimi yasaklar. Protected olarak oluşturulmuş bir değişkene ve metoda, sadece kendisi(base class) ve kendisinden türemiş class, kendi içinde erişebilir.
Base class yada child class(türetilmiş class) dan bir obje yaratıldığında, protected değişken ve metod çağrılamaz.

Internal Access Specifier

Internal Access Specifier, bir class’ ın üye değişkenlerine ve metodlarına sadece aynı uygulamadaki class ların erişebilmesini sağlar.

Protected Internal Access Specifier

Protected yapısından dolayı, Internal Access Specifier’ dan farkı, üye değişken ve metodlara erişim kısıtlamasına, kendisinden türememiş class’ ları da eklemesidir.

Last modified: 10 June 2019

Author

Comments

Write a Reply or Comment

Your email address will not be published.