Potansif Logo
potansif.com Kurumsal Çözümler
Mühendislik Arşivi Yayın Tarihi: 30 Eylül 2019 • Yazar: Uğur Parlayan

IF Nedir, Nasıl Kullanılır

#delphi #Programlama

Merhaba,

Bu yazımızda IF kullanımı ile ilgili bazı tekniklerden bahsedeceğim. Bununla birlikte bu yazının içeriği PERFORMANS ODAKLI OLMAYACAK. Performans ile ilgili eleştiriler haklı da olabilir, haksız da olabilir o konuda yorum yapmıyorum. Yazının amacı, IF kullanım tekniklerinin çeşitliliğini göstererek dil ile kurduğumuz etkileşimin, kodlamada ve okunabilirlikte elde edeceğimiz faydalarından ve kod ile kurduğumuz bağdan yararlanmaya çalışmak olacak. Yazının devamında gösterilecek olan tekniklerin dikkatli kullanılmaması durumunda spagetti koda dönüşebileceği tehlikesinden de bahsetmeden edemeyiz. Tüm bunlardan önce mebzuya dalmadan, bir karar verme yapısının nasıl bir iskeleti olduğuna değinmemiz gerekecek. Sonrasında da gerek PHP’de, gerekse Transact SQL’de sıkça karşılaşmaya başladığımız inline IF tekniğini Delphi’de nasıl kullanabiliriz ve bu tekniği bir adım öteye nasıl taşıyabiliriz onun örneklerine bakacağız.

Karar Verme Yapıları dendiğinde, kabaca programcının, program tarafından sırası geldiğinde değerlendirilecek veya test edilecek olan herhangi bir durumun sorguladığı, ortaya konulan koşulun / şartın doğru olup olmadığının tespit edilmesi (veya edilmemesi) durumunda devreye girmesi için tasarlanan mekanizmaların kastediğildiğini anlamamız gerekir. Bu mekanizmaları kullanarak yazdığımız programlara (tabiri caizse bir çeşit) akıl katmış oluruz. İnsanları hayvanlardan ayıran en temel özelliklerden birisinin de karar almak olduğunu varsayarsak ilginçtir ki insanlarla makinalar arasındaki en temel ayrımın da bu olduğuna dikkat çekmekte fayda var.

Pascal Programlama Dili, Karar Verme Yapısı olarak “IF” ve “CASE” anahtar kelimelerini kullanır. Fakat kendi yazacağınız fonksiyonlarla da bu yapıları genişletebilir, çeşitlendirebilirsiniz. Standart karar verme yapılarının kendi içinde çeşitli kombinasyonları vardır. Kısaca bu yapılara bir göz atalım;

IF için en bilinen yapı “IF - THEN” yapısıdır. Örnek olarak aşağıdaki kodu inceleyebiliriz;

var
  a: Integer;
  S: String;
begin
  if (a > 100) then ShowMessage('100''den büyük');
  // veya
  if (S.Trim <> '') then ShowMessage('S, boş değil');
end;

Alternatif olarak “IF - THEN - ELSE” yapısıda kullanılabilir. Aşağıdaki örneğe bir göz atalım;

IF - THEN - ELSE Karar Yapısı Akış Şeması

var
  a: Integer;
begin
  if (a > 100) THEN ShowMessage('100''den büyük') ELSE ShowMessage('100 veya daha altı');
end;

Ayrı bir alternatif olarak ardışık IF ELSE IF yapıları da kullanılabilir. Devamındaki örneği inceleyelim;

var
  a: Integer;
begin
  if (a  50) then ShowMessage('100 veya daha altı') ;
end;

Veya aynı örneği begin / end blokları içine de alabiliriz. Yukarıdaki örneğin daha okunaklı alternatif bir sürümünü aşağıdaki kodu inceleyerek görebiliriz; Bu örneği, yukarıdakinden ayıran temel nitelik ise ilgili koşula birden çok direktifte bulunabilmemize olanak sağlamasıdır.

var
  a: Integer;
begin
  if (a  50) then begin
      ShowMessage('100 veya daha altı') ;
      //... ilgili diğer kodlar
  end;
end;

Bir kaç koşulun tek bir koşul gibi değerlendirilmesi gereken durumlar da olabilir;

var
  a: Integer;
  s: String;
begin
  a:= 32;
  if (  (a > 1) AND (a  50) then ShowMessage('a, 50''ye eşit değildir...');
  // ile
  if NOT (a = 50) then ShowMessage('a, 50''ye eşit değildir...');
  // aynı şeyi ifade eder...

  // veya başka bir örnek daha verelim;
  if not false then ShowMessage('NOT FALSE = TRUE'); // gibi...
end;

Buraya kadar IF’in nasıl kullanıldığına bir göz attık. IF ifadesinin temel mekaniğini inceledik ve nelere dikkat etmemiz gerektiğini öğrendik. Değinecek, dokunacak başkaca ayrıntılar mutlaka vardır. Hatırladıkça bu makalenin devamına eklemeye devam edeceğim.

Yazının bundan sonraki kısmında ise tıpkı PHP ve T-SQL’deki gibi inline bir IIF fonksiyonunu Delphi’de nasıl tanımlanabileceğine ve bunu nasıl kullanabileceğimize bakacağız.

Özel bir IF fonksiyonu, Satıriçi IF kullanımı.

İki stringi bir koşula göre birleştirmek istediğimizde genelde aşağıdakine benzer bir yapı kullanırız;

function TeslimatMesaji(Ad: String; aCinsiyet: Boolean): String;
begin
  Result := 'Sayın ' + Ad + ' ';
  if aCinsiyet = TRUE then begin
      Result := Result + 'Bey,';
  end else begin
      Result := 'Hanım,';
  end;
  Result := Result + #13#10 + 'Talep ettiğiniz sipariş adresinize teslim edilmiştir.';
end;

Peki bu fonksiyonu şöyle yazsaydık daha anlaşılır ve sade olmaz mıydı?

function TeslimatMesaji(Ad: String; aCinsiyet: Boolean): String;
begin
  Result := 'Sayın ' + Ad + ' ' + IFF( aCinsiyet, 'Bey,', 'Hanım,') + #13#10 + 'Talep ettiğiniz sipariş adresinize teslim edilmiştir.' ;
end;

Her iki fonksiyon da temelde ve yöntemde aslında aynı şeyi yapıyor. Her ikisi de bir parametrenin değerini karşılaştırıyor, değerin doğru olup olmamasına göre belli bir içeriği sonuç kümesine işliyor. Burada, yazının performans odaklı olmadığından bahsetmiştik, yine bu konuya girmeyeceğiz. Bizim buradaki odak noktamız okunabilirik ve kod ile kurduğumuz anlam ilişkisinin basitliği ve anlaşılabilirliği olduğu için ben her zaman ikinci yöntemi tercih edenlerdenimdir.

Örnek kodumuzda önizlemesini yaptığımız IFF fonksiyonunun yapısını incelemeye başlayalım isterseniz. Bu bir fonksiyon olması sebebiyle doğal olarak veri tiplerine bağımlı bir yapıya sahip olacaktır, o nedenle aynı mekanizmayı kurabilmek için bazı temel veri tipleriyle harmanlayıp overload etmemiz gerekecek. Ben, burada en sık kullandığım veri tipleri ve nesnelerden oluşam bir kolaj hazırladım ve aşağıda kullanımınıza sunuyorum; Bu arada, INDY bileşen paketinde yer alan ve IDGLOBAL.PAS dosyasında iif adı altında benzer fakat sayıca az olan fonksiyonlar da bulunmaktadır.

interface

uses
  System;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: String)   : String;    overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Integer)  : Integer;   overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: TDateTime): TDateTime; overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Boolean)  : Boolean;   overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Currency) : Currency;  overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: TObject)  : TObject;   overload;
function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Variant)  : Variant;   overload;

implementation

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: String): String;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Integer): Integer;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: TDateTime): TDateTime; overload;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Boolean): Boolean; overload;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Currency): Currency; overload;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: TObject): TObject; overload;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

function IFF(aKosul: Boolean; aDogruysa, aYanlissa: Variant): Variant; overload;
begin
  if aKosul then Result := aDogruysa else Result := aYanlissa;
end;

Yukarıdaki tüm IIF fonksiyonlarının kullanımı tamamen aynıdır. Hepsi için örnek kullanımı Özel bir if fonksiyonu, Satıriçi IF kullanımı. bölümünün 2. örneğinde görebilirsiniz. Bununla birlikte IFF fonksiyonunu iç içe veya ard arda da kullanabilirsiniz. Bu noktada size engel oluşturacak herhangi bir kullanım söz konusu değil. Tıpkı PHP’deki ve T-SQL”deki IIF gibi…