Şöyle bir program
yazdığımızı düşünelim;
Evimize gelen her
misafirin üç kurabiye yiyeceğini varsayan ve buna göre misafirlere
yetecek kurabiye sayısını hesaplayan bir program. Bu program
aşağıdaki gibi bir kod içerebilir.
if (KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Bu kodu inceledikten
sonra DahaFazlaKurabiyeYap metodunun tam olarak ne yaptığını merak
edebiliriz. Otomatik olarak misafir sayısına göre kurabiye yapıyor
olabilir.
Ama eğer ya hiç misafir
gelmesse? O zaman MisafirSayisi değişkenimiz 0 olcak ve bizde
sıfıra bölüm hatası alacağız. Bununla beraber eğer hiç misafirimiz
gelmesse bloğun içindeki kodun işletilmesini de istemeyiz. İlk
yaklaşımımız şu olabilir; if ifadesi içindeki MisafirSayisi
değişkenini kontrol ettirebiliriz.
if (MisafirSayisi > 0 & KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Amacımıza biraz
yaklaştık. MisafirSayisi değişkenimizin değeri sıfır olsa bile
bölümün hala gerçeleştirileceğine dikkat edin. Ve sıfıra bölüm
harasının meydana gelecek. Eğer MisafirSayisi değişkeni sıfır ise
bölümü engellemek için ne yapmalıyız? Bir diğer yaklaşımda Boolean
ifadeyi iç içe geçmiş iki parçaya ayırmak olabilir.
if (MisafirSayisi > 0)
{
if (KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
}
Bu işe yarayacaktır.
Birinci if ifadesinde MisafirSayısı sıfıra eşitse ikinci if
ifadesi işletilmeyecektir.
Bir diğer yaklaşım ise
Durumsal VE operatörü kullanmaktır. Bu operatör bu gibi
durumlarda kullanılmak üzere dizayn edildi. Normal VE
operatörünün bir tane & işaretinden oluştuğunu biliyoruz.
Durumsal VE operatörü ise && dir.
if (MisafirSayisi > 0 && KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Operatörün sağındaki
kısım solundaki kısımdan True ifadesi dönmedikçe
işletilmeyecektir. Bunun dışında Durumsal VE operatörü normal VE
operatörüne benzer. MisafirSayısı değişkeninin sıfır olduğunu
düşünelim. MisafirSayisi>0 ifadesinden False değeri dönecektir.
False değerinden sonra gelen operatör Durumsal VE operatörü olduğu
için operatörün sağındaki kısım her ne olursa olsun asla
işletilemeyecektir. Bütün Boolean ifdenin sonucu asla True
olmayacaktır. Operandın sağındaki ifadelerin işletilmesine gerek
yoktur. Eğer MisafirSayisi 0 ise Bölüm asla gerçekleşmeyecektir.
Şimdi normal VE
operatörünü inceleyelim
BooleanIfade1 &
BooleanIfade2
Burada ifadelerinin
ikisininde herzaman işletileceği unutulmamalıdır.
BooleanIfade1 &&
BooleanIfade2
Bu kodda ise
BooleanIfade1den false değeri dönerse BooleanIfade2 asla
işletilmeyecektir.
Durumsal VE ye benzer
olarak Durumsal VEYA iki dik çizgiden oluşur. (||)
if (MisafirSayisi > 0 || KurabiyeSayisi / MisafirSayisi < 3)
{
KurabiyeYapma();
}
Bu kod bloğuda içinden
aynı mantığı döndürür. Eğer hiç misafir yoksa veya misafir başına
en az 3 kurabiye varsa kurabiye yapılmamalıdır. Eğer Durumsal VEYA
operatörünün solundaki ifade true değeri döndürüyorsa sağındaki
ifadeye bakmaya gerekyoktur. Çünkü herşeye rağmen bütün ifade true
olacaktir.
if ( BooleanIfade1 || BooleanIfade2 )
{
//Kodlar
}
Üsteki kodda
BooleanIfade1 true ise BooleanIfade2den ne döndüğüne
bakılmaksızın Kodlar kısmı işletilecektir. BooleanIfade1 false, ve
BooleanIfade2 true ise yine kodların işletileceğine dikklat
edelim.
C ve C++ dilinden gelen
birçok C# programcısı gereksiz kodların işletilmesini engellemek
için normal VE ve normal VEYA durumsal operatörleri yerine
Durumsal VE ve Durumsal VEYA operatörlerini kullanmaya
meyillidirler. Şimdi artık yıl hesabı yapan bir kod parçasını
durumsal operatörlerle yazalım. Boolean bir AtikYil değişkenimiz
olsun. True için artık yıl olduğunu False için olmadığını temsil
edecek. Birde integer bir Yil değişkenimiz olsun. Şimdi kodumuzu
yazalım.
ArtikYil = Yil % 4 == 0
&& ( Yil % 100 != 0 || Yil % 400 == 0 );
Eğer Yil değişkeni 4e
bölünemiyorsa asla artık yıl olamaz. Ve && operatörünün sağındaki
kısım asla işletilmez.
C# Cden kalan adına
Durumsal Operatör denilen gerip bir mirası da destekler. Tek
bir operandı bulunan tekli operatörleri, iki operatörü bulunun
çiftli opertörleri biliyoruz. Cdeki bu Durumsal Operatör
C#daki tek üçlü operatördür. Üç operand bir soru işareti (?) ve
ikinokta üstüste (:) operatörleri ile ayrılır. Ve ifade aşağıdaki
gibi olur
BooleanIfade ? A : B ;
A ve B aynı tipte
ifadeler olmalıdır ( yada birbirine çevililebilen ). BooleanIfade
değişkeni true ise yukarıdaki ifadenin sonucu A, eğer BooleanIfade
değişkeni false ise yukarıdaki ifadenin sonucu Bdir. Bir örnekle
açıklayalım. ArtikYil diye bir boolean değişkenimiz olsun.
ArtikYil ? 29 : 28;
Eğer ArtikYil değilkeni
true ise bu ifadenin sonucu 29, eğer ArtilYil değişkenin değeri
false ise yukarıdaki ifadenin sonucu 28dir. Şöyle düşünelim.
Artık yıllarda Şubat ayında 29 gün vardır. Diğer yıllarda ise 28
gün vardır. Eğer içinde bulunduğumuz yıl artıl yıl ise (ArtikYil=true)
Şubat ayı 29 gündür. Eğer içinde bulunduğumuz yıl artık yıl
değilse (ArtikYil=false) Şubat ayı 28 gündür. Yukarıda yazdığımız
ifadeyi bir atama işleminde de kullanabilir. SubatGunSayisi diye
bir integer değerimiz olsun.
SubatGunSayisi =
ArtikYil ? 29 : 28;
Burada eğer artık yılda
isek SubatGunSayisi değişkenine 29, değilsek 28 değeri atanıyor.
Yukarıda anlatılanları bu örnekte daha kolay anlıyor.
Durumsal operatörler
alternatiflerine göre oldukça rahatlık sağlıyor
if ( ArtikYil )
SubatGunSayisi = 29;
else
SubatGunSayisi = 28;
Boolean değişkenler
yerine boolean ifadeler de kullanılabilir.
Bonus = Satis >= 1000 ?
100 : 50;
Bu ifadede yapılan
satıs 1000 YTL den büyükse 100 YTL bonus, eğer satış 1000 YTLden
az ise 50 YTL bonus verileceği gösteriliyor.
Durumsal operatörler
atama operatörleri hariç geri kalan operatörlerden daha düsük
önceliğe sahiptirler. Yukarıdaki operatörler içinde en yüksek
önceliğe sahip olan Satis >= 1000 ifadesidir. Fakat yinede
kendimiz daha rahat hissetmek için Durumsal operatörleri parantez
içine almak isteyebiliriz.
Bonus = (Satis >= 1000
? 100 : 50);
Veya iki parantez de
kullanabiliriz.
Bonus = ((Satis >=
1000) ? 100 : 50);
Durumsal operatörler
kesinlikle koddan kazanmayı sağlarlar. Bu kolayca suistimal
edilebilir. Özellikle de iç içe geçmiş durumsal operatörler
kullanıldığında. Kaçıncı ayda olduğumuza göre içinde bulunduğumuz
ayın gün sayısını döndüren aşağıdaki ifade buna örnektir. Kaçıncı
ayda olduğumuzu tutan integer bir iAy değişkeni, Gun sayisini
tutan integer bir iGunSayisi değişkeni, Artık yılda oluğ
olmadığımızı gösteren boolean bir bArtikYil değiskeni
tanımladığımızı varsayalım.
GunSayisi = Ay == 4 || Ay == 6 || Ay == 9 Ay == 11 ? 30 :
Ay != 2 ? 31 : ArtikYil ? 29 : 28 ;
Yukarıdaki kodu
gerçekten okumak çok zor. Bu gibi kullanımlardan kaçınmalıyız. Bu
daha sonra kodumuzu okumaya çalıştığımızda yada başkaları okumaya
çalıştığında başımızı ağrıtabilir.