C# Software Development

Encapsulation Nedir?

Written by Burak Yılmaz

OOP eğitim makalelerimize Encapsulation(kapsülleme) ile devam ediyoruz. Encapsulation nedir? ne işe yarar? nasıl yapılır? örneklerle beraber bu soruların cevaplarına göz atacağız.

Encapsulation nedir? bir nesnenin belirli özellik ve metodlarının saklanması, erişiminin kısıtlanmasıdır. Erişime kısıtladığımız bu özellik ve metodları zaten kullanıcının görmemesi veya kullanmaması gerekiyordur.

Encapsulation ne işe yarar? Kontrolsüz veri girişini ve kötü amaçlı kullanımı önler.

  • Daha iyi anlamak için televizyonu düşünelim. Biz kumandadan tv’yi açar, kanal değiştirir keyfimize bakarız 🙂 fakat arkada kaç volt elektrik kullanılır, devreler nasıldır, kaçlık kondansatör vardır bilmeyiz. Bilmemize gerek olmadığı gibi, bunlara erişme ihtiyacımızda yoktur.

Encapsulation nasıl yapılır? Şimdi örneklerle nasıl yapıldığını göreceğiz fakat örneklere geçmeden önce erişim belirleyicileri(access modifiers) inceleyelim.

Public: Öğenin kod içerisinde herhangi bir yerden erişilebilir olduğunu belirtir. Herhangi bir kısıtlama vs. bulunmamaktadır.

Private: Öğenin sadece tanımladığı sınıf içerisinde erişilebilir olduğunu belirtir.

Protected: Öğenin tanımlandığı sınıf içerisinde ve o sınıftan türeyen sınıflardan erişilebilir olduğunu belirtir.

Internal: Öğenin tanımlandığı assembly içerisinde erişilebilir olduğunu belirtir. O .dll içerisinde öğeye erişim konusunda kısıtlama yoktur fakat dışarıdan bu öğeye erişilemez.

Şimdi bir televizyon nesnesi tanımlayıp konuyu pekiştirelim. Televizyon nesnesi içerisinde marka, pixel ve fiyat bilgisi olsun. Bu alanlara direk erişilmesini istemediğim için private olarak tanımladım.

    public class Televizyon
    {
        private string _marka;
        private int _pixel;
        private int _fiyat;
    }

Bu alanları tanımladık fakat bunlara nasıl değer verip, verdiğimiz değerleri okuyacağız? Bu iki işlem için iki ayrı dışarıdan erişilebilir metod tanımlayacağım fakat fiyat tanımlaması yaparken verilen değerin eksi olmaması lazım.

        public int FiyatGoster()
        {
            return this._fiyat;
        }

        public void FiyatGir(int price)
        {
            if (price > 0)
            {
                this._fiyat = price;
            }
        }

Yukarıdaki örnekten de anlayacağınız üzere _fiyat alanına direk olarak erişemiyoruz. Yani biz bu alanı encapsulate ettik.
Örnekte bu şekilde metodlar yaptık fakat bu kodu daha güzel yazabilirdik. Aşağıdaki örnekte tüm özellikler dışarıdan erişilebilir ve set edilebilirdir.

    public class Televizyon
    {
        public string Marka { get; set; }
        public int Pixel { get; set; }
        public int Fiyat { get; set; }
    }

Sınıf içerisindeki herhangi bir özelliği sadece get edilebilir yapabiliriz veya set’ine kontroller ekleyebiliriz. Yukarıda yazdığımız metodları aşağıdaki şekilde de tanımlayabiliriz.

    public class Televizyon
    {
        private string _marka;
        private int _pixel;
        private int _fiyat;

        public string Marka { get; set; }
        public int Pixel { get; set; }

        public int Fiyat
        {
            get
            {
                return _fiyat; //FiyatGoster()
            }
            set
            {
                if (value > 0)
                {
                    this._fiyat = value; //FiyatGir()
                }
            }
        }
    }

Yukarıda yazdığımız sınıf ile encapsulation konusunu daha iyi anlamışızdır diye düşünüyorum. Artık OOP’un diğer tekniklerine geçebiliriz.

About the author

Burak Yılmaz