Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
With İfadesi ve Bir Kaç Kullanım Örneği
#1
Delphi / Object Pascal'da With ifadesi sık kullanılmasa da yada pek tercih edilmese de, bazen de kaçınılmaz oluyor.
Neden, diye soracak olursanız...
Başvurulan her obje özelliğine ulaşmak için önüne karmaşık değişken adının eklenmesi ihtiyacını ortadan kaldırarak, kodu daha basitleştirir, sade ve daha okunaklı hale getirir. 
İç içe geçmiş karmaşık bileşen hiyerarşisindeki en uç özelliğe, tek bir ifade ile ulaşmanızı sağlar.

Aşağıda aktif kullanılan bir kaç uygulamadan aldığım örnek with ifadeleri yer almaktadır.
Not: 1 ve 2 ile işaretlenmiş resimler With ifadesi kullanılan ve With ifadesi olmadan kodun nasıl göründüğüne dair örneklerdir. 
Özellikle 3. örnek (1 ve 2 ile işaretli son resim) with'in amacını daha bariz gösteriyor. 

   

   

   

   

   


With hakkında daha detaylı bilgi için: With Statements
Begin : = end / 2;
Cevapla
#2
Merhaba,

With deyimini mümkün olduğunca kullanmayın! Çok hızlı problemleri yazayım, siz karar verin.

1. Debug etmek çok zahmetli
With kullandığınız zaman değişkenin üzerine geldiğinizde maalesef debugger onu anlamıyor. Sizin, kodu yazarken üşendiğiniz ve with kullandığınız kısmı yazmanız gerekiyor. Üstelik bunu hint ekranında değil, Ctrl+F7 ile açtığınız debugger kısmına yazmanız gerekiyor. Yani aslında 3 kere debugger'dan değere bakacak olursanız neredeyse aynı eforu sarf etmiş oluyorsunuz.

2. Nested With
Bu en korkuncu! İç içe with kullanıldığında zaten her şey çorbaya dönüyor. 

3. Çarpışan propertyler
Form.Caption ve Label.Caption var. İkisi de caption. İşte with ifadesini kullandığınız nesnenin Caption ifadesi Text olarak değişirse (Firemonkey geçişinde Label.Caption -> Label.Text oldu) sizin kodunuz derlenir ama hiç de istediğiniz gibi çalışmaz.

4. Çarpışan methodlar
Property'lerdeki durumun bir benzeri methodlar için de geçerli.

5. Pratikte sadece 2-3 karakterden kurtuluyoruz. With ve With olmayan koda örnek:
with MMBelge.Items[0].Mustahsil.AliciBilgileri do
begin
 KisiAdi := 'Mehmet';
 Tckn := '123123123';
end;

// Bunun yerine
var AB := MMBelge.Items[0].Mustahsil.AliciBilgileri;
AB.KisiAdi := 'Mehmet';
AB.Tckn := '123123123';

Üstelik ikincisinde kod tamamlayıcı daha düzgün ve hızlı çalışyor.

Aslında 5. madde with ifadesinin asıl amacına bir ipucu olabilir. With ifadesinin derleyici tarafında nasıl çalıştığını biliyorsanız, kimi durumlarda daha performanslı kod ürettiğini de tahmin edebilirsiniz. Elbette günümüz bilgisayarlarında ciddiye alınacak bir fark değil. 

Sonuç olarak gerçekten de faydadan çok zararı var. Daha fazla yorum okumak istiyorsanız StackOverFlow'daki ilgili konulara bakabilirsiniz.  

Son olarak with deyiminden bağımsız, aşağıdaki gibi de kod yazmamanızı tavsiye ederim (burada with yerine for/while/if vs ne isterseniz yazabilirsiniz):
with TXyzObject.Create do
 try
    DoSometing
 finally
   Free;
 end;

Buradaki dert de with deyiminden sonra begin/end yerine try/finally bloğuna güvenerek kod yazmak. Bence bunun yerine şöyle yazın:
with TXyzObject.Create do
begin 
  try
    DoSometing;
  finally
    Free;
 end;
end;

Niye boş yere begin/end yazıyorum diyebilirsiniz. Kendiniz için değil, sizden sonra gelen programcının anlık bir hatasını engellemek için yazıyorsunuz. Oraya müdahale edecek başka bir programcı, hele de formatting bozuksa, yüksek olasılıkla hataya düşüyor. 

İyi çalışmalar
Cevapla
#3
İç içe arap saçı pardon with  Tongue 
with vBİIdİrİmRefKunye.DataControIIer, DataSet do
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi