Nesne Yönelimli Programlamada 4 Temel İlke
Uzunca bir zaman sonra nesne yönelimli programlama makale serisine 2. yazım ile devam ediyorum. Nesne yönelimli programlama makale serimizdeki detaylara şu yazımızdan ulaşabilirsiniz. Bir önceki yazımızda nesne yönelimli programlamanın ne olduğuna, neyi ifade ettiğine ve temel class yapısına değinmiştik. O yazıya ulaşmak için tıklayınız. Bu yazımızda nesne yönelimli programlamada 4 temel ilke konusuna değiniyor olacağız.
Serimize nesne yönelimli programlamanın 4 temel ilkesi ile devam ediyor olacağız. Nesne yönelimli programlamada aşağıdaki 4 temel ilkeye yer verilir:
- Abstraction(Soyutlama)
- Inheritance(Kalıtım)
- Encapsulation(Kapsülleme)
- Polymorphism(Çok Biçimlilik)
Yazımızın devamında 4 temel ilkeye sırasıyla alt başlıklar halinde değinerek açıklayacağız.
Abstraction (Soyutlama)
Abstraction, yani soyutlama, nesne yönelimli programlamanın en temel kavramlarından biridir. Abstraction yapısı ile alt sınıfların özellik ve işlevlerini taşıyan fakat nesnesi tanımlanmayan bir üst, base sınıf oluşturmak istendiğinde abstraction yapısı kullanılır. Alt sınıflar türetilirken ilgili sınıfın hangi kuralları taşıyacağını, içerisinde ne gibi özelliklerin olabileceğini ve hangi işlevleri yerine getireceğini anlatan bir üst sınıfa ihtiyaç duyulur. İhtiyaç duyulan sınıfın oluşturulması ve soyutlanmasıyla birlikte sınıf içerisine alt sınıfların da kullanabileceği kuralları yazabiliriz.
Soyut sınıfın bazı özellikleri de bulunmaktadır:
- Tanımlanan soyut sınıf içerisinde işlevler veya özellikler private olamaz
- Soyut sınıftan nesne türetilemez. Nesne türetilecek sınıflar için referans oluşturmak amacıyla kullanılır.
- Soyut sınıflar içerisinde işlevler ile görevler yerine getirilemez. İşlevlerin neler olduğu ve kuralların tanımlanması gereken bir sınıftır.
- Soyut sınıf içerisinde tanımlanmış olan özellikler alt sınıflarda tekrar tanımlanmayıp direkt olarak kullanılabilir
Abstraction C# örneklendirmek gerekirse:
Üst soyut sınıf olarak UserType sınıfı tanımladık. UserType sırasıyla admin, editör ve yazar tipindeki kullanıcıların ortak sınıfı olarak ayarlandı. Alt sınıflar ise yine sırasıyla AdminUser, EditorUser ve AuthorUser olarak ele alındı.
Soyut sınıf içerisinde void olarak tanımlanan ve abstract ile işaretlenen UserTypeShow fonksiyonu alt sınıflarda override edilecek şekilde ayarlandı.
AdminUser sınıfı, UserType sınıfından türeyen ve bahsettiğimiz üzere UserType sınıfında abstract olarak işaretlenen UserTypeShow fonksiyonunu override olarak işaretlemiştir.
Program.cs dosyasında AdminUser sınıfından nesne oluşturularak ekrana fonksiyondan dönen değerin yazdırılması amaçlanmıştır.
Aynı şekilde EditorUser ve AuthorUser sınıflarından da nesneler oluşturularak sınıfa özel çıktı alınabilir. Burada dikkat edilmesi gereken en önemli hususlardan biri abstrac olarak işaretlenen özellik veya işlevlerin alt sınıflarda mutlaka override edilmesidir. Diğer önemli husus ise soyut sınıftan nesne türetilememesidir.
Inheritance(Kalıtım)
Nesne yönelimli programlamadaki en önemli ilkelerden biri olan Inheritence, kalıtım kavramı sıklıkla tercih edilen bir yapıdır. Türkçe karşılığı miras alma, kalıtım olan Inheritence kavramı bir nesnenin özelliklerinin farklı nesneler tarafından kullanılmasına olanak sağlamaktadır. Inheritence ile alt-üst ilişkisi kurularak sınıflar arasındaki ortak metot ve özelilklerin kullanılması da sağlanmaktadır.
Inheritance yapısında türeyen sınıf ve türeten sınıf kavramlarından bahsedebiliriz. Her sınıfın türediği sınıf kendi base sınıfı olur.
Base olarak Department isminde bir sınıfımız olsun. Department sınıfı bir şirketteki departmanları base alan bir sınıf olup içerisinde departmanın adı ve departman kontenjanı gibi tüm departmanlar için ortak iki değer alsın.
Alt sınıf olarak da Software ve Accounting gibi yazılım ve muhasebe departmanlarının olduğundan söz edelim. Her bir alt sınıf üst sınıftaki değerleri kapsamakla birlikte kendi içerisine özel değerler de tanımlanabilir.
Software sınıfında yazılım departmanına özel olarak kullanılan programlama dilini tutan bir değer ifade edilmiştir.
Muhasebe sınıfında ise gelir ve gider hesabını gösteren iki farklı değer eklenmiştir.
Alt sınıflar ve base sınıf sayısı arttırılarak örnekler çoğaltılabilir.
Encapsulation(Kapsülleme)
Encapsulation, kapsülleme prensibi, bir nesneye ait özellik ya da işlevlerin farklı sınıflar ve nesnelerden saklanmasıdır. Private veya protected erişim belirtecinin kullanılmasıyla bir alan başka sınıflardan gizlenir. Ayrıca bu alan başka sınıflar tarafından da kullanılamaz.
Kapsülleme ile birlikte nesnelerin bilinçsiz kullanımının önüne geçilir. Ancak bazı durumlar vardır ki private olarak tanımlanan alanlara erişmek ve özelliklerini de kullanmak gerekrbilir. Bu durumda ise devreye property kavramı girer. Alanın değerini geri döndürmek için get, değeri üzerinde değişiklik yapmak için ise set kullanılır.
Encapsulation örnek olarak kullanıcıdan kullanıcı adı ve şifre istendiğinde kullanıcı adında nümerik değerlerin geçmemesini kontrol eden programı yazalım.
Kabataslak olarka bakıldığında userName ve password alanları private olarak tanımlanmıştır. Dışarıdan bu değerlerin okunması için ise public olarak belirtilen UserName ve Password tanımlamaları yapılmıştır.
Sırasıyla UserName ve Password alanlarına bakacak olursak:
UserName tanımlamasında get olarak private tanımlanan username değeri alınmıştır. Gönderilen değerdeki her bir karakter de kontrol edilerek içerisinde sayısal ifadeye yer verilmesi durumunda bir uyarı çıkarılması için not düşülmüştür.
Password alanı ise yine kullanıcıdan okunacak ve verisi set edilecek şekilde düzenlenmiştir. İstendiği taktirde password için de kontroller yazılabilir.
Mainde UserControl nesnesi türetilerek kullanıcı ve şifre belirlenmek istenmiştir. Ancak kullanıcı adında kurala aykırı bir durum olduğu için hata ekranda bastırılmıştır.
Encapsulation ilkesi genel hatlarıyla bu şekildedir. Farklı nesnelerden, sınıflardan gizlenmesi gereken ancak bazı durumlarda okunması, yazılması istenen alanlar için bir koruma yöntemidir.
Polymorphism(Çok Biçimlilik)
Nesne yönelimli programlamada son temel ilke olan polymorphism, yani çok biçimlilik ilkesi, çoklu fonksiyonlar olarak da nitelendirilir. Metotların ve türetilmiş sınıfların yeniden tanımlanması yeteneği olarak da açıklanabilir.
Polymorphizm kavramını iki farklı yol ile değerlendirebiliriz:
- Çalışma esnasında türetilen nesne örneklerindeki metotlara ait parametreler veya diziler temel sınıf ögeleri olarak ele alınabilir.
- Temel sınıflar içerisinde virtual metotlar tanımlanarak uygulanabilir. Base sınıftan türetilen methotlar override edilebilir.
Bu noktada virtual kavramını da açıklamak gerekir:
Virtual metotlar kalıtım yoluyla aktarılmış oldukları sınıflar içerisinde override edilerek değiştirilebilirler. Override edilmeden kullanıldıklarında ise temel sınıf içindeki tanımlanan değerler ile çalışırlar.
Base olarak tanımlanan DataBase sınıfı içerisinde virtual bir metot oluşturulmuştur.
Alt sınıf olarak ise sırasıyla SqlDatabase ve OracleDatabase sınıfları oluşturulmuş ve base sınıftaki sınıftaki metot override edilerek çağrılmıştır.
Main’de ise Database sınıfı List şeklinde nesne türetilerek sırasıyla alt sınıflar çağrılmıştır.
Çıktı olarak ise base sınıftan türetilmiş olan sınıfların aynı fonksiyona farklı davranış biçimleri sergilediği görülmüştür.
Nesne yönelimli programlamada ele alınan 4 temel ilke bunlardan oluşmaktadır. Yer verdiğim örnek kodları github üzerinden paylaştım. Örnek kodlara buradan ulaşabilirsiniz. Bir sonraki ele alacağım konu ise yine OOP’de en önemli detaylardan biri olan “Conscructor (Yapıcı Metot) Nedir?” konusu olacaktır.
Yazı için düşünce, görüş ve önerilerinizi yorumlarda belirtebilirsiniz, bir sonraki yazıda görüşmek üzere…
Bir yorum
Geri bildirim: