Polymorphism Nedir ?
Bir önceki yazımızda Method Overloading ve Method Overriding kavramlarını ayrıntılı olarak ele aldık ve bu kavramlar arasındaki farklılıklar ve benzerlikleri inceledik. Bu yazımızda ise Polymorphism konusunu ele alacağız. (Not : Polymorphism kavramının mantığını ve kullanımını öğrenmek için Inheritance ve Method Overloading&Method Overriding gibi konulara tam olarak hakim olmanız gerekmektedir. Aksi taktirde bazı noktaların kafada oturması mümkün olmayacaktır.)
İlk yazımızda OOP kavramının “Gerçek hayatın yazılıma uyarlanması” olduğunu söylemiştik. Bu sebeple ufak bir gerçek hayat örneği vererek mantığı anlamaya çalışalım :
Teknolojik ürünler satan bir mağazaya girdiniz. Bilgisayar, telefon, şarj aleti, kulaklık gibi pek çok farklı kategori görmeniz mümkün. Bu ürünlerin hepsinin ortak bazı özellikleri bulunmaktadır. Örneğin her ürün fiyat bilgisi, garanti süresi gibi özelliklere sahiptir çünkü bu ürünlerin hepsini “Teknolojik Ürün” başlığı altında toplamak mümkündür. Bu sebeple alt ürünlerin(telefon, bilgisayar gibi) teknolojik ürün gibi davrandığını söyleyebiliriz. Yazılım dünyasında da mantık aynen bu şekildedir. Ne demek istediğimizi daha ayrıntılı incelemek için klasik örneğimiz üzerinden devam edelim. Hem gelen güncellemeleri görmek hem de önceki yazıları okumayanlar için problem özeti :
Projede, bir sosyal medya uygulamasındaki kullanıcının profil sayfası üzerine kullanıcı bilgilerini yerleştirmek istiyoruz. Uygulamada kullanıcılar, reklam görmek istemeyerek yıllık para ödeyebilir veya uygulamayı ücretsiz kullanmaya devam ederek reklam izlemeyi tercih edebilir. Bu sebeple “Premium Kullanıcı” ve “Normal Kullanıcı” olmak üzere iki farklı kullanıcı tipi bulunsun. Her iki kullanıcı türü de kullanıcı adı, yaşadığı ülke ve yaş özelliklerine sahip olsun. Premium kullanıcılar ek olarak yıllık ödenen para özelliğine sahip olsun. Ayrıca, Main sınıf içerisinde tüm kullanıcılar için bilgilerin gösterilmesini gerçekleştiren showUserInfo() metodu bulunsun.
POLYMORPHISM
Çok biçimlilik olarak bilinir. Teknik olarak; bir üst sınıf referansının tüm alt sınıf nesnelerini tutabilmesidir. Bilindiği gibi, alt sınıftaki nesneler üst sınıfın sahip olduğu metotlara(static ve final tanımlı metotlar hariç) da sahiptirler (Örneğin, oluşturduğunuz bir nesne üzerinde Object sınıfına ait metotları görmeniz mümkündür). Bu özellik ile birlikte Polymorphism, bir üst sınıf referansı ile alt sınıftaki nesnelerin kullanılabilmesine olanak sağlar. Buradaki avantaj, bir işlemi gerçekleştirirken hangi sınıfa ait nesne ile işlem gerçekleştirdiğimizi bilmemize gerek kalmamasıdır. Öncelikle UpCasting olarak adlandırılan işlemi, yani üst sınıf referansının alt sınıf nesnelerini nasıl tuttuğunu inceleyelim :
Yukarıda gördüğünüz işlem UpCasting olarak adlandırılır. User sınıfı ve bu sınıftan türeyen PremiumUser sınıfı ile bu işlemi gerçekleştirdik. User sınıfından user(veya user2) isimli bir referans oluşturuldu ve PremiumUser sınıfından oluşturulan nesne bu referans ile tutuldu. UpCasting, Polymorphism olarak adlandırılan soyut yaklaşımın gerçekleştirilmesini sağlar.
Polymorphism, aynı zamanda nesnelerin birbirlerini tanımadan haberleşmeleri olarak da tanımlanabilir. Bu soyut kavramın kafada daha net canlanabilmesi açısından bir kod örneği üzerinden ilerleyelim :
Output :
— Kullanıcı Bilgileri —
Kullanıcı Adı : Kullanıcı
— Premium Kullanıcı Bilgileri —
Kullanıcı Adı : Premium Kullanıcı
Ödenen ücret : 250.0
— Normal Kullanıcı Bilgileri —
Kullanıcı Adı : Normal Kullanıcı
Görüldüğü gibi User sınıfında showInfo() isimli bir metot bulunmakta ve alt sınıflar bu metotu Override ederek kendilerine göre işlem gerçekleştirmekteler. (NormalUser sınıfında bu metodun Override edilmemiş olmasına rağmen User sınıfının referansı(user2) ile bu metodun kullanılabildiğine dikkat ediniz. Alt sınıftaki bir nesne üst sınıfın sahip olduğu metotlara sahip olabilmektedir.) Main içerisindeki static tanımlı showUserInfo() metodunun ise işlemlerini gerçekleştirebilmek için yalnızca en üst sınıftan(User) türemiş bir parametre alması yeterlidir. Böylece, tek parametre ile tüm alt tipler için bu işlemi gerçekleştirebilmesi sadece bir satırlık bir koddan ibarettir. Görüldüğü gibi, showUserInfo metodu hangi sınıf nesnesi için bilgi gösterdiğinden habersiz olmasına rağmen program doğru çalışmaktadır. Böylece, projeye yeni alt sınıflar(GoldenUser, PlatinUser gibi) eklenmesi durumunda showUserInfo() metodu içerisinde herhangi bir değişiklik yapmaya gerek kalmayacaktır. İstenildiği kadar alt sınıf eklensin, o metot hep bir satırlık uzunluğa sahip olacaktır. Bu durum, Polymorphism’in sağladığı çok büyük bir avantajdır. Projenin büyümesi durumunda pek çok yerin değiştirilmesine gerek kalmaz, böylece hata yapma riski azalır ve daha derli toplu bir kod görüntüsü elde edilir.
POLYMORPHISM AVANTAJLARI
1- Bir işlemin birden fazla yol ile gerçekleştirilebilmesine olanak sağlar. Teknik olarak ifade edilecek olursa; tek Interface ile birden fazla implementasyon gerçekleştirilebilir.
2- Kodun yeniden kullanılabilirliğini artırır.
3- Tekrar tekrar kod yazımını engeller. Böylece, hem kontrol işlemleri için harcanan maliyet azalır hem de zamandan tasarruf edilir. Ayrıca, daha düzenli bir kod görüntüsü sağlanır.
PROJE
Polymorphism konusunun ayrıntılarını ve inceliklerini öğrendiğimize göre kendi projemizin tamamını incelemeye başlayabiliriz :
Output :
— Kullanıcı Bilgileri —
Kullanıcı Adı : Kullanıcı
Kullanıcı Ülke : Türkiye
Kullanıcı Yaşı : 23
— Premium Kullanıcı Bilgileri —
Kullanıcı Adı : Premium User
Kullanıcı Ülke : England
Kullanıcı Yaşı : 22
Yıllık ödenen ücret : 599.99TL
— Normal Kullanıcı Bilgileri —
Kullanıcı Adı : Normal Kullanıcı
Kullanıcı Ülke : Türkiye
Kullanıcı Yaşı : 21
Bir sonraki yazıya göz atmak isteyebilirsiniz :