»
Y
A
N
M
E
N
Ü
«
Delphi’ye Oksijen lazım
ibrahim dursun @ 18 Eylül 2008 21:01

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ürmeyecekse
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.


9 Yorum  
sadettinpolat
27 Eylül 2008 00:24

Oxygene bunyesinde guzel ozellikler barindiran bir pascal clonu gercekten. bunu codegearde kabul etmis olacak ki delphi for net i Oxygene catisi altina tasimayi planliyor. vcl.net i ise sanirim gelistirmeyi birakacaklar.

yukarida belirtilen eksikler her ne kadar belirli bir noktaya kadar gelistiriciyi zorlasada bir sekilde yapilabilirligi mevcut oldugundan cok fazla problem teskil etmiyor (ya manuel cozulebiliyor ya da bazi ide expertler sayesinde bu ozellikler delphiye kazandirilabiliyor) lakin object pascal ve delphi idesinin yeni teknolojilere biraz uzak kalmasi bazi noktalarda insani gercekten bunalima sokuyor.

dipnot:delphi 2009′a exit yordaminin asiri yuklenmis bir surumu monte edilmis. bu yeni surum return islevini goruyor. http://blogs.codegear.com/nickhodges/2008/07/22/39079

ibrahim dursun
28 Eylül 2008 20:36

Merhaba sadettin,

Evet haklısın yukarıda saydıklarımın çoğu bir preprocessor ile dile kazandırabilecek şeyler ve benim değinmek istediğim de zaten buydu. Bunların dile eklenmesi zor değil ama 2009′a kadar beklenildi. Delphi 2009 bir nebze olsun iyileşecek gibi görünüyor.

Oxygene ile anlaştıklarını duymuştum gerçi detayını da çok fazla bilmiyorum ama her ne olsursa olsun ortaya daha güzel bir şey çıkacağı kesin.

Hakan MÜŞTAK
4 Kasım 2008 12:24

tekrar delphiyi pistlerde görmek mutluluk verici. Delphi sever bir dinazor (30) olarak bu işe memnun olduğumu belirtmek isterim.

ibrahim dursun
4 Kasım 2008 13:28

Bende heyecanla bekliyorum, Delphi 2009 oldukça güzel görünüyor. İnşallah böyle devam ederler.

Selçuk KÜTÜK’ün Günlüğü » Blog Arşivi » Yeni bir Oksijen: “Delphi PRISM”
15 Kasım 2008 11:23

[...] Bazi yeni dil ozelliklerini su adresten Turkce inceleyebilirsiniz: http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/#more-142 [...]

Mustafa
4 Şubat 2009 05:13

Arkadaslar C ve C++ sintaksina C# ve Java aynen kullaniyor. Pascalin sacma ve zorlu sintaksi ile ugrasmaya gerek yoktur diye düsünüyorum!

Tolga
24 Mart 2009 06:43

Ben bazı özelliklere katılmıyorum.

1) İlk olarak değişkenlerin vesairenin begin blogu icinde tanimlanmasi cok kotu bence. Bu, yarin yapacaginiz islerinizi farkli farkli kagitlara yazmaya benziyor. Evet belki her onunuze gelen kagida yazmak kolayiniza gelebilir fakat bunlarin bir duzen icerisinde tek kagitta durmasi size hem kolaylik saglayacak, hem kodunuzun daha duzgun olmasini saglayacaktir. (yeni teknolojiye geciliyor deniliyor belki ama delphi’nin o kod duzenini, kolay okunusunu degismem dogrusu)

2) Ben assembly ve pascal kokeninden geliyorum. Belki bu nedenledir, yazdigim kodun asagi yukari makine koduna nasil cevrilecegini bilmek hosuma gider. Yeni eklenen ozelliklerse, nasil cevrilecegi belli olmayan sekilde duruyor. Ozellikle yazilimlarin crack’lenmesi vs gibi durumlara karsi acik olmasina neden oldugunu dusunuyorum bu yeni kodlama yapilarinin.

Belki 2. maddeye katilmayabilirsiniz, cogu kisi arka plani dusunmeyebilir fakat 1. maddenin arkasindayim. Ayni zamanda bir grafik tasarimci da olaraktan, kodlarimin duzgun, toplu, okunakli olmasini cok onemsiyorum.

ibrahim dursun
24 Mart 2009 07:45

Merhaba @Tolga, değişkenlerin var bloğu içinde tanımlanmak zorunda olması ile ilgili görüşlerimi zaten yazıda belirtmişim, bana göre bu kısıtlama kod okunurluğunu düşürüyor.

Oxygene derleyicisi tarafından çevirilen kod Reflector ile incelenebilir. Ben incelediğimde çok garip şeylerle karşılaşmamıştım.

İyi çalışmalar.

mehmet ulukaya
21 Temmuz 2009 07:53

sevgili mustafa,

Arkadaslar C ve C++ sintaksina C# ve Java aynen kullaniyor. Pascalin sacma ve zorlu sintaksi ile ugrasmaya gerek yoktur diye düsünüyorum!

demişsin.

C derleyicilerinin editorlerini incelersen kod icerisinde ileri geri gitmek icin bile dugme koymuslar bu su demek c veya turevleri ile yazilanlar cok zor o k u n u y o r;

hep ornek olarak sunu verirler

void main()
{
  int c=999;
  printf("%s",c);
}

tamam bu kadar satirda okunurluk yeterli olabilir ama satirlarinin uzunlugu 10000′i gectiginde artik iskence haline gelmeye baslar.

Simdi bu yaziyi okuduktan sonra atiyorum bundan 2-3 yil once yazdigin kodu ac kenarlarina // yapmadiysan actigin konu anlayacagindan cok da emin degilim ben bundan 2-3 yil once yaptigim kenarlarinda da cok da aciklama yazisi olmayan bir pascal projesini cok rahat anliyorum.

biliyorum ki degiskenler VAR’dadir. Kod icinde degisken tanimlamak sadece GUNU KURTARMAK ICIN yapilan projelerde gecerlidir.

Hepsi mutlaka bu kodu asseblera ceviriyor onda kimsenin suphesi yok zaten bu dilleri kullanmamizin amaci assembler ile ugrasmamak yoksa herkes acsin debug komutunu girsin hex kodlarini save etsin calistirsin.

C ve turevlerinin en buyuk dezavantaji okunurlugunun kotu olmasidir.

x = ~x; yerine uzun uzun x := not x; yazmayi tercih ederim.

x=y=z=0; yerine :

x=0; 
y=0;
z=0;

yazmayi tercih ederim ki debug aninda c dili ile gelistiren kisi programi durdurup debug moda alirken

ben program calisirken break point ekleyip assembler’a cevirilmis haline kadar debug edebilirim….

Bir yorum bırakın

»  Substance: WordPress   »  Style: Ahren Ahimsa