Sarmalama / Paketleme (Encapsulation), bir nesnenin özelliklerinin dışarıdan kullanılmasını sınırlamak için kullanılır. Bir insanı örnek verelim. Vücudumuzun yaptığı işler sarmalanmıştır ve biz buna müdahale edemeyiz. Örneğin, biz sadece solumakla ilgileniriz; ciğeri şişirmek, kana oksijen karıştırmak, kirli kanı temizlemek gibi işlemler içeride yapılıyor olsa da, bizim için durum sadece solumaktan ibarettir. Diğer işlemler sarmalanmıştır. Aynı mantıkla, nesnelerimizin de bazı işleri kendi içinde yapması ve bu sayede daha kolay kullanılabilmesi sağlanır böylece veri güvenliği de sağlanmış olur.
Bu işlem yapılırken esasen access modifier’larla işlemlere ne şekillerde erişileceğini belirlemeniz yeterlidir.
İnsan örneğini kod halinde ifade edelim:
public class Insan
{
private void KirlikandakiKarbondioksitiAl()
{
//.......
}
private void OksijenikanaVer()
{
//.......
}
private void CigeriSisir()
{
//.......
}
private void CigeriDaralt()
{
//.......
}
public void NefesAl()
{
CigeriSisir();
OksijenikanaVer();
KirlikandakiKarbondioksitiAl();
CigeriDaralt();
}
}
Bu örnekte de görüldüğü gibi, Insan sınıfının sadece NefesAl metodu public olduğu için dışarıya açıktır. Bu nesneyi kullanan yapılar asla diğer metodlara erişemez, istese de değişikliğe sebebiyet veremez.
Aynı durumu daha gerçekçi bir örnekle inceleyelim:
public class TarihBilgisi
{
private DateTime tarih;
public string Gecerlitarih;
{
set { tarih = Convert.ToDateTime(value) }
}
private double GunOlaraktarihFarki(DateTime farkAlinacaktarih)
{
return (farkAlinacaktarih - tarih).TotalDays;
}
// Yukarıda yapılan işlemi incelediğimizde Gecerlitarih isimli property’e atılan değer dönüştürülerek DateTime tipindeki tarih isimli değişkene atılmaktadır. GunOlaraktarihFarki isimli metod parametre olarak almış olduğu farkAlinacaktarih isimli değişkenden tarih isimli değişkeni çıkarmaktadır. Kullanılan TotalDays özelliği çıkarılan iki tarih arasındaki farkı gün olarak hesaplamaktadır.
public string GunFarki(string Yenitarih)
{
return GunOlaraktarihFarki(Convert.ToDateTime(Yenitarih)).ToString() + " gün fark var";
}
}
Bu örnekte de görüldüğü gibi, tarih alanı (field) ve GunOlaraktarihFarki metodu private yapılarak dışarıdan gizlenmiştir. TarihBilgisi nesnesi ile çalışan bir uygulama bu alandan ve metottan haberdar olmayacak ve sadece bizim izin verdiğimiz yapılara erişerek işlerini görecektir. Kısıtlama kötü gibi görünse de, aslında bu sayede gereksiz alanlarla uğraşmasına gerek kalmamış ve değiştirmemesi gereken yerleri değiştirme şansı kalmamıştır.