Swift 2.0 guard keyword

Bu yazı yakında yayınlanacak olan Swift ile iOS Programlama kitabımdan bir alıntıdır izinsiz kullanılıp kopyalanamaz.

Bu yazıda WWDC15’te duyurulan Swift 2.0 versiyonunda gelen yeniliklerden birisi olan guard anahtar sözcüğü anlatılmaktadır.

Pratikte aldığı parametre argümanlarını çeşitli sınamalardan geçirip, bu argümanların tümü geçerli olduğunda işlem yapan fonksiyonlara sıkça ihtiyaç duyulur. Örneğin Tedarikci sınıfına ait Kaydet() fonksiyonu String türündeki tüm parametreleri boş değilse işlem yapmaktadır.

// Arrow Anti-Pattern

enum Hatalar : ErrorType

{

case Isim

case Soyisim

case Firma

}

class Tedarikci

{

class func Kaydet(isim:String, soyisim:String,

firma:String) throws -> Bool

{

if (isim != “”)

{

if (soyisim != “”)

{

if (firma != “”)

{

print(“Kaydedildi …”)

return true

}

else

{

throw Hatalar.Firma

}

}

else

{

throw Hatalar.Soyisim

}

}

else

{

throw Hatalar.Isim

}

}

}

///// TEST ///////

do

{

try Tedarikci.Kaydet(“Steve”,

soyisim: “”, firma: “Apple”)

}

catch Hatalar.Isim

{

print(“İsim hatalı”)

}

catch Hatalar.Soyisim

{

print(“Soyisim hatalı”)

}

catch Hatalar.Firma

{

print(“Firma hatalı”)

}

Burada “if piramidi” ya da “arrow” isimleriyle bilinen bir tür anti-patern söz konusudur. Çok karmaşık görünen ve hataya da çok açık olan bu kötü tekniğin yerine programcılar bazen “early return” denilen başka bir kötü çözüm daha uygulamaktadır. Bu çözümün ifade gücü zayıftır üstelik Swift özelinde optional değerler söz konusu olduğunda sorunu daha da derinleştirebilir.

// Early Return Anti-Pattern

func Kaydet(isim:String, soyisim:String, firma:String)

{

if (isim == “”)

{

return

}

if (soyisim == “”)

{

return

}

if (firma == “”)

{

return

}

print(“Kaydedildi”)

}

Swift 2.0 ile dile eklenmiş olan guard anahtar sözcüğü ise, bu tür durumlarda ve yukarıda ortaya konulan sorunlara neden olmayan bir çözüm sunar. Kullanım şekli aşağıdaki gibidir:

guard koşul else

{

// hata durumunda yapılacaklar

}

Özetlemek gerekirse:

  1. İfade gücü yüksektir yani bu anahtar sözcüğün kullanıldığını gören farklı bir programcı yapmak istediğiniz şeyi daha net anlar.
  2. Daha kısa ve temiz kod yazmanızı sağlar. Böylece hata olasılıkları da azalır.
  3. Özellikle optional değerler söz konusu ise guard ile açılan (unwraping işlemi) ve sınanan optional değerler bu işlem sonrasında doğrudan kullanılabilirler.

Örnek: Aşağıdaki uygulamada Ornek() fonksiyonu iki parametre almaktadır. İlk parametrenin geçerlilik koşulu; nil olmamaktır. Burada guard ile sınanan, dil isimli optional parametrenin değeri açılmakta (unwrapping) ve nil ise hata verilip, çıkılmaktadır. ver isimli ikinci parametrenin ise pozitif olması beklenmekte değilse hata üretilmektedir. Şayet her iki parametrede de bir hata yok ise ekrana “OK …” yazdırılmaktadır.

enum Hata : ErrorType

{

case Negatif

}

func Ornek(dil:String?, ver:Int) throws

{

guard var _ = dil else

{

print(“Dil ismi belirtmediniz”)

return

}

guard ver > 0 else

{

throw Hata.Negatif

}

print(“OK …”)

}

////// Test ////////

try Ornek(nil, ver: 3)

try Ornek(“Swift”, ver: -5)

try Ornek(“Swift”, ver: 2)

Reklamlar

Java’daki super anahtar sözcüğü nereden geliyor ?

Java’da taban sınıftan türemiş sınıfa (yani üst sınıfa) erişimi sağlayan “super” anahtar sözcüğünün nereden geldiğini hiç düşündünüz mü ? Bu kelime, günlük İngilizce’de (mükemmel, birinci sınıf vb) anlamlarında kullanılan dilimize de yerleşmiş bir sözcüktür. Ancak kelimenin asıl kökeni Latince’dir (superior). Latince’de (üst, üstünde, üzerinde) anlamlarında kullanılan bu sözcük, tıp ve anatomide de yer belirtmek için kullanılır. Örneğin :

Konka Nasalis Superior (Burnun üst kısmındaki kıkırdağın ismi)
Superior Orbital Fissure : Göz çukurunun üzerindeki deliğin ismi.

Superior’un tersi ise inferior kelimesidir ve (alt, altında gibi) anlamlara gelir. Örneğin günümüzde sıkça kullandığımız “infra structure” tamlaması da (alt yapı) bu kelime ile ilişkilidir. Latince’de diğer yer belirten sözcükler şöyledir :

Lateral : Yan
Dorsal : Sırt kısmı
Medial : Orta eksen
Mezial : Orta eksenin iç kısmı
Distal : Orta eksenin dış kısmı
Anterior : Ön kısım
Posterior : Arka kısım

Bu durumda web’de sıkça kullandığımız postback kelimesine yorumlarınızı bekliyorum 🙂

Multicore Processor’s & Volatile Keyword

Çok işlemcili ya da çok çekirdekli sistemlerde “nadiren yaşansa da” önemli bir sorun söz konusudur. Birden fazla, farklı işlemciye atanmış atanmış thread’in ortak bir değişkene aynı anda erişmesi durumunda sorun yaşanabilir.

Örneğin thread’lerden biri bir değişkenine değer yazarken diğeri de okuyor olsun. Bu iki thread tesadüfen paralel çalışan iki farklı işlemciye ya da çekirdeğe atanmış olabilir ve bu okuma yazma işlemleri tesadüfen aynı anda gerçekleşmiş olabilir. Bu tür durumlarda bilinen senkronizasyon teknikleri işe yaramaz. Intel işlemcilerinde bu sorun için özel bazı komutlar vardır.  C# da ise bu gibi durumlarda volatile sözcüğü kullanılmalıdır.

[skop belirteci] volatile tür değişken_ismi;

NOT : volatile anahtar sözcüğü, C dilinde register anahtar sözcüğünün aksine, bir değişkenin mikro işlemci register’larında değil bellekte kullanılacağını vurgular.