Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.
Kullanılan programlama dili tarafından doğrudan desteklenmediği durumlarda arayüz kavramı, altyordam gövdeleri içermeyen ve altalan barındırmayan bir soyut sınıf tanımı ile benzetilebilir. Soyut sınıf kavramının doğrudan desteklenmediği yordamsal dillerde ise, arayüzde bulunması beklenen programlama öğelerinin başlık dosyası benzeri bir dosyada toplanması sağlanarak arayüz kavramına öykünülebilinir. Ancak, derleyici desteğinin bulunmaması nedeniyle, her iki kullanımın da hataya açık olduğu unutulmamalıdır.
Nesneleri Kategorize Etmekte Arayüz
Sınıf kavramı ve ilişkisinin sınıfları sıradüzenine koyarak bir terminoloji oluşturmasına benzer bir şekilde, arayüz kavramı ve gerçekleştirme ilişkisi de sınıfları kategorilere ayırır. Herhangi bir arayüzü gerçekleştiren sınıflar, arayüzün tanımladığı kategoriye ait sayılır ve bu sınıfların nesneleri gerçekleştirilen arayüzün tutacağı ile kullanıldıklarında, aynı kategoride bulundukları için, çokbiçimli bir şekilde kullanılabilirler.
Ne kastedildiği sıklıkla kullanılan bir işlemle daha iyi anlaşılacaktır: sıralama. Bir grup verinin belirli bir öncelik-sonralık ilişkisine uygun olarak yeniden düzenlenmesi şeklinde tanımlanabilecek sıralama işlemi, söz konusu verilerin karşılaştırılabilir olmasını gerektirir. Zira, hangi verinin önce, hangi verinin sonra geleceği ancak karşılaştırma ile anlaşılabilir. Sıralanmak istenebilecek verilerin çeşitliliği düşünüldüğünde, karşılaştırma işleminin üstsınıfta yapılacak dinamik iletimli bir atyordam tanımının altsınıflarda ezilmesi ile gerçekleştirilemeyeceği görülür. Çünkü, böylesine bir çözüm üstsınıf ve altsınıflar arasında bir benzerlik ilişkisini gerektirir. Halbuki, birbiriyle alakasız pek çok kavram karşılaştırma işlemini desteklemek durumunda kalabilir. Karşılaştırma işleminin sınıf sıradüzeninin kök sınıfına taşınması da bir çare olmayacaktır; böylesine bir uygulama, matemetikteki matrisler gibi karşılaştırılamaz değerlerin de karşılaştırılabilir olduğu algısına neden olacaktır. Gerçek çözüm, karşılaştırılabilirlik kategorisine karşılık gelen bir arayüzün tanımlanması ve isteyen sınıfların bu arayüzü gerçekleştirmesinden geçer.
Yazılım Bileşenleri Geliştirmede Arayüz
Yazılım geliştirmede arayüz kavramının temel kullanım amacı standart oluşturmaktır. Birbirini tamamlayan bileşenlerin bağımsız bir biçimde geliştirilmesine olanak tanımak ve aynı işlevi gören bileşenlerin tak-çıkar mantığıyla birbirinin yerine kullanılmasını kolaylaştırmak için böylesine bir yaklaşım zorunludur. Bu sayede, pazardan alınacak hazır bileşenler ve bileşenlerin paralel geliştirilmesinin yardımıyla daha güvenilir ürünlerin daha hızlı geliştirilmesi mümkün olacaktır. Bu, aşağıdaki zaman sıralamasına göre verilmiş etkinliklerden daha iyi anlaşılacaktır.
- Bir şirketler konsorsiyumu, B1 bileşenine ilişkin arayüzleri tanımlar.
- Ş1 şirketi, tanımlı standarda uygun bir B1 bileşeni geliştirir.
- Ş2 şirketi, B1, B2 ve B3 bileşenlerinin kullanıldığı Ü1 ürününü geliştirir.
- B1 bileşeni Ş1 şirketinden alınır.
- Arayüzleri tanımlanan B2 ve B3 bileşenleri bağımsız iki proje grubu tarafından Ş2 şirketi bünyesinde geliştirilir.
- B1, B2 ve B3 bileşenleri birleştirilerek Ü1 oluşturulur.
- Ş2 şirketi Ü1 ürününü piyasaya sürer.
- Ş3 şirketi, tanımlı standarda uygun bir B1 bileşeni geliştirir.
- Ş2 şirketi, bir sonraki sürümün performansını geliştirmek adına, B2 ve B3 bileşenlerini elden geçirir.
- Müşterilerden Ü1'e ilişkin performans şikayetleri gelir.
- Ş1 şirketi, B1 bileşenini Ş3'ten aldığı gerçekleştirim ile değiştirir. Ayrıca, B2 ve B3'ün yeni uyarlamaları Ü1'e tümleştirilir.
- Müşteriler daha yüksek performanslı yeni ürünü, kendi yazılımlarında hiçbir değişiklik yapmadan kullanır.
Dikkat edilecek olursa, Ü1'in piyasaya sürülmesinden sonra Ş3 tarafından geliştirilen B1 bileşeni sorun olmaksızın kullanılabilmektedir. Aynı şekilde, Ü1'in performansı geliştirilmiş uyarlaması da müşterinin daha önceden geliştirdiği yazılımın içinden rahatlıkla kullanılmaktadır. Geleceğe yapılan bu yolculukların her iksi de, arayüz tanımları sayesinde mümkün olmaktadır. Bunu, tadilat geçiren bir evin bölüm bölüm değiştirilmesine benzetebiliriz: doğramaların değiştirilmesi için evin yıkılıp yeniden yapılması gerekmez; aynı standarda uygun üretilen doğramanın eskisinin yerine takılması yeterli olacaktır.
Arayüz Gerçekleştirme Yoluyla Çokbiçimlilik
Sınıfların ortak paydası olarak tanımlanması, arayüzlerdeki iletilerin çokbiçimli olarak kullanılabilmesini olanaklı kılar; arayüz tutacağı yoluyla gönderilecek iletiler, tutacağın temsil ettiği nesnenin sınıfındaki ilişkin gerçekleştirimin kullanılmasına neden olacaktır. Yandaki şekilden izleyecek olursak, nesneye gönderilecek iletiler öncelikle arayüz tutacağının eleğinden geçer. Arayüz türünde listelenmeyen iletiler derleyici tarafından reddedilecektir. Derleyici denetiminden geçen programın çalıştırılması sırasında ise, denetim akışının ileti gönderiminin yapıldığı yere gelmesi arayüz tutacağının gösterdiği nesnenin sınıfındaki—gerçekleştirilmiş veya kalıtlanmış—aynı imzaya sahip altyordamın çağrılmasına neden olur. Arayüz tutacağının gösterdiği nesnenin türünün, tutacak türünü doğrudan veya dolaylı bir biçimde gerçekleştiren bir sınıf olması zorunludur.
Arayüz gerçekleştirme ve arayüz tutacağının bu şekilde kullanılması, sınıf kalıtlama ve üstsınıf tutacağının kullanılması ile gelen çokbiçimliliğin getirdiği avantajları getirir. Arayüzdeki iletileri kullanarak yazılmış kod, arayüzü gerçekleştiren tüm sınıflar için çalışacak ve böylece aynı iskelete sahip kod parçalarının değişik sınıflar için tekrar tekrar yazılmasının önüne geçilmiş olacaktır. Bu ise, kodda yapılması istenen bir değişikliğin tek bir yerde yapılması anlamına gelir ki, kodun yeniden kullanımını sağlayan böylesine bir yaklaşım kod bakımını da kolaylaştıracaktır.
Programlama Dilleri ve Arayüz Kavramı
Kimi programlama dilleri arayüz kavramını dildeki bir yapı ile doğrudan desteklerken, diğerleri var olan yapıların disiplinli bir biçimde kullanılması yoluyla dolaylı olarak destekler. Takip eden alt bölümlerde her iki gruba dair örnekler verilmektedir. Dikkat edilecek olursa, ne şekilde desteklenirse desteklensin, arayüz tanımında herhangi bir gerçekleştirim ayrıntısının ele verilmediği, kullanıcı ile paylaşılan programlama öğelerinin—altyordam imzaları ve simgesel sabitler—değişmesi düşük olasılıklı öğeler olduğu görülecektir. Bu kısıtlamanın temelinde arayüzün kullanıcı kodu ile gerçekleştirimci arasında bir sözleşme olması özelliği ve gerçekleştirimcinin yapacağı değişikliklerin kullanıcı kodunda değişikliklere yol açma ihtimalini en aza indirmek isteği yatar.
Java
Arayüz kavramını interface
yapısı ile doğrudan destekleyen Java'da programcının yapacağı olası bir hata kavramdan haberdar derleyici sayesinde önlenir. Programlama dili standardındaki tanımlara uygun gerçekleştirilmiş derleyiciler, metot gövdesi ve altalan tanımı gibi gerçekleştirim ayrıntısı olarak addedilen programlama öğelerinin arayüze konulmasına izin vermez. Ayrıca, standart görevi görme ve kullanıcı kodu ile gerçekleştirimci arasında sözleşme tanımlama özelliklerinin bir sonucu olarak, arayüz tanımında yer alan tüm öğelerin public
erişime sahip olduğu kabul edilir. Dolayısıyla, erişim niteleyicilerinin konulmasına gerek yoktur.
- IKesirliSayı.java
package matematik; import matematik.ayrıksıdurumlar.SıfırBölen; public interface IKesirliSayı { public IKesirliSayı böl(IKesirliSayı) throws SıfırBölen; IKesirliSayı çarp(IKesirliSayı); public IKesirliSayı çıkar(IKesirliSayı); public IKesirliSayı topla(IKesirliSayı); public double değer(); public long pay(); public long payda(); } // IKesirliSayı arayüzünün sonu
Arayüz tanımının derlenip sınıf yolu üzerinde uygun bir yere konulması sonrasında yapılması gereken, söz konusu kategoriye giren kavramların karşılığı olan sınıflarda bu arayüzün, belki de diğer arayüzlerle birlikte, gerçekleştirilmesidir. Bu noktada, arayüz(ler) ve sınıf arasındaki gerçekleştirme ilişkisinin bir taahhüt olduğu ve arayüz(ler)de listelenen tüm iletilerin gerçekleştirilmesi gerektiği unutulmamalıdır.
- KesirliSayı.java
package matematik; import matematik.IKesirliSayı; import matematik.ayrıksıdurumlar.SıfırBölen; public class KesirliSayı implements IKesirliSayı, Comparable<IKesirliSayı> { ... public IKesirliSayı böl(IKesirliSayı) throws SıfırBölen { ... } public IKesirliSayı çarp(IKesirliSayı) { ... } public IKesirliSayı çıkar(IKesirliSayı) { ... } public IKesirliSayı topla(IKesirliSayı) { ... } public double değer() { ... } public long pay() { ... } public long payda() { ... } public int compareTo(IKesirliSayı diğerSayı) { ... } ... private IKesirliSayı sadeleştir() { ... } ... } // KesirliSayı sınıfının sonu
IKesirliSayı
ve Comparable
arayüzlerinin gerçekleştirimine örnek olarak yukarıda sunulan iskeletin içi değişik şekillerde doldurulabilir. Ancak, ayrıntıda farklılık gösteren tüm sınıfların ortak bir özelliği olacaktır: gerçekleştirdikleri IKesirliSayı
ve Comparable
arayüzleri. Bu ise, söz konusu sınıfların nesnelerinin, yukarıda28 Eylül 2015 tarihinde Wayback Machine sitesinde arşivlendi. da anlatıldığı gibi, IKesirliSayı
veya Comparable
arayüzü türündeki tutacaklar vasıtasıyla çokbiçimli bir şekilde kullanılabileceği anlamına gelir. (Java'da arayüzler hakkında daha ayrıntılı bilgi için, buraya19 Ocak 2012 tarihinde Wayback Machine sitesinde . bakınız)
C++
Arayüz kavramını doğrudan desteklemeyen programlama dilinde programcıların belirli kurallara uyulan sınıf tanımlarıyla bu eksiği gidermeleri mümkündür. Öncelikle, altyordam gövdelerinin sağlanmaması koşulu, tüm fonksiyon tanımlarının dinamik iletimli boş fonksiyonlar (İng., pure virtual2 Ekim 2011 tarihinde Wayback Machine sitesinde arşivlendi.) olarak yapılması gerektiği anlamını taşır. Bu koşula uyulmaması, yapılmakta olan tanımı soyut/somut sınıf tanımına dönüştürür. Bir diğer önemli nokta ise, arayüzdeki tüm öğelerin kamuya açık ilan edilmesinin sonucudur: sınıf tanımının hemen başına public:
konulması bir alışkanlık haline getirilmeli ve gerçekleştirim ayrıntısı olmanın habercisi diğer erişim niteleyicilerinden kaçınılmalıdır. Ayrıca, kullanıcı ile paylaşılacak olan arayüz tanımının C++ kaynak dosyası yerine başlık dosyasına konulması da iyi bir alışkanlık olacaktır.
- IKesirliSayi.hxx
#ifndef IKESIRLISAYI_HXX #define IKESIRLISAYI_HXX #include "matematik/ayriksidurumlar/SifirBolen.hxx" using namespace matematik::ayriksidurumlar; namespace matematik { class IKesirliSayi { public: IKesirliSayi bol(IKesirliSayi) throw(SifirBolen) = 0; IKesirliSayi carp(IKesirliSayi) = 0; IKesirliSayi cikar(IKesirliSayi) = 0; IKesirliSayi topla(IKesirliSayi) = 0; long bolen(void) = 0; long bolunen(void) = 0; double deger(void) = 0; }; // IIKesirliSayi arayuzunun sonu } // matematik aduzayinin sonu #endif
- IComparable.hxx
#ifndef ICOMPARABLE_HXX #define ICOMPARABLE_HXX namespace sistem { template <class V> class IComparable { public: int compareTo(V) = 0; }; // IComparable arayuzunun sonu } // sistem aduzayinin sonu #endif
Tanımların tamamlanması ve ilişkin başlık dosyalarının kütük dizgesinde uygun yerlere konulması sonrasında sıra arayüzlerin gerçekleştirimine gelir. Arayüz kavramını desteklemeyen C++, doğal olarak, gerçekleştirme ilişkisinden de haberdar değildir. Dolayısıyla, gerçekleştirme ilişkisi yerine kalıtlama ilişkisini koymamız gerekecektir.
- KesirliSayi.cxx
#include "sistem/IComparable.hxx" using namespace sistem; #include "matematik/IKesirliSayi.hxx" #include "matematik/ayriksidurumlar/SifirBolen.hxx" using namespace matematik::ayriksidurumlar; namespace matematik { class KesirliSayi : public IKesirliSayi, public IComparable<IKesirliSayi> { ... public: IKesirliSayi bol(IKesirliSayi) throw(SifirBolen) { ... } IKesirliSayi carp(IKesirliSayi) { ... } IKesirliSayi cikar(IKesirliSayi) { ... } IKesirliSayi topla(IKesirliSayi) { ... } long bolen(void) { ... } long bolunen(void) { ... } double deger(void) { ... } int compareTo(IKesirliSayi digerSayi) { ... } ... }; // KesirliSayi sinifinin sonu } // matematik aduzayinin sonu
Arayüz ve bu arayüzü gerçekleştiren sınıfın kullanımına gelindiğinde bir noktanın unutulmaması yararlı olacaktır. Dinamik iletimli fonksiyonların çokbiçimli kullanılabilmesi için nesnelerin referans veya gösterici aracılığıyla kullanılması gerekir. Aksi takdirde, tüm çağrılar çalışma öncesinde bağlanacak ve kodun çokbiçimli kullanılması söz konusu olmayacaktır.
C
Yordamsal bir dil olan C, nesne paradigmasının gerektirdiği en temel kavramları dahi desteklemez. Dolayısıyla, sınıf, arayüz gibi dil düzeyi kavramların işletim dizgesi kavramı olan dosyadan yararlanarak gerçekleştirilmesi zorunludur. Genel strateji, C++'da uygulanan ile aynıdır: başlık dosyasında tanımlanan arayüzün C dosyasında gerçekleştirilmesi. Arayüz tanımında, gerçekleştirim ayrıntısı ele vermemek adına, dinamik iletimli çağrılacak fonksiyonların adreslerini tutan yapının dışında tanım verilmemeli, statik iletimli çağrılacak fonksiyonların extern
ile nitelenerek verilen deklarasyonu ile yetinilmelidir. Ayrıca, fonksiyonların işleyeceği ortak bir bellek bölgesi söz konusu ise, bunun tanımının da deklarasyon ile geçiştirilmesi ve asıl tanımın C dosyasına bırakılması gereklidir. Son olarak, nesne paradigmasında alıcı nesneyi temsilen tüm iletilere geçirilen saklı argüman (this
veya self
), derleyicinin nesne kavramından haberdar olmadığı düşünülerek, tüm fonksiyonlara ayrıca geçirilmelidir.
- IKesirliSayi.h
#ifndef IKESIRLISAYI_H #define IKESIRLISAYI_H struct _IKESIRLISAYI; typedef struct _IKESIRLISAYI* IKesirliSayi; typedef IKesirliSayi (*BOL)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); // throws SifirBolen typedef IKesirliSayi (*CARP)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef IKesirliSayi (*CIKAR)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef IKesirliSayi (*TOPLA)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef long (*PAY)(IKesirliSayi ileti_alici); typedef long (*PAYDA)(IKesirliSayi ileti_alici); typedef double (*DEGER)(IKesirliSayi ileti_alici); typedef struct _ARAYUZ_KESIRLISAYI { BOL bol; CARP carp; CIKAR cikar; TOPLA topla; DEGER deger; PAY pay; PAYDA payda; } *KesirliSayi_Arayuzu; #endif
- IComparable.h
#ifndef ICOMPARABLE_H #define ICOMPARABLE_H typedef void* Object; typedef int (*COMPARETO)(Object, Object); typedef struct _ARAYUZ_ICOMPARABLE { COMPARETO compareTo; } *Comparable_Arayuzu; #endif
Gerçekleştirim kısmına geldiğimizde, nesne yönelimli dillerde derleyiciler tarafından yapılan bazı şeyleri programcının yapması gerektiği unutulmamalıdır. Örneğin, nesnenin özelliklerine göre sağlanan fonksiyon gerçekleştirimleri ile fonksiyon göstericileri ilklenmeli—yani, vtable22 Temmuz 2010 tarihinde Wayback Machine sitesinde arşivlendi. programcı tarafından oluşturulmalı—yığın bellekten yer ayrımı işi yapıcı içinde yapılmalı ve nesnemiz ne kadar basit bir yapıya sahip olursa olsun yıkıcı görevini görecek bir fonksiyon yazılmalıdır.
- KesirliSayi.c
#include <stdlib.h> #include "matematik/IKesirliSayi.h" #include "sistem/IComparable.h" struct _IKESIRLISAYI { KesirliSayi_Arayuzu _ksa; Comparable_Arayuzu _ca; long _pay, _payda; }; IKesirliSayi KesirliSayi_bol(IKesirliSayi ileti_alici, IKesirliSayi diger_sayi) { ... } /* Diğer fonksiyon gerçekleştirimleri */ KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) { static KesirliSayi_Arayuzu gosterici = NULL; if (!gosterici) { gosterici = (KesirliSayi_Arayuzu) malloc(sizeof(struct _ARAYUZ_KESIRLISAYI)); gosterici->bol = KesirliSayi_bol; /* Diğer fonksiyon göstericilerinin ilklenmesi */ } /* if (!gosterici) */ return gosterici; } /* KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) sonu */ Comparable_Arayuzu KesirliSayi_ca_gosterici(void) { static Comparable_Arayuzu gosterici = NULL; if (!gosterici) { gosterici = (Comparable_Arayuzu) malloc(sizeof(struct _ARAYUZ_COMPARABLE)); gosterici->compareTo = KesirliSayi_karsilastir; } * if (!gosterici) */ return gosterici; } /* KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) sonu */ IKesirliSayi KesirliSayi_yarat(long pay, long payda) { IKesirliSayi nesne = (IKesirliSayi) malloc(sizeof(struct _IKESIRLISAYI)); nesne->_ksa = KesirliSayi_ksa_gosterici(); nesne->_ca = KesirliSayi_ca_gosterici(); nesne->_pay = pay; nesne->_payda = payda; return nesne; } /* yapici(long, long) sonu */ void KesirliSayi_yik(IKesirliSayi* nesne) { if (*nesne == NULL) return; free(*nesne); *nesne = NULL; } /* yikici sonu */ ...
Notlar
- ^ Aslında, bu ifade tamamen doğru değil. Sıralanmak istenen değerleri ikil içeriklerine göre gruplayarak işini gören bazı algoritmalar kastettiğimiz anlamda karşılaştırma yapmazlar. Ancak, bu algoritmalarda dahi, ikillerin içeriğine göre gruplama yapılırken 1'in 0'dan büyük olduğu varsayılarak gizli de olsa karşılaştırma yapılmaktadır.
- ^ Bunun örneğini Java platformunda sağlanan
Comparable
arayüzünde görüyoruz.String
,java.math.BigInteger
gibi sınıflar bu arayüzü gerçekleştirirkenThread
sınıfı gerçekleştirmemektedir. - ^ Standartların kamuya açık olma özelliğini düşündüğünüzde bunun çok doğal bir varsayım olduğunu görürsünüz.
- ^ Türkçe içerikli Java kaynak kodu ile sıkıntı yaşıyorsanız, bu yazı 28 Temmuz 2011 tarihinde Wayback Machine sitesinde . size yardımcı olacaktır.
- ^ Java platformunda tanımlanmış bazı özel arayüzler için bu kuralın gevşetildiği ifade edilmeli. Bir örnek vermek gerekirse; iki iletiye sahip
java.util.Comparator
arayüzündekiequals
'ın gerçekleştirilmemesi derleyici tarafından anlayışla karşılanacak ve bu iletinin gerçekleştirimininObject
sınıfındaki ile aynı olduğu varsayılacaktır.
Ayrıca bakınız
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Nesne yonelimli programlama dillerinde arayuz degisik siniflardan nesnelerin kategorize edilmesini saglayan bir cesitidir Tanimlanmakta olan kategorinin birbirleriyle alakasiz siniflari ortak bir cati altinda toplamasi nedeniyle arayuz tanimlari soyut siniflarin aksine listeledikleri iletilerin gerceklestirim ayrintisi olan herhangi bir bilgi iceremezler Dolayisiyla bir arayuz tanimi iletilere karsilik gelen bir altyordam govdesi veya altalan tanimi iceremez Bir baska acidan bakarsak arayuz taniminda yer alan programlama ogelerinin zaman icinde degisme olasiligi dusuk ogeler olmasi gerekir Buna gore arayuz tanimlari gerceklestirimci ile kullanicinin paylastigi ve sabit olma ozelligi bulunan altyordam imzalari ile simgesel sabit tanimlarini barindirabilir Kullanilan programlama dili tarafindan dogrudan desteklenmedigi durumlarda arayuz kavrami altyordam govdeleri icermeyen ve altalan barindirmayan bir soyut sinif tanimi ile benzetilebilir Soyut sinif kavraminin dogrudan desteklenmedigi yordamsal dillerde ise arayuzde bulunmasi beklenen programlama ogelerinin baslik dosyasi benzeri bir dosyada toplanmasi saglanarak arayuz kavramina oykunulebilinir Ancak derleyici desteginin bulunmamasi nedeniyle her iki kullanimin da hataya acik oldugu unutulmamalidir Nesneleri Kategorize Etmekte ArayuzSinif kavrami ve iliskisinin siniflari siraduzenine koyarak bir terminoloji olusturmasina benzer bir sekilde arayuz kavrami ve gerceklestirme iliskisi de siniflari kategorilere ayirir Herhangi bir arayuzu gerceklestiren siniflar arayuzun tanimladigi kategoriye ait sayilir ve bu siniflarin nesneleri gerceklestirilen arayuzun tutacagi ile kullanildiklarinda ayni kategoride bulunduklari icin cokbicimli bir sekilde kullanilabilirler Ne kastedildigi siklikla kullanilan bir islemle daha iyi anlasilacaktir siralama Bir grup verinin belirli bir oncelik sonralik iliskisine uygun olarak yeniden duzenlenmesi seklinde tanimlanabilecek siralama islemi soz konusu verilerin karsilastirilabilir olmasini gerektirir Zira hangi verinin once hangi verinin sonra gelecegi ancak karsilastirma ile anlasilabilir Siralanmak istenebilecek verilerin cesitliligi dusunuldugunde karsilastirma isleminin ustsinifta yapilacak dinamik iletimli bir atyordam taniminin altsiniflarda ezilmesi ile gerceklestirilemeyecegi gorulur Cunku boylesine bir cozum ustsinif ve altsiniflar arasinda bir benzerlik iliskisini gerektirir Halbuki birbiriyle alakasiz pek cok kavram karsilastirma islemini desteklemek durumunda kalabilir Karsilastirma isleminin sinif siraduzeninin kok sinifina tasinmasi da bir care olmayacaktir boylesine bir uygulama matemetikteki matrisler gibi karsilastirilamaz degerlerin de karsilastirilabilir oldugu algisina neden olacaktir Gercek cozum karsilastirilabilirlik kategorisine karsilik gelen bir arayuzun tanimlanmasi ve isteyen siniflarin bu arayuzu gerceklestirmesinden gecer Yazilim Bilesenleri Gelistirmede ArayuzYazilim gelistirmede arayuz kavraminin temel kullanim amaci standart olusturmaktir Birbirini tamamlayan bilesenlerin bagimsiz bir bicimde gelistirilmesine olanak tanimak ve ayni islevi goren bilesenlerin tak cikar mantigiyla birbirinin yerine kullanilmasini kolaylastirmak icin boylesine bir yaklasim zorunludur Bu sayede pazardan alinacak hazir bilesenler ve bilesenlerin paralel gelistirilmesinin yardimiyla daha guvenilir urunlerin daha hizli gelistirilmesi mumkun olacaktir Bu asagidaki zaman siralamasina gore verilmis etkinliklerden daha iyi anlasilacaktir Bir sirketler konsorsiyumu B1 bilesenine iliskin arayuzleri tanimlar S1 sirketi tanimli standarda uygun bir B1 bileseni gelistirir S2 sirketi B1 B2 ve B3 bilesenlerinin kullanildigi U1 urununu gelistirir B1 bileseni S1 sirketinden alinir Arayuzleri tanimlanan B2 ve B3 bilesenleri bagimsiz iki proje grubu tarafindan S2 sirketi bunyesinde gelistirilir B1 B2 ve B3 bilesenleri birlestirilerek U1 olusturulur S2 sirketi U1 urununu piyasaya surer S3 sirketi tanimli standarda uygun bir B1 bileseni gelistirir S2 sirketi bir sonraki surumun performansini gelistirmek adina B2 ve B3 bilesenlerini elden gecirir Musterilerden U1 e iliskin performans sikayetleri gelir S1 sirketi B1 bilesenini S3 ten aldigi gerceklestirim ile degistirir Ayrica B2 ve B3 un yeni uyarlamalari U1 e tumlestirilir Musteriler daha yuksek performansli yeni urunu kendi yazilimlarinda hicbir degisiklik yapmadan kullanir Dikkat edilecek olursa U1 in piyasaya surulmesinden sonra S3 tarafindan gelistirilen B1 bileseni sorun olmaksizin kullanilabilmektedir Ayni sekilde U1 in performansi gelistirilmis uyarlamasi da musterinin daha onceden gelistirdigi yazilimin icinden rahatlikla kullanilmaktadir Gelecege yapilan bu yolculuklarin her iksi de arayuz tanimlari sayesinde mumkun olmaktadir Bunu tadilat geciren bir evin bolum bolum degistirilmesine benzetebiliriz dogramalarin degistirilmesi icin evin yikilip yeniden yapilmasi gerekmez ayni standarda uygun uretilen dogramanin eskisinin yerine takilmasi yeterli olacaktir Arayuz Gerceklestirme Yoluyla CokbicimlilikArayuz tutacagi yoluyla cokbicimlilik Siniflarin ortak paydasi olarak tanimlanmasi arayuzlerdeki iletilerin cokbicimli olarak kullanilabilmesini olanakli kilar arayuz tutacagi yoluyla gonderilecek iletiler tutacagin temsil ettigi nesnenin sinifindaki iliskin gerceklestirimin kullanilmasina neden olacaktir Yandaki sekilden izleyecek olursak nesneye gonderilecek iletiler oncelikle arayuz tutacaginin eleginden gecer Arayuz turunde listelenmeyen iletiler derleyici tarafindan reddedilecektir Derleyici denetiminden gecen programin calistirilmasi sirasinda ise denetim akisinin ileti gonderiminin yapildigi yere gelmesi arayuz tutacaginin gosterdigi nesnenin sinifindaki gerceklestirilmis veya kalitlanmis ayni imzaya sahip altyordamin cagrilmasina neden olur Arayuz tutacaginin gosterdigi nesnenin turunun tutacak turunu dogrudan veya dolayli bir bicimde gerceklestiren bir sinif olmasi zorunludur Arayuz gerceklestirme ve arayuz tutacaginin bu sekilde kullanilmasi sinif kalitlama ve ustsinif tutacaginin kullanilmasi ile gelen cokbicimliligin getirdigi avantajlari getirir Arayuzdeki iletileri kullanarak yazilmis kod arayuzu gerceklestiren tum siniflar icin calisacak ve boylece ayni iskelete sahip kod parcalarinin degisik siniflar icin tekrar tekrar yazilmasinin onune gecilmis olacaktir Bu ise kodda yapilmasi istenen bir degisikligin tek bir yerde yapilmasi anlamina gelir ki kodun yeniden kullanimini saglayan boylesine bir yaklasim kod bakimini da kolaylastiracaktir Programlama Dilleri ve Arayuz KavramiKimi programlama dilleri arayuz kavramini dildeki bir yapi ile dogrudan desteklerken digerleri var olan yapilarin disiplinli bir bicimde kullanilmasi yoluyla dolayli olarak destekler Takip eden alt bolumlerde her iki gruba dair ornekler verilmektedir Dikkat edilecek olursa ne sekilde desteklenirse desteklensin arayuz taniminda herhangi bir gerceklestirim ayrintisinin ele verilmedigi kullanici ile paylasilan programlama ogelerinin altyordam imzalari ve simgesel sabitler degismesi dusuk olasilikli ogeler oldugu gorulecektir Bu kisitlamanin temelinde arayuzun kullanici kodu ile gerceklestirimci arasinda bir sozlesme olmasi ozelligi ve gerceklestirimcinin yapacagi degisikliklerin kullanici kodunda degisikliklere yol acma ihtimalini en aza indirmek istegi yatar Java Arayuz kavramini b interface b yapisi ile dogrudan destekleyen Java da programcinin yapacagi olasi bir hata kavramdan haberdar derleyici sayesinde onlenir Programlama dili standardindaki tanimlara uygun gerceklestirilmis derleyiciler metot govdesi ve altalan tanimi gibi gerceklestirim ayrintisi olarak addedilen programlama ogelerinin arayuze konulmasina izin vermez Ayrica standart gorevi gorme ve kullanici kodu ile gerceklestirimci arasinda sozlesme tanimlama ozelliklerinin bir sonucu olarak arayuz taniminda yer alan tum ogelerin b public b erisime sahip oldugu kabul edilir Dolayisiyla erisim niteleyicilerinin konulmasina gerek yoktur IKesirliSayi javapackage matematik import matematik ayriksidurumlar SifirBolen public interface IKesirliSayi public IKesirliSayi bol IKesirliSayi throws SifirBolen IKesirliSayi carp IKesirliSayi public IKesirliSayi cikar IKesirliSayi public IKesirliSayi topla IKesirliSayi public double deger public long pay public long payda IKesirliSayi arayuzunun sonu Arayuz taniminin derlenip sinif yolu uzerinde uygun bir yere konulmasi sonrasinda yapilmasi gereken soz konusu kategoriye giren kavramlarin karsiligi olan siniflarda bu arayuzun belki de diger arayuzlerle birlikte gerceklestirilmesidir Bu noktada arayuz ler ve sinif arasindaki gerceklestirme iliskisinin bir taahhut oldugu ve arayuz ler de listelenen tum iletilerin gerceklestirilmesi gerektigi unutulmamalidir KesirliSayi javapackage matematik import matematik IKesirliSayi import matematik ayriksidurumlar SifirBolen public class KesirliSayi implements IKesirliSayi Comparable lt IKesirliSayi gt public IKesirliSayi bol IKesirliSayi throws SifirBolen public IKesirliSayi carp IKesirliSayi public IKesirliSayi cikar IKesirliSayi public IKesirliSayi topla IKesirliSayi public double deger public long pay public long payda public int compareTo IKesirliSayi digerSayi private IKesirliSayi sadelestir KesirliSayi sinifinin sonu IKesirliSayi ve Comparable arayuzlerinin gerceklestirimine ornek olarak yukarida sunulan iskeletin ici degisik sekillerde doldurulabilir Ancak ayrintida farklilik gosteren tum siniflarin ortak bir ozelligi olacaktir gerceklestirdikleri IKesirliSayi ve Comparable arayuzleri Bu ise soz konusu siniflarin nesnelerinin yukarida28 Eylul 2015 tarihinde Wayback Machine sitesinde arsivlendi da anlatildigi gibi IKesirliSayi veya Comparable arayuzu turundeki tutacaklar vasitasiyla cokbicimli bir sekilde kullanilabilecegi anlamina gelir Java da arayuzler hakkinda daha ayrintili bilgi icin buraya19 Ocak 2012 tarihinde Wayback Machine sitesinde bakiniz C Arayuz kavramini dogrudan desteklemeyen C programlama dilinde programcilarin belirli kurallara uyulan sinif tanimlariyla bu eksigi gidermeleri mumkundur Oncelikle altyordam govdelerinin saglanmamasi kosulu tum fonksiyon tanimlarinin dinamik iletimli bos fonksiyonlar Ing pure virtual2 Ekim 2011 tarihinde Wayback Machine sitesinde arsivlendi olarak yapilmasi gerektigi anlamini tasir Bu kosula uyulmamasi yapilmakta olan tanimi soyut somut sinif tanimina donusturur Bir diger onemli nokta ise arayuzdeki tum ogelerin kamuya acik ilan edilmesinin sonucudur sinif taniminin hemen basina public konulmasi bir aliskanlik haline getirilmeli ve gerceklestirim ayrintisi olmanin habercisi diger erisim niteleyicilerinden kacinilmalidir Ayrica kullanici ile paylasilacak olan arayuz taniminin C kaynak dosyasi yerine baslik dosyasina konulmasi da iyi bir aliskanlik olacaktir IKesirliSayi hxx ifndef IKESIRLISAYI HXX define IKESIRLISAYI HXX include matematik ayriksidurumlar SifirBolen hxx using namespace matematik ayriksidurumlar namespace matematik class IKesirliSayi public IKesirliSayi bol IKesirliSayi throw SifirBolen 0 IKesirliSayi carp IKesirliSayi 0 IKesirliSayi cikar IKesirliSayi 0 IKesirliSayi topla IKesirliSayi 0 long bolen void 0 long bolunen void 0 double deger void 0 IIKesirliSayi arayuzunun sonu matematik aduzayinin sonu endif IComparable hxx ifndef ICOMPARABLE HXX define ICOMPARABLE HXX namespace sistem template lt class V gt class IComparable public int compareTo V 0 IComparable arayuzunun sonu sistem aduzayinin sonu endif Tanimlarin tamamlanmasi ve iliskin baslik dosyalarinin kutuk dizgesinde uygun yerlere konulmasi sonrasinda sira arayuzlerin gerceklestirimine gelir Arayuz kavramini desteklemeyen C dogal olarak gerceklestirme iliskisinden de haberdar degildir Dolayisiyla gerceklestirme iliskisi yerine kalitlama iliskisini koymamiz gerekecektir KesirliSayi cxx include sistem IComparable hxx using namespace sistem include matematik IKesirliSayi hxx include matematik ayriksidurumlar SifirBolen hxx using namespace matematik ayriksidurumlar namespace matematik class KesirliSayi public IKesirliSayi public IComparable lt IKesirliSayi gt public IKesirliSayi bol IKesirliSayi throw SifirBolen IKesirliSayi carp IKesirliSayi IKesirliSayi cikar IKesirliSayi IKesirliSayi topla IKesirliSayi long bolen void long bolunen void double deger void int compareTo IKesirliSayi digerSayi KesirliSayi sinifinin sonu matematik aduzayinin sonu Arayuz ve bu arayuzu gerceklestiren sinifin kullanimina gelindiginde bir noktanin unutulmamasi yararli olacaktir Dinamik iletimli fonksiyonlarin cokbicimli kullanilabilmesi icin nesnelerin referans veya gosterici araciligiyla kullanilmasi gerekir Aksi takdirde tum cagrilar calisma oncesinde baglanacak ve kodun cokbicimli kullanilmasi soz konusu olmayacaktir C Yordamsal bir dil olan C nesne paradigmasinin gerektirdigi en temel kavramlari dahi desteklemez Dolayisiyla sinif arayuz gibi dil duzeyi kavramlarin isletim dizgesi kavrami olan dosyadan yararlanarak gerceklestirilmesi zorunludur Genel strateji C da uygulanan ile aynidir baslik dosyasinda tanimlanan arayuzun C dosyasinda gerceklestirilmesi Arayuz taniminda gerceklestirim ayrintisi ele vermemek adina dinamik iletimli cagrilacak fonksiyonlarin adreslerini tutan yapinin disinda tanim verilmemeli statik iletimli cagrilacak fonksiyonlarin b extern b ile nitelenerek verilen deklarasyonu ile yetinilmelidir Ayrica fonksiyonlarin isleyecegi ortak bir bellek bolgesi soz konusu ise bunun taniminin da deklarasyon ile gecistirilmesi ve asil tanimin C dosyasina birakilmasi gereklidir Son olarak nesne paradigmasinda alici nesneyi temsilen tum iletilere gecirilen sakli arguman b this b veya b self b derleyicinin nesne kavramindan haberdar olmadigi dusunulerek tum fonksiyonlara ayrica gecirilmelidir IKesirliSayi h ifndef IKESIRLISAYI H define IKESIRLISAYI H struct IKESIRLISAYI typedef struct IKESIRLISAYI IKesirliSayi typedef IKesirliSayi BOL IKesirliSayi ileti alici IKesirliSayi digerSayi throws SifirBolen typedef IKesirliSayi CARP IKesirliSayi ileti alici IKesirliSayi digerSayi typedef IKesirliSayi CIKAR IKesirliSayi ileti alici IKesirliSayi digerSayi typedef IKesirliSayi TOPLA IKesirliSayi ileti alici IKesirliSayi digerSayi typedef long PAY IKesirliSayi ileti alici typedef long PAYDA IKesirliSayi ileti alici typedef double DEGER IKesirliSayi ileti alici typedef struct ARAYUZ KESIRLISAYI BOL bol CARP carp CIKAR cikar TOPLA topla DEGER deger PAY pay PAYDA payda KesirliSayi Arayuzu endif IComparable h ifndef ICOMPARABLE H define ICOMPARABLE H typedef void Object typedef int COMPARETO Object Object typedef struct ARAYUZ ICOMPARABLE COMPARETO compareTo Comparable Arayuzu endif Gerceklestirim kismina geldigimizde nesne yonelimli dillerde derleyiciler tarafindan yapilan bazi seyleri programcinin yapmasi gerektigi unutulmamalidir Ornegin nesnenin ozelliklerine gore saglanan fonksiyon gerceklestirimleri ile fonksiyon gostericileri ilklenmeli yani vtable22 Temmuz 2010 tarihinde Wayback Machine sitesinde arsivlendi programci tarafindan olusturulmali yigin bellekten yer ayrimi isi yapici icinde yapilmali ve nesnemiz ne kadar basit bir yapiya sahip olursa olsun yikici gorevini gorecek bir fonksiyon yazilmalidir KesirliSayi c include lt stdlib h gt include matematik IKesirliSayi h include sistem IComparable h struct IKESIRLISAYI KesirliSayi Arayuzu ksa Comparable Arayuzu ca long pay payda IKesirliSayi KesirliSayi bol IKesirliSayi ileti alici IKesirliSayi diger sayi Diger fonksiyon gerceklestirimleri KesirliSayi Arayuzu KesirliSayi ksa gosterici void static KesirliSayi Arayuzu gosterici NULL if gosterici gosterici KesirliSayi Arayuzu malloc sizeof struct ARAYUZ KESIRLISAYI gosterici gt bol KesirliSayi bol Diger fonksiyon gostericilerinin ilklenmesi if gosterici return gosterici KesirliSayi Arayuzu KesirliSayi ksa gosterici void sonu Comparable Arayuzu KesirliSayi ca gosterici void static Comparable Arayuzu gosterici NULL if gosterici gosterici Comparable Arayuzu malloc sizeof struct ARAYUZ COMPARABLE gosterici gt compareTo KesirliSayi karsilastir if gosterici return gosterici KesirliSayi Arayuzu KesirliSayi ksa gosterici void sonu IKesirliSayi KesirliSayi yarat long pay long payda IKesirliSayi nesne IKesirliSayi malloc sizeof struct IKESIRLISAYI nesne gt ksa KesirliSayi ksa gosterici nesne gt ca KesirliSayi ca gosterici nesne gt pay pay nesne gt payda payda return nesne yapici long long sonu void KesirliSayi yik IKesirliSayi nesne if nesne NULL return free nesne nesne NULL yikici sonu Notlar Aslinda bu ifade tamamen dogru degil Siralanmak istenen degerleri ikil iceriklerine gore gruplayarak isini goren bazi algoritmalar kastettigimiz anlamda karsilastirma yapmazlar Ancak bu algoritmalarda dahi ikillerin icerigine gore gruplama yapilirken 1 in 0 dan buyuk oldugu varsayilarak gizli de olsa karsilastirma yapilmaktadir Bunun ornegini Java platformunda saglanan Comparable arayuzunde goruyoruz String java math BigInteger gibi siniflar bu arayuzu gerceklestirirken Thread sinifi gerceklestirmemektedir Standartlarin kamuya acik olma ozelligini dusundugunuzde bunun cok dogal bir varsayim oldugunu gorursunuz Turkce icerikli Java kaynak kodu ile sikinti yasiyorsaniz bu yazi 28 Temmuz 2011 tarihinde Wayback Machine sitesinde size yardimci olacaktir Java platformunda tanimlanmis bazi ozel arayuzler icin bu kuralin gevsetildigi ifade edilmeli Bir ornek vermek gerekirse iki iletiye sahip java util Comparator arayuzundeki equals in gerceklestirilmemesi derleyici tarafindan anlayisla karsilanacak ve bu iletinin gerceklestiriminin Object sinifindaki ile ayni oldugu varsayilacaktir Ayrica bakinizGerceklestirme iliskisi Soyut siniflar Cesniler