Konu Geçmişi:
Gölgeleme, bir değişkenin iç görünürlük alanında aynı isimle tanımlandığında, dış görünürlük alanındaki değişkenin üzerine yazması durumudur. Swift'in erken sürümlerinde, gölgeleme konusunda derleyici sıkı kurallar uygulamıyordu, ancak dil modelinin karmaşıklaşmasıyla birlikte bu durumların açık bir şekilde tanımlanması gereklilik haline geldi.
Sorun:
Gölgeleme, kod bakımını zorlaştırır ve zor tespit edilen hatalara yol açar; aynı isimle değişken tanımlanması, geliştiricinin beklediği değişkene erişilmemesine neden olabilir. Özellikle referansla değişken geçişi ve döngüler veya kapanışlar içinde bu durum kritik bir hal alır; hatalar genellikle yalnızca çalışma aşamasında ortaya çıkar.
Çözüm:
Swift, değişken gölgelemesini destekler, ancak önemli değişkenlerin/özelliklerin gölgelenmesinden kaçınılması önerilir; farklı isimler kullanılmalı veya açık self/this referansları uygulanmalıdır. Özellikle struct/class başlatıcılarında, üye ve parametreyi ayırt etmek için self kullanmak tavsiye edilir:
Kod Örneği:
struct User { let name: String init(name: String) { self.name = name // self, atamanın açık olmasını sağlar } }
Key Özellikler:
Döngüler ve kapanışlarda gölgeleme gerçekleşirse ne olur?
Kapanış içinde, dış bağlamdakiyle aynı isme sahip bir değişken tanımlanırsa, gölgeleme dış değişkeni gizler. Bu durum beklenmedik davranışlara yol açabilir, özellikle çoklu iş parçacığı durumlarında.
let value = 10 let closure = { let value = 20; print(value) } closure() // 20 print(value) // 10
Aynı isimle bir sabit ve değişkeni aynı görünürlük alanında tanımlamak mümkün mü?
Hayır. Swift, tek bir görünürlük alanında var ve let için aynı isim kullanılmasına izin vermez:
let x = 5 var x = 10 // Hata: 'x' yeniden tanımlaması geçersiz
Miras alımında sınıf özellikleriyle ilgili karışıklık nasıl önlenir?
Alt sınıf, ebeveyn sınıfın özellik ismine sahip bir özellik tanımlarsa, gölgeleme gerçekleşir. Ancak super veya self üzerinden erişim sağlandığında, ilgili özellik seçilecektir. Gereksiz yere aynı isimleri kullanmamak en iyisidir.
Account sınıfında bir geliştirici, yanlışlıkla değişken balance'ı fonksiyon parametresi ismi olarak kullandı ve fonksiyon içinde tekrar let balance = ... kullandı. Gölgeleme nedeniyle hesaplama beklenmedik bir değer ile yapıldı ve fonksiyon yanlış sonuç döndürdü, bu durum sadece geç test aşamasında fark edildi.
Artılar:
Eksiler:
Tüm takım, ön ekler (örneğin, inputBalance) kullanma veya her zaman özelliklere referanslar için self kullanma konusunda anlaştı. Sonuç olarak gölgeleme ile ilgili hatalar neredeyse yok oldu ve kodun bakımı kolaylaştı.
Artılar:
Eksiler: