2 Haziran 2016 Perşembe

Polymorphism ve Pointer ilişkisi

OOP programlamanın özelliklerinden biri olan Polymorphism mekanizmasının nasıl çalıştığını incelemeye çalışacağız.
Polymorphism'in wiki sayfasında belirtildiği üzere farklı türleri mevcut.Bizim inceleyeceğimiz türü ise Subtyping Polymorphism.


Subtyping Polymorphism'in implementasyonunda ki
ilüzyon ise şu şekilde açıklanabilir;

Derleyici virtual method(yada diğer adıyla function) tanımlı bir sınıf gördüğünde, sınıfın içersine fonksiyonların pointer(adres) bilgilerini tutacağı gizli bir array, diğer adıyla virtual method table(VMT) yerleştirmekte ve daha sonra bu array içersinde ki pointerlara(adreslere),alt sınıfta ki fonksiyonların pointer bilgisini set etmektedir.
Fonksiyon pointer'larının çalışma zamanında set edilmesi veya değiştirilmesinin diğer adı run time method binding yada late binding olarak ifade edilmektedir.


Kod üzerinden mekanizmanın nasıl çalıştığını anlamaya çalışalım.
C++
Delphi

Yukarıda ki C++ kod bloğunda Calculation sınıfında Calc ismine sahip bir pure virtual function ve yine 
Calculation sınıfından miras alan CalculationSum ve CalculationDiv sınıflarını görmekteyiz.

Kodu çalıştırıp,debug edecek olursak; 
Calculation sınıfı içersinde ki Calc fonksiyonunun,CalculationSum(Sub Class) içinde ki Calc fonksiyonuna yönlendirildiği,diğer adıyla method binding işleminin gerçekleştiğini görebiliriz.


calculation ve CalculationSum içersinde vftable array'lerin, ilk elemanlarında ki Calc fonksiyonlarına ait adreslerin(
Sarı ile çizili) aynı olduğu görebiliriz.

Class,virtual function olmasaydı,yada method binding işlemini biz yapmak isteseydik basit olarak nasıl yapabilirdik ?

C++
Delphi

Son olarak bu konuyu araştırmamı salık veren Tuğrul Beye teşekkür etmeden geçmek olmaz.  :)


10 Mayıs 2016 Salı

Neden Pointer Tipini Kullanırız ?

Uygulama içersinde bir dosyanın son değiştirilme zaman bilgisine ihtiyacım olmuştu.

Sonrasında GetFileTime Windows API fonksiyonu sayesinde, aşağıda ki şekilde bir kodlama ile dosyanın son değiştirilme zaman bilgisini elde ettim.

Buraya kadar herşey normal.


Dikkatimi çeken ise nokta ise GetFileTime fonksiyonun LPFILETIME tipinde ki parametreleri idi.


LPFILETIME tipinin tanımını incelediğimde ise;
LPFILETIME isminin bir pointer tipi olduğunu görmekteydim.



Sonrasında GetFileTime fonksiyonunun lpCreationTime,lpLastAccessTime,lpLastWriteTime parametrelerinin, neden _FILETIME *lpCreationTime şeklinde değilde, LPFILETIME lpCreationTime tipinde tanımlanmış olabilir acaba diye düşündüm.


GetFileTime fonksiyonunun parametreleri yukarıda ki gibi tanımlanmış olsaydı, parametre olarak göndereceğimiz değişkenlerin pointer tipinde veya & işareti ile değişkenlerin adreslerinin gönderilmesi gerekecekti.

Yada GetFileTime fonksiyonunun şuan ki mevcut halini, aşağıda ki şekilde _FILETIME tipinde pointer değişken tanımlayıp çağırabilmemizin mümkün olduğunu görüyoruz.







Şimdi yukarıda ki incelemeler doğrultusunda;
"Neden pointer tipini kullanırız ?" sorusuna cevap verebiliriz.

Her defasında  pointer işareti(*) ile değişken tanımlayarak kendimizi tekrar etmek yerine,bir defaya mahsus olarak pointer tipini tanımlayıp(*LPFILETIME gibi),
kullanmanın daha pratik ve bakımı sağlanabilir bir tasarım sağlayacağını görmemiz mümkün.

Windows API fonksiyonlarını inceleyerek, nerdeyse çoğu parametresinin pointer tipinde tanımlanmış olarak görebilirsiniz.