Kapsülleme (Encapsulation), veri ve bu veriyi işleyen metotları bir araya getirerek dışarıdan doğrudan erişimi engelleme ve kontrollü erişim sağlama tekniğidir.
Veri Gizliliği (Data Hiding): Sınıfın içindeki verilerin (özelliklerin) doğrudan değiştirilmesini veya okunmasını engelleyerek veri bütünlüğünü korumak.
Kontrollü Erişim: Veriye erişimi ve değiştirmeyi sınırlayarak, hatalı kullanımları önlemek ve sınıfın davranışlarını kontrol etmek.
Neden Kapsülleme Yapmalıyız?
- Güvenlik: Dışarıdan yanlışlıkla veya kötü amaçlı olarak veri değiştirilmesini engeller.
- Esneklik: Sınıfın iç yapısını değiştirmeden dış arayüzü (interface) koruyabiliriz.
- Bakım Kolaylığı: Veri doğrulama ve işleme mantığını tek bir yerde toplarız, bu da bakımı kolaylaştırır.
Erişimi Belirteçleri (Access Modifiers): public, private, protected, internal
- Erişim Belirteçlerinin Tanımı: Sınıf üyelerine (özellikler, metotlar) erişim seviyesini belirleyen anahtar kelimelerdir.
- public: Her yerden erişilebilir. En geniş erişim seviyesi.
- private: Sadece sınıfın içinden erişilebilir. En kısıtlı erişim seviyesi. Veri gizliliği için kullanılır.
- protected: Sınıfın içinden ve türetilmiş sınıflardan (derived classes) erişilebilir. Kalıtım senaryolarında kullanılır.
- internal: Aynı proje içindeki diğer sınıflardan erişilebilir. Proje dışından erişilemez.
public class Araba
{
// Her yerden erişilebilir
public string Model;
// Sadece sınıfın içinden erişilebilir
private string _renk;
// Sınıfın içinden ve türetilmiş sınıflardan erişilebilir
protected int Hiz;
// Aynı proje içindeki diğer sınıflardan erişilebilir
internal decimal Fiyat;
}Özellikler ile Kapsülleme Uygulaması: Getters ve Setters’ı kullanarak veri doğrulama (validation)
- Getters ve Setters: private alanları kullanırken, dışarıdan erişimi sağlamak için kullanılan özel metotlardır.
- Veri Doğrulama (Validation): Setter içinde verinin geçerliliğini kontrol etmek. Örneğin, yaşın negatif olmaması veya renk adının belirli bir listede olması gibi kontroller yapılabilir.
public class Araba
{
private string _renk;
public string Renk
{
get { return _renk; }
set
{
if (!string.IsNullOrEmpty(value)) // Boş olmama kontrolü
{
_renk = value;
}
else
{
Console.WriteLine("Renk boş olamaz!");
}
}
}
// ... diğer özellikler ve metotlar ...
}Otomatik Özellikler (Auto-Implemented Properties): Kısaltılmış Kapsülleme Yöntemi
Otomatik Özelliklerin Tanımı: Derleyici tarafından otomatik olarak private bir destek alanı oluşturulur ve getter/setter metotları sağlanır.
Kullanım Alanları: Basit kapsülleme işlemleri için daha kısa ve okunabilir kod yazmayı sağlar.
public class Araba
{
// Otomatik özellik
public string Renk { get; set; }
public string Model { get; set; }
// ... diğer özellikler ve metotlar ...
}Otomatik Özelliklerde Doğrulama: Getter/setter blokları kullanılarak doğrulama yapılabilir.
public class Araba
{
private string _renk;
public string Renk
{
get { return _renk; }
set
{
if (!string.IsNullOrEmpty(value))
{
_renk = value;
}
else
{
Console.WriteLine("Renk boş olamaz!");
}
}
}
// ... diğer özellikler ve metotlar ...
}Kaynak: https://learn.microsoft.com/tr-tr/dotnet/csharp/tour-of-csharp/tutorials/