Delphi Prism Delphi’den farklı olarak aşağıdaki özelliklere sahiptir. Aşağıdaki makale buaya tıklayarak göreceğiniz siteden alıntıdır.
Delphi’nin hızlı yazılım geliştirmeye getirdiği kolaylıklar anlatmakla bitmez. 90′ların sonu ve 2000′lerin başında; saniyeler içinde derleme, tüm uygulamanın tek exe olarak çıkarılabilmesi, veritabanından arayüze data bağlamadaki kolaylıkları ve arkasındaki çok büyük bir komünite ile zirvedeydi diyebiliriz.
Öncesinde Java, sonrasında .Net’in gelmesi ve Borland-Inprise-Borland-CodeGear-Embarcadero arasında sekmesi sürecinde oldukça kötü delphi sürümleri (Delphi 8, Delphi 2005, Delphi 2006) arkası arkasına geldi ve Delphi popüleritesini kaybetti. Son 2 yıldır Delphi ile yazılım geliştirmiyorum. Ben de soğudum fakat soğumamın nedini birbiri arkasında gelen hantal ve hatalı IDE’ler değildi. Yıllardır aynı yerde sayan Object Pascal’dı. Delphi, delphi olalı kullandığımız object pascal dili nerdeyse 90′lardaki ile aynıydı.
Pascal, okunabilirlik olarak iyi bir dildir fakat iş kodlamaya geldikçe dildeki bazı yapılar gerçekten sinir bozucu oluyor. Tabi rakipleri görmeden bu eksiklikleri tümüyle göremiyorsunuz. Bir kere görünce de görmemezlikten gelemiyorsunuz.
Object Pascal’ı ayrı köklerden geldikleri için C# veya Java ile karışlaştırmak doğru olmaz. Kendi klasmanında RemObjects Oxygene (eski adıyla Chrome) ile karşılaştırabiliriz.
Tüm değişkenleri var bloğunda tanımlamak
Delphi’de tüm değişkenler var bloğu içinde tanımlanmak zorundadır. Bu geçtim kod okunurluğunu kod yazımını düşürüyor. Her yeni değişken için yukarı çıkıp tanım yapmak aşağı gelip koda devam etmek gerekirki, bunu yapmazsanız code completiondan yararlanamazsınız.
Oysa oxygene’de buna gerek yok. Değişkeninizi kod içerisinde herhangi bir yerde tanımlayabilirsiniz. Type inference ise cabası…
Stringleri case içinde kullanamamak
Evet, case içinde string değerleri kullanamıyorsunuz.
case name of
'ahmet':;
'metin':;
else
end
Object Pascal’da yukarıdaki kodu derleyemezsiniz. Oxygene buna izin veriyor. Hatta yanlış hatırlamıyorsam bunu Delphi Language Extension adıyla bir projede de ele almışlardı.
Değer döndüren metotları “function”, döndürmeyenleri ise “procedure” anahtarı ile tanımlamak
En sinir olduklarımdan bir tanesi. Delphi’de eğer bir metod değer döndürecekse:
function yap ( a , b : integer ): integer ;
değer döndürmeyeceks
procedure yap ( a , b : integer ): integer ;
şeklinde tanımlamamamız gerekiyor. Bence çok gereksiz bir ayrım. Oxygene’deki gibi sadece method diyip geçebiliriz:
method yap ( a , b : integer ): integer ;
method yap ( a , b : integer );
Generic ya da template gibi bir yapının olmaması
Delphi’de herhangi bir collection oluşturmak istediğimizde ya TList, TCollection ya da TStringList sınıflarından türetmemiz gerekiyor. Eğer bunu yapmazsak pointer’lara ve typecastlere uğraşmak zorundayız. Templateler C++ da zaten vardı. C#’a 2.0′da Java’ya ise 1.5 sürümlerinde templatelerden biraz daha farklı olan genericler eklendi. Sene 2009, Delphi’ye yeni ekleniyor. Oxygene’de bu özellik 1.0 sürümünden beri bulunuyor.
Dictionary = public class
...
end ;
foreach yapısının yetersizliği
Delphi’ye foreach yapısı 2006 sürümünde eklendi. En azından her loop için bir değişken ile for döngüsü yazmaktan kurtulduk. Fakat bazen foreach ile bir koleksiyonda ilerlerken bir de index’e ihtiyacımız olabiliyor. Oxygene bunu çok güzel bir şekilde aşmış:
for each u in Users index i do begin
if i > 0 then Console.Write ( ';' );
Console.Write ( u.Name );
end ;
i değişkenini tanımlamama gerek yok, zaten index olduğu için integer olmak zorunda.
‘try/except/finally’ bloğunun olmayışı
Delphi’de try/finally ve try/except blokları mevcut ama bunları ayrı ayrı kullanabiliyoruz. try/except/finally olarak kullanamıyoruz. Bu Oxygene’de ise olması gerektiği gibi yapılmış.
return gibi bir keywordun olmayışı
Delphi’de bir fonksiyondan değer döndürmek için önce Result değişkenine atama yapar sonra da exit ile fonksiyondan çıkarız yani basit bir değer döndürme işlemini ancak iki adımda yapabiliriz. Oxygene’de ise bu işlemi tek adımda yapabiliyoruz:
method sum ( a , b : integer ): integer ;
begin
exit a + b ;
end ;
Şimdiye kadar saydıklarım Delphi’de olması gerekipte olmayanlar, bir de olsa güzel olacaklar var, bunları da karşılıklı örnekler vererek size sunuyorum:
gelişmiş if
Delphi:
if ( 0 <= a ) and ( a < 10 ) then
Oxygene:
if 0 <= a < 10 then
Delphi:
if not ( a in [ 1 .. 10 ]) then
Oxygene:
if a not in [ 1 .. 10 ] then
Oxygene’in en çok takdir ettiğim özelliklerinden birisi
node.Parent.Parent.Caption gibi bir değere ulaşmak istiyorsunuz fakat Parent değerleri null olabilir bu durumda Delphi’de (ve diğer dillerde) hepsini null kontrolünden geçirmek gerekir
result := null ;
if node <> null then
if node.parent <> null then
if node.parent.parent <> null then
result := node.parent.parent.caption ;
oysa Oxygene’de bunu tek satırda yazabilirsiniz:
result := node:parent:parent:caption ;
eğer node veya parentlardan birisi null ise tüm ifade null döndürecek, değilse caption değeri dönecek.
Oxygene’in daha sayamadığım bir çok güzel özelliği var hepsini RemObject sayfasından inceleyebilirsiniz. Eğer Delphi’ye oksijen verilirse geri dönmesi işten bile değil, merakla beklemekteyim.