Neden bu şekilde kod yazarız

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2126
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Neden bu şekilde kod yazarız

Mesaj gönderen sadettinpolat » 02 Şub 2016 01:50

kimimben yazdı:
Neden bu şekilde kod yazarlar ki ? Saçma değil mi ?
Avantajı,dezavantajı var mı ?

Bunun en sade cevabi meshur tasarim kaliplari arasinda yer alan abstract factory kalibidir.

eski blogumda bu tasarim kaliplarina yonelik delphi ile ilgili birkac yazi yazmistim. yedegini de almamisim :(
archive.org da varmis allahtan :)

https://web.archive.org/web/20060706125 ... com/?p=107 Abstract Factory
https://web.archive.org/web/20060709233 ... .com/?p=60 Factory Method
https://web.archive.org/web/20060630173 ... com/?p=109 Command Pattern

bi kac tane daha vardi ama bulamadim onlari :(

Diger tasarim kaliplari da incelendiginde gorulecegi uzere poliformizm , statik/dinamik metodlar bu isin temelini olusturmaktadir.

http://www.tugrulhelvaci.com/?p=631 burda da statik ve dinamik metodlarla ilgili guzel bir beyin jimnastigi mevcut :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Neden bu şekilde kod yazarız

Mesaj gönderen kimimben » 04 Şub 2016 02:48

thelvaci yazdı:Derleyicinin bizim için oluşturduğu method pointer'larından başka bir şey değil aslında.
Tuğrul Bey bu cümle ile OOP programlama özelliklerinin,yazılımcı ile "pointer yönetimi" kavramı arasında bir wrapper olduğunu anlıyor ve wrapper kavramının da daha çok ustalık gerektiren,yada zor olan mevzuları basitleştirme yaparak sunma gibi bir kavram olduğunu anlıyorum.
Buraya kadar ki düşündüklerimiz "tekerleğin nasıl döndüğünü" anlamakla ilgili idi sanırım.
sadettinpolat yazdı: Bunun en sade cevabi meshur tasarim kaliplari arasinda yer alan abstract factory kalibidir.
Şimdi dönen tekerleği nasıl ve ne amaçla kullanabiliriz.Onu anlamaya çalışalım.

Tasarım şablonları Cyclomatic Complexity' si daha az kodlar geliştirmemizi sağlıyor sanki.Bu da kod üzerinde daha rahat ve kendimizden emin değişiklikler yapabilmemizi,kolayca test edebilmemizi sağlıyor sanırım.

Aynı işlemi yapan kodu,tasarım şablonlarını kullanmadan da yazabiliriz.Ama bahsettiğimiz gibi bir kod seperate işlemi olmadığı için,karmaşıklık daha fazla olacak ve düzenlenmesi ve test etmesi daha zor olacaktır.

Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Neden bu şekilde kod yazarız

Mesaj gönderen RADCoder » 04 Şub 2016 11:43

Konuyu açan arkadaş, sağol var ol, Allah hepinizden razı olsun..
Tuğrul hocam değerli bilgilerinizden dolayı çok ama çok teşekkür ederim size..

thelvaci
Kıdemli Üye
Mesajlar: 769
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul
İletişim:

Re: Neden bu şekilde kod yazarız

Mesaj gönderen thelvaci » 05 Şub 2016 09:58

Pekçoğumuzun bildiği konular; sadece yazma fırsatını ben bulabildim sanırım.

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Neden bu şekilde kod yazarız

Mesaj gönderen kimimben » 05 Şub 2016 11:40

Tuğrul bey Virtual method table hakkında şöyle bir ibare var.
There are a variety of different ways to implement such dynamic dispatch, but the vtable (virtual table) solution is especially common among C++ and related languages (such as D and C#). Languages which separate the programmatic interface of objects from the implementation, like Visual Basic and Delphi, also tend to use the vtable approach, because it allows objects to use a different implementation simply by using a different set of method pointers.
VMT mantığı C++ ile ilişkili diller(D,C#) arasında kullanımı yaygınmış.
Belki java teknolojileride aynı çözümü kullanıyor olabilir mi ?
Java uygulamalarıda JVM üzerinde çalıştığı için,JVM de yanlış hatırlamıyorsam C dili ile yazılmıştı sanırım.

thelvaci
Kıdemli Üye
Mesajlar: 769
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul
İletişim:

Re: Neden bu şekilde kod yazarız

Mesaj gönderen thelvaci » 05 Şub 2016 06:48

Tabii diğer dillerin iç yapılarını bilmediğim için ne desem afaki olabilir; ancak bir dil OOP desteği sunuyor ise bir şekilde VMT desteği de olmalıdır. Aksi taktirde ne inheritance'ı ne de polymorphism'i gerçekleyemezdi. Daha önce paylaştığım linki sakin kafa ile ve ciddi bir şekilde baştan aşağıya okumanızı kuvvetle öneririm. ;)

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Neden bu şekilde kod yazarız

Mesaj gönderen kimimben » 06 Şub 2016 09:55

Önerilerinizi dikkate alacağım Tuğrul Bey.

Kullanıcı avatarı
kimimben
Üye
Mesajlar: 129
Kayıt: 28 Oca 2016 04:41
Konum: İstanbul

Re: Neden bu şekilde kod yazarız

Mesaj gönderen kimimben » 20 Şub 2016 11:35

Compiler pointer yönetim işini bizim yerimize yapıyorsa;
System.Rtti.pas 1075 nolu satırda ki TRawVirtualClass sınıfı ne amaçla yazılmış olabilir acaba diye düşünürken...

He ne kadar sınıfın tepesinde ki açıklama notunu okusam da tam olarak idrak edemedim.

Kod: Tümünü seç

  ///  Provides a basis for dynamically creating instances that implement
  ///  interfaces.  The support here is extremely raw.  You create an instance
  ///  of a virtual class by handing it a vtable.  The vtable is a specialized
  ///  type defined here.  The vtable will be populated with slots that point
  ///  to small thunks that dispatch to user code.<p></p>
  ///
  ///  The basic usage model is to construct a virtual class with a vtable,
  ///  and a list of GUIDs of interfaces that the vtable matches.  Thus if
  ///  you have an interface declared to inherit a line of several parents,
  ///  the single vtable will represent each of the parent interfaces.<p></p>
  ///
  ///  The <code>TRawVirtualClass</code> implements <code>QueryInterface</code>,
  ///  <code>AddRef</code> and <code>Release</code> for the interface, so
  ///  that you can query an instance and get back a Delphi interface that can
  ///  be used as if it were any Delphi interface.<p></p>
  ///
  ///  Future improvements: support adding vtables to an existing instance.
Ama sanırım şuan yazarken jeton düştü sanırım :D
Provides a basis for dynamically creating instances that implement interfaces.
Normalde bir interface'i implement sınıfı oluştururken şöyle bir yöntem izliyoruz.

Kod: Tümünü seç

ITest = interface(IInterface)
   procedure Invoke();
end;

TTestImp1 = class(TInterfacedObject,ITest)
  procedure Invoke();
end;

TTestImp2 = class(TInterfacedObject,ITest)
  procedure Invoke();
end;

{ TTestImp1 }
procedure TTestImp1.Invoke;
begin
  ShowMessage('Test 1');
end;

{ TTestImp2 }
procedure TTestImp2.Invoke;
begin
  ShowMessage('Test 2');
end;
Kullanım :

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);
var
 ATest : ITest;
begin
 ATest := TTestImp1.Create;
 ATest.Invoke;

 ATest := TTestImp2.Create;
 ATest.Invoke;
end;
TRawVirtualClass sınıfının tepesinde ki açıklamada ki ilk cümle sanırım kilit nokta.
"Provides a basis for dynamically creating instances that implement interfaces."
Yani interface'i implement eden sınıfların oluşturulma(Create) işini biz üstlenmiyoruz.

Kod: Tümünü seç

uses  System.Rtti;

procedure TForm2.Button2Click(Sender: TObject);
var
 ATest : ITest;
 Adress : Pointer;

 Imp1 : TTestImp1;
 Imp2 : TTestImp2;
begin
 Adress := @ATest;

 Imp1 := TTestImp1(TRawVirtualClass.GetInstanceFromInterface(Adress));
 Imp1.Invoke;

 Imp2 := TTestImp2(TRawVirtualClass.GetInstanceFromInterface(Adress));
 Imp2.Invoke;
end;
Bu kod bloğunda TTestImp1.Create şeklinde bir constructor çağırımı yaptık mı ? yapmadık.
Yani bizim yerimize ITest interface'i implement eden TTestImp1 ve TTestImp2 sınıflarının instance'ları dinamik olarak oluşturuldu.
Nesne oluşturma kontrolü bizden çıkıyor bu durumda (inversion of control)

Tuğrul Bey bu konuda ki fikirlerinizi paylaşırsanız sevinirim.
Hem yanlış anlayıp idrak ettiğimiz birşey varsa düzeltme imkanı buluruz.

Cevapla