Swift Delegation Pattern

Aşağıdaki yazı yakında çıkacak olan kitabımdan bir alıntıdır izinsiz kopyalanıp, kullanılamaz.

Bu patern bir nesnenin yerine getirmesi gereken bir görevi kendisi yapmak yerine başka bir nesneye -delege ederek- görevi delege ettiği nesneye yaptırmasını tematize eder. Başka bir deyişle, nesne söz konusu görevi farklı bir nesnenin yardımıyla gerçekleştirir.

Bu patern’in implementasyonunda anahtar nokta delege eden ve edilenin aynı protokolü (interface’i) desteklemesidir. Ayrıca delege eden bu protokol türünde bir nesne referansı (property) içermelidir. Bu sayede o property’e atanacak olan nesneye görev delege edilmiş olur.

swift delegation patern uml diagram

swift delegation patern uml diagram

Şekil 6.1’deki UML diyagramında görülen C sınıfı, Task() isimli fonksiyonla sembolize edilen görevi A veya B’den yardım alarak (A veya B türündeki bir nesneye delege ederek) gerçekleştirecektir. Bu karar, ToDelegation() isimli fonksiyona gönderilen parametrenin polimorfik şekildeki kullanımına dayandırılmıştır. Yani ToDelegation() isimli fonksiyona A veya B türünde bir nesne parametre olarak geçilmekte ve görev o nesneye delege edilmektedir.

protocol Delegation

{

func Task()

}

class A : Delegation

{

func Task()

{

print(“Görevi A nesnesi gerçekleştirdi”)

}

}

class B : Delegation

{

func Task()

{

print(“Görevi B nesnesi gerçekleştirdi”)

}

}

class C : Delegation

{

var delegate:Delegation?

func ToDelegation(delegate:Delegation)

{

self.delegate = delegate

}

func Task()

{

self.delegate!.Task()

}

}

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

var c = C()

// A’ya delege et

c.ToDelegation(A())

c.Task()

// B’ye delege et

c.ToDelegation(B())

c.Task()

Çıktı:

Görevi A nesnesi gerçekleştirdi

Görevi B nesnesi gerçekleştirdi

Reklamlar

Swift Closure

Aşağıdaki yazı yakında yayınlanak olan kitabımdan bir alıntı olup izinsiz kopyalanıp kullanılamaz !

Closure’lar değişkenlerde saklanabilen, fonksiyonlara parametre olarak geçilebilen özel kod bloklarıdır. Standart kütüphanede de sıkça kullanılmış bir özellik olduğu öğrenimi kritik olan bir konudur. Örneğin sorted() isimli standart fonksiyon ilk parametresine aldığı diziyi, ikinci parametresine aldığı closure ile sıraya dizer ve sıralanmış halini geriye döndürür. Sıralama için kullanılacak olan karşılaştırmanın mantığı bir kod bloğu yani closure şeklinde yazılmalı ve bu fonksiyona parametre olarak gönderilmelidir. Örneğin aşağıda “clsr” isimli değişken bu duruma örnek olarak gösterilebilir nitelikte bir closure içermektedir.

var arr:[Int] = [12, 3, 5, 20, 10]

// Closure
var clsr = {(a: Int, b: Int) -> Bool in return a < b}

// Kullanımı
let arr2 = sorted(arr, clsr)

// Test
for (var i = 0; i <= arr.count-1; ++i)
{
print(arr2[i])
}

Şüphesiz closure’lar geçici değişkenlere atanmak zorunda değildir istenilirse doğrudan kullanılabilir. Örneğin:
var arr:[Int] = [12, 3, 5, 20, 10]

let arr2 = sorted(
arr,
{
(a: Int, b: Int) -> Bool in return a < b
}
)

for (var i = 0; i <= arr.count-1; ++i)
{
print(arr2[i])
}

Swift’te Fonksiyonların Değişken Olarak Kullanılması

Not : Aşağıdaki yazı yakında yayınlanak olan kitabımdan bir alıntı olup izinsiz kopyalanıp kullanılamaz !

Fonksiyonlar da değişkenler içerisinde saklanabilir. Bu cümleden kastedilen şey; bir fonksiyonun bir nesneyle temsil edilmesidir. Böyle bir nesnenin tanımlanması aşağıdaki gibi genelleştirilebilir:

var nesne: (parametrik_yapı) -> geri_dönüş_türü;

Okumaya devam et

Swift Optional Parameters (Default Argüman Alabilen Parametreler)

Çağırma ifadesinde kendisine bir argüman gönderilmediğinde varsayılan bir değeri taşıyan parametrelere opsiyonel parametreler denilir. Varsayılan değer tanımlama ifadesinde = sembolünden sonra belirlenir. Örneğin test isimli fonksiyonun opsiyonel olan prm1 isimli parametresinin varsayılan değeri 3’tür. Yani bu parametreye farklı bir argüman gönderilmeden test fonksiyonu çağırılacak olursa 3 değeri kullanılacak fakat farklı bir argüman gönderilerek test fonksiyonu çağırılırsa gönderilen değer kullanılacaktır.

func test(prm1:Int=3, prm2:String)
{
    println(prm1)
}

test(prm1:100, “xyz”)

test(“xyz”)

Swift’te opsiyonel olan parametrelere çağırma ifadesinde parametre ismi belirtilerek argüman gönderilir. Bu sayede C# gibi dillerdeki “opsiyonel parametrelerin sağına opsiyonel olmayan parametre gelemez” kısıtı aşılmıştır. Sözgelimi prm2 opsiyonel olmamasına (zorunlu olmasına) rağmen, prm1’den sonra varolabilir. Bu durumda her iki çağırma da geçerlidir.

‪Microsoft‬ .NET ‪Framework‬ çekirdek kodlarını ‪github‬’da paylaşmaya başladı

Şahsım adına yıllardır Microsoft’un bir çıkmazda olduğunu bunun da gerekçesinin son 4-5 yıldır dişe dokunur yeni bir paradigma ortaya çıkaramamalarına bilhassa da bu süreçte mobil dünyadaki gelişmeleri ıskalamış olmalarına bağlıyor bunu da her ortamda dillendiriyordum. Hatta bu gidişin Microsoft’un başına zamanında ‪#‎IBM‬’in başına gelen şeyi getireceğini söylüyordum. Sanırım son kertede yaşanan pratik beni haklı çıkardı.

Bu sözlerime bakıp da beni bir Microsoft düşmanı vs diye nitelendirmeyin zira 2002’den beridir .NET üzerine de eğitimler veren Microsoft’un üst üste 7 kez ‪#‎MVP‬ unvanı verdiği, ‪#‎INETA‬ (uluslararası .net birliğinde) ortadoğu afrika ve Türkiye başkanlıkları yapmış birisiyim. Halen de çalıştığım üniversitede ‪#‎Android‬ dersleri dışında inatla ‪#‎WindowsPhone‬, ‪‎ASP.NET‬ ‪#MVC‬ gibi dersler de veriyorum. Bu gelişmeyi de kendi adıma Microsoft’un “can havliyle” ‪#‎opensource‬ dünyasından medet ummasına bağlıyorum. Bu sayede Android, IOS, Linux, Macosx gibi sistemlerde uygulama geliştirebilmek ya da GlassFish, JBoss, Apache gibi web server’larda ASP.NET uygulamalarını çalıştırabilmek gibi ütopyaları gerçekleştirebilmek mümkün olacak. Şüphesiz bunu Java ölecek gibi yorumlayıp üzülenler de olmuş ama ben bu tedirginliği pek mantıklı bulmuyorum doğrusu.

Diğer yandan anlam veremediğim şey ise şu; Microsoft zaten yıllardır Framework’ün kaynak kodlarını açık tutuyordu hatta ‪#‎Mono‬, ‪#‎Rotor‬ gibi projeler bu şekilde ortaya çıkmıştı. Hatta Microsoft yıllardır  “dotnet” ismini bir marka gibi konumlamaktan vazgeçip ürün gibi konumlamayı seçmişti. Yani dotnet bir selpak değil kağıt mendildir vurgusunu yapıyordu. Diğer taraftan bu altyapının standartlarını ise CLI (Common Language Infrastructure) adı altında standardizasyona sokmuştu (ECMA – 335 standartları).

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

Microsoft’un resmi söylemlerine göre Mono’nun ayrı bir kod tabanı olduğu yani onun sıfırdan yazıldığı rotor’un ise open source lisansının olmadığı ve bazı uyumsuzluklarının olduğu yönünde. Bu noktada özellikle NuGet ve sıra dışı programlama vurgusu yapıyor. Enteresan noktalardan birisi de Microsoft’un bu konuda XAMARINE isimli firmayla bir tür ortak çalışma yapıyor olması. Malumunuzdur bu firma monodroid, monotouch gibi android ve ios üzerine .net ile uygulama geliştirmenin yolunu açan cross platform araçları geliştirmişti.

Yani “sanki” bütünüyle yeni olmayan bir durumu Microsoft’un çok yeni birşey yapmış gibi bir PR malzemesi haline daha getirmeye çalıştığını düşünüyor, sizlerin de yorumlarını merak ediyorum. Bu arada kodlar aşağıdaki adrese “kısmen” upload edilmiş. https://github.com/dotnet/corefx