INTERFACE (ARAYÜZ) nedir ? Gerçek Hayatın Neresindedir?
Sayısız yazıda olduğu gibi “
interface sadece fonksiyon ve property lerin tanımlanmaları içerir. Ve işlevler public olmak zorundadır. Ayrıca Interface kendisine uygulayan sınıflar bu işlevlerin tamamını implemente etmek zorundadır …” cümleleri bu yazıda bulamayacaksınız. Sebebi ise,
benzer bir tanesini zamanında benimde yazmış olmam değil elbette Bu yazının amacı size, interface’in gerçek anlamda ne işe yaradığını ve niye kullanıldığını anlatabilmek.
Başlangıç olarak Interface’in nerden çıktığından merak ediyorsanız, nesneye yönelik her kavramın, her yordamın tek çıkış noktası olan “HAYAT” tan çıktı elbette. Çok felsefi bir cümleyle, kestirip atmayacağız tabiî ki böylesine önemli bir kavramı…
Çevrenizde o kadar çok örnek var ki Interface’i sembolize eden. Bunları bu zaman kadar fark etmediyseniz, eminim ki bu yazının ortalarına bile gelmeden kendi örneklerinizi kafanızda oluşturmaya başlayacaksınız.
Öyle ki en basitinden, sosyal hayatımızdaki her bir unvanın (Doktor, Şoför, Öğretmen, Yazılımcı…) yetkinlikleri aslında bir Interface ile o ünvanlara sunulmaktadır.
O da ne demek mi?
Şöyle ki, Interface nesneleri isimleriyle değil de işlevleriyle tanımlamaktır. Ve sistemleri isimlere bağımlı olmaktan kurtarmıştır. Ayrıca varlığa da farklı durumlarda farklı işlevler gerçekleştirebilmesine imkân tanımıştır.
Örneklersek :
• Servisinizin şoförünü, ismiyle değil de servisinizi kullanabilen olarak tanımlarsanız, işe gelişiniz illaki ismiyle tanımladığınız şoföre bağımlı olmaktan çıkar. Servisinizi kullanabilen herhangi bir şoför, işe gelişinizi sağlayacaktır. Ayrıca ismiyle tanımladığınız o şoför de yeri geldiğinde aynı (ya da farklı) serviste, yolcu olarak da seyahat edebilecektir.
Teknik olarak yukarıdaki örneği biraz açarsak,
Sınıfınızda bulunan PersonelServisiniGerceklestir fonksiyonu Sofor ve Yolcu sınıflarını parametre olarak alıp, bunları işleyeceğine;
Bool PersonelServisiGerceklestir(Sofor sofor , Yolcu yolcu) { … } yerine
Bool PersonelServisiGerceklestir(ISofor sofor , IYolcu yolcu) {…} almalıdır.
Ve Sofor ve Yolcu isimli iki farklı sınıfınız ISofor ve IYolcu Interface’lerini kendilerine uygulamalıdırlar. İhtiyaç durumunda Sofor sınıfına IYolcu Interface’ini de uygulayıp, şöfor olmasına rağmen serviste yolcu olarak da seyahat edebilmesini sağlarsınız. Burada mühim olan, Servisi kullanmak için illa ki Sofor tipinde birisinin değil, ServisKullanma() işlevine sahip herhangi bir tipin olmasının yeterli olmasıdır. Aynı şekilde seyahat edebilmesi için illa ki yolcu tipinde olmak zorunda değil, SeyahatEtme() işlevine sahip bir tipte olmasın yeterli olmasıdır. Karnımızı doyurmak için yediğimiz çeşit türlü yiyecek ve içeceğin tipinin ne olduğu değil Yenilebilir olmasının önemli olduğu gibi
- Matematik sınavına hazırlanırken, sizi sınava çalıştıran kişinin Matematik Öğretmeni, Öğretmen , Matematik bilen yakınlarınız gibi tek bir tipte olma zorunluluğu olmaması gibi. Önemli olan matematik biliyor ve size aktarabiliyor olmasıdır. Yani isim değil işlev önemlidir.
- Not almak için kullandığınız kağıdın yerine zaman zaman geçebilen peçete kağıtları da yukarıda anlattıklarımıza birer örnek teşkil eder. Önemli olan tipinin kağıt olması değil, üzerine yazılabilir olmasıdır.
Eminim örneklerimden isimlerden ziyade işlevlerin önemli olduğunu ve hayatta da her şeyin işlevler üzerinden döndüğünü fark etmişsinizdir. Hayat bize esneklik, kullanılabilirlik, genişleyebilirlik sağlamak adına bunu gerçekleştiriyor. Bizi nesnelerden soyutlayarak, bağımlılıklardan da gevşek bağlayarak kısmen kurtarıyor.
Hatta değişime de kapalı bir olmak için direniyor. Düşünsenize, yeni bir yiyecek çıktığında, bedeninizi açıp sindirim sisteminize, o yiyeceğin nasıl sindirileceğinin organlarınıza öğretildiğini… Halbuki o yiyeceğin nasıl sindirileceğin bilgisi kendi üzerindedir. Organlarınız sadece Sindir() işlevini çalıştır, ve o yiyecek nasıl sindirilmesi gerekiyorsa öyle sindirilir. Bir dakika ! Bu yukarıda bahsettiklerimizden biraz farklı oldu sanki. Evet, farklı oldu. Interface, işlevin nasıl gerçekleştirileceğinden habersiz olarak işlevi gerçekleştirilmesini sağlar. “Ne” ile “Nasıl” ı birbirinden ayırır. Ne gerçekleştireceğini bilir, nasıl gerçekleştireceğini bilmez. Nasıl gerçekleştireceği, işlevi uygulayan nesnenin kendisinde gizlidir. Gizlidir ? Evet , Interface, işlevin gerçekleştirimini gizler. Tabiki bu gizleme “Nasıl” ile “Ne” nin ayrımıdır. Bahsettiğimiz “enkapsüle” etmek değildir.
Şimdilik bu kadar… Devamı daha da soyutlaşarak gelecektir.
Mehmet hocam,
Güzel bir yazı olmuş. Teşekkür ederiz.