8 Şubat 2012 Çarşamba

C# ile Object Oriented Programming

 Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda modern yazılım geliştirmenin temelini oluşturan Nesne Yönelimli Programlama (OOP) prensiplerini C# .NET Framework 4 özelinde derinlemesine inceleyeceğiz. OOP, gerçek dünyadaki nesneleri ve onların etkileşimlerini modelleyerek daha düzenli, anlaşılır, tekrar kullanılabilir ve sürdürülebilir yazılımlar geliştirmemize olanak tanır. Gelin, OOP'nin temel avantajlarına, prensiplerine ve C#'taki uygulamalarına yakından bakalım.

OOP'nin Sunduğu Avantajlar

OOP'nin yazılım geliştirme sürecine getirdiği pek çok önemli avantaj bulunmaktadır:

  • Tek Sorumluluk (Single Responsibility): Her sınıfın ve metotun yalnızca bir sorumluluğu olması, kodun daha anlaşılır ve bakımı kolay olmasını sağlar.
  • Okunabilirlik (Readability): Gerçek dünya nesnelerini modelleyen yapılar sayesinde kodun anlaşılması kolaylaşır.
  • Tekrar Kullanılabilirlik (Reusability): Oluşturulan sınıflar ve metotlar farklı projelerde veya uygulamanın farklı bölümlerinde tekrar kullanılabilir, bu da geliştirme süresini kısaltır.
  • Genişletilebilirlik (Extensibility): Mevcut kodun davranışını değiştirmeden yeni özellikler eklemek OOP prensipleri sayesinde kolaylaşır.
  • Modülerlik (Modularity): Uygulama, birbirinden bağımsız ve iyi tanımlanmış modüllerden oluşur, bu da geliştirme ve test süreçlerini kolaylaştırır.
  • Üretkenlik (Productivity): Tekrar kullanılabilir kod ve modüler yapı sayesinde geliştirme süreci hızlanır.
  • Esneklik (Flexibility) - Polimorfizm: Farklı sınıfların ortak bir arayüz üzerinden farklı şekillerde davranabilmesi, kodun daha esnek olmasını sağlar.
  • Güvenlik (Security) - Kapsülleme ve Soyutlama: Verilerin ve metotların erişimini kısıtlayarak (kapsülleme) ve karmaşık detayları gizleyerek (soyutlama) daha güvenli uygulamalar geliştirilebilir.
  • Kolay Yükseltilebilir ve Ölçeklenebilir (Easy Upgradable & Scalable): Modüler yapı ve iyi tanımlanmış arayüzler sayesinde uygulamaların güncellenmesi ve ölçeklendirilmesi kolaylaşır.
  • Arayüz Tanımlama (Interface Descriptions): Arayüzler aracılığıyla farklı sınıfların uyması gereken sözleşmeler tanımlanabilir.
  • Bakım (Maintenance): Modüler ve okunabilir kod, hataların bulunmasını ve düzeltilmesini kolaylaştırır. Namespace'ler ise sınıfları mantıksal olarak bir araya getirerek organizasyonu artırır.

OOP'nin Temel İlkeleri

OOP'nin temelini oluşturan dört ana ilke şunlardır:

  • Kapsülleme (Encapsulation): Bir sınıfın metotlarını ve özelliklerini bir arada tutarak, verilere doğrudan dışarıdan erişimi kısıtlamayı ve kontrollü erişim sağlamayı amaçlar. Erişim belirleyiciler (access modifiers) kullanılarak sağlanır.
    class KlasAdi
    {
        private string _yazi; // Özel alan (field)
     
        public string Yazi // Özellik (Property) - Kapsülleme örneği
        {
            get { return _yazi; }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    _yazi = value;
                }
                else
                {
                    throw new ArgumentException("Yazı boş olamaz.");
                }
            }
        }
     
        public void Yazdir() // Metot
        {
            System.Console.WriteLine(_yazi);
        }
    }
    
  • Miras/Kalıtım (Inheritance): Mevcut bir sınıftan (base class veya parent class) yeni sınıflar (derived class veya child class) türetme mekanizmasıdır. Türetilen sınıflar, temel sınıfın tüm public, protected ve internal üyelerini otomatik olarak devralır ve kendi özel üyelerini ekleyebilir veya devraldığı üyelerin davranışını değiştirebilir (override). C#'ta tekli kalıtım desteklenir (bir sınıf yalnızca bir temel sınıftan türeyebilir).
    class Canli
    {
        public string Ad { get; set; }
        public virtual void SesCikar()
        {
            System.Console.WriteLine("Bir ses.");
        }
    }
     
    class Kedi : Canli
    {
        public override void SesCikar()
        {
            System.Console.WriteLine("Miyav!");
        }
    }
    
  • Çok Biçimlilik (Polymorphism): Bir nesnenin farklı türlerinmiş gibi davranabilme yeteneğidir. Temelde iki tür polimorfizm bulunur:
    • Derleme Zamanı Polimorfizmi (Metot Aşırı Yükleme - Method Overloading): Aynı isimde ancak farklı parametre listelerine sahip metotların tanımlanabilmesidir.
    • Çalışma Zamanı Polimorfizmi (Metot Ezme - Method Overriding): Temel sınıfta virtual olarak işaretlenmiş bir metotun, türetilen sınıfta override anahtar kelimesiyle farklı bir şekilde uygulanabilmesidir.

class Hesaplayici
{
    public int Topla(int a, int b) { return a + b; } // Aşırı yüklenmiş metot
    public double Topla(double a, double b) { return a + b; } // Aşırı yüklenmiş metot
}
 
// Çalışma zamanı polimorfizmi örneği (yukarıdaki Kedi sınıfı da bir örnektir)
Canli hayvan1 = new Canli();
Canli hayvan2 = new Kedi();
hayvan1.SesCikar(); // "Bir ses." çıktısı
hayvan2.SesCikar(); // "Miyav!" çıktısı (polimorfizm sayesinde Kedi'nin davranışı sergilenir)

 

  • Soyutlama (Abstraction): Bir nesnenin karmaşık iç yapısını gizleyerek yalnızca gerekli ve ilgili bilgilerin dış dünyaya sunulmasıdır. abstract sınıflar ve interface'ler aracılığıyla sağlanır. abstract sınıflardan nesne oluşturulamaz ve soyut metotlar gövdesizdir, türetilen sınıflar tarafından uygulanmak zorundadır. interface'ler ise sınıfların uygulaması gereken bir sözleşmeyi tanımlar.
    abstract class Sekil
    {
        public abstract double AlanHesapla();
        public virtual void Ciz()
        {
            System.Console.WriteLine("Şekil çiziliyor.");
        }
    }
     
    class Daire : Sekil
    {
        public double Yaricap { get; set; }
        public override double AlanHesapla()
        {
            return Math.PI * Yaricap * Yaricap;
        }
        public override void Ciz()
        {
            System.Console.WriteLine("Daire çiziliyor.");
        }
    }
     
    interface ILoglayici
    {
        void Log(string mesaj);
    }
     
    class DosyaLoglayici : ILoglayici
    {
        public void Log(string mesaj)
        {
            System.IO.File.AppendAllText("log.txt", mesaj + Environment.NewLine);
        }
    }
    

Erişim Belirleyiciler (Access Modifiers)

Sınıf üyelerinin (alanlar, özellikler, metotlar) erişilebilirliğini kontrol etmek için kullanılan anahtar kelimelerdir:

  • public (Genel): Her yerden erişilebilir.
  • private (Özel): Yalnızca tanımlandığı sınıf içinden erişilebilir (varsayılan erişim belirleyicidir).
  • protected (Korumalı): Tanımlandığı sınıf ve ondan türeyen sınıflar içinden erişilebilir.
  • internal (İçsel/Dahili): Aynı proje (assembly) içinden erişilebilir.
  • protected internal (Korumalı İçsel/Dahili): Aynı proje içinden veya farklı bir projede türetilmiş sınıflar içinden erişilebilir (protected OR internal).

Niteleyiciler (Modifiers)

Sınıfların ve üyelerinin davranışlarını değiştiren anahtar kelimelerdir:

  • static (Statik): Sınıfın bir örneği oluşturulmadan erişilebilen üyeleri tanımlar. Statik sınıflardan nesne oluşturulamaz ve tüm üyeleri statik olmalıdır.
  • abstract (Soyut): Nesne oluşturulamayan ve soyut metotlar içerebilen sınıfları tanımlar. Türetilen sınıflar soyut metotları uygulamak zorundadır.
  • virtual (Sanal): Temel sınıfta tanımlanan ve türetilen sınıflarda override ile yeniden uygulanabilen metotları tanımlar.
  • sealed (Mühürlü): Kalıtımı engelleyen sınıfları tanımlar. Mühürlü sınıflardan başka sınıf türetilemez.
  • partial (Kısmi/Bölünmüş): Bir sınıfın tanımının birden fazla dosyaya yayılmasına olanak tanır.

Sınıflar ve Nesneler

  • Sınıf (Class): Gerçek dünyadaki nesnelerin soyut bir tanımıdır. Nesnelerin özelliklerini (alanlar, özellikler) ve davranışlarını (metotlar) tanımlar.
  • Nesne (Object): Bir sınıfın somut bir örneğidir. Bellekte yer kaplar ve sınıfın tanımladığı özelliklere ve davranışlara sahiptir. Nesneler, new anahtar kelimesi kullanılarak sınıflardan oluşturulur (instance almak).

Yapıcı Metotlar (Constructors) ve Yıkıcı Metotlar (Destructors)

  • Yapıcı Metotlar (Constructors): Bir sınıftan nesne oluşturulduğunda otomatik olarak çağrılan özel metotlardır. Nesnenin başlangıç değerlerini ayarlamak veya gerekli ilk işlemleri yapmak için kullanılırlar. Geri dönüş tipleri yoktur ve sınıf adıyla aynı isme sahiptirler. Aşırı yüklenebilirler (overloading).
  • Yıkıcı Metotlar (Destructors): Bir nesnenin bellekten silinmeden önce (garbage collection tarafından) otomatik olarak çağrılan özel metotlardır. Genellikle kullanılan kaynakları serbest bırakmak için kullanılırlar. C# .NET'te yıkıcı metotların kullanımı diğer dillere göre daha az yaygındır çünkü bellek yönetimi otomatik olarak yapılır.

Arabirimler (Interfaces)

Arabirimler, sınıfların uygulaması gereken bir sözleşmeyi tanımlar. İçlerinde yalnızca metot ve özellik bildirimleri (imzaları) bulunur, uygulama detayları yer almaz. Bir sınıf birden fazla arabirimi uygulayabilir (çoklu kalıtım benzeri bir yapı sağlar). Arabirim isimleri genellikle I harfi ile başlar (bir konvansiyondur).

Enumlar (Numaralandırmalar)

Enumlar, adlandırılmış sabit değerler kümesini tanımlamak için kullanılır. Kodun okunabilirliğini artırır ve belirli bir değer aralığını temsil etmek için kullanışlıdırlar.

Listeler ve Anonim Tipler

  • Listeler (List<T>): Dinamik boyutlu, aynı türden nesnelerin koleksiyonlarını temsil eder.
  • Anonim Tipler: Derleme zamanında türü belli olmayan, geçici nesneler oluşturmak için kullanılır (var anahtar kelimesi ve nesne başlatıcısı ile).

Operatör Aşırı Yüklemesi (Operator Overloading)

Bazı durumlarda, sınıflarımızın nesneleri üzerinde standart operatörlerin (+, -, == vb.) farklı anlamlar taşımasını isteyebiliriz. Operatör aşırı yüklemesi ile bu operatörlerin sınıflarımız için özel davranışlar sergilemesini sağlayabiliriz.

Kısmi Sınıflar (Partial Classes)

Kısmi sınıflar, bir sınıfın tanımının birden fazla .cs dosyasına bölünmesine olanak tanır. Özellikle büyük projelerde veya otomatik kod üretimi senaryolarında kullanışlıdır.

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile Nesne Yönelimli Programlama'nın temel prensiplerini, avantajlarını ve C#'taki temel yapı taşlarını kapsamlı bir şekilde inceledik. OOP, modern yazılım geliştirmenin vazgeçilmez bir parçasıdır ve sağlam, esnek ve sürdürülebilir uygulamalar inşa etmek için güçlü bir araç setidir. Umarım bu detaylı rehber, OOP'nin mantığını anlamanıza ve C# projelerinizde etkin bir şekilde uygulamanıza yardımcı olur. Bir sonraki yazımızda, .NET Framework'ün diğer önemli özelliklerini keşfetmeye devam edeceğiz.

Webkolog'u takipte kalın!

Hepinize nesne yönelimli ve başarılı kodlama deneyimleri dilerim!

 

0 yorum:

Yorum Gönder