ProgramlamaVB.NET Geliştirici

Visual Basic'te iç içe prosedürlerin (Nested Procedures, Local Functions) özelliklerini ve doğru kullanımını açıklayın. Hangi durumlarda kullanımları mantıklıdır ve hangi sınırlamalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sorunun Tarihi:

Visual Basic'te iç içe prosedürler (local functions), VB 15.0 (Visual Studio 2017) sürümlerinden başlayarak VB.NET'te ortaya çıkmıştır; bu, bunları klasik VB6'dan ayıran bir özelliktir; çünkü VB6'da böyle bir imkan yoktu. Bu özellik, prosedürlerin içinde prosedürler tanımlamaya olanak tanır ve dilin ifadelerini genişletir, yardımcı mantığın tek bir görünüm alanında düzenlenmesini kolaylaştırır.

Sorun

Belli bir yardım mantığının yalnızca belirli bir yöntem içinde gerekli olduğu ve başka yerde gerekmeyen sık durumlar. Önceden, sınıfın özel yöntemlerini oluşturmak zorundaydık, bu da isim alanını kirletiyor ve kodda gezinmeyi zorlaştırıyordu. Ancak local functions ile de görünürlük sorunları, değişkenlere erişim hataları ve hata ayıklama zorlukları ile karşılaşmak kolaydır.

Çözüm

İç içe prosedürler, yardımcı mantığı "üst" prosedürde kapsüller ve kodun daha okunabilir olmasını sağlar, yardımcı yöntemlerin görünüm alanını sınırlar. VB.NET'te iç içe fonksiyonların tanımlanması şöyle görünür:

Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"Toplam — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub

Ana özellikler:

  • İç içe prosedürler yalnızca "üst" prosedür içinde görünür ve dışarıda kullanılmamalıdır.
  • Parametre alabilir ve değer döndürebilir (Function), ayrıca iç içe Sub prosedürlerini destekler.
  • Dış prosedürlerden değişkenler yakalayabilir, ancak tüm erişim değiştirici türlerini desteklemez.

Kandırıcı Sorular.

İç içe prosedürler Public, Friend veya Protected erişim belirleyicilerine sahip olabilir mi?

Hayır, iç içe prosedürler yalnızca "üst" prosedürlerinin görünürlük seviyesine izin vermektedir. Public/Friend/Protected olarak tanımlanamazlar ve yalnızca yerel olarak erişilebilirler.

Bir iç içe prosedürü For veya If yapısının içinde tanımlamak mümkün mü?

Hayır, yerel fonksiyonlar yalnızca yöntem (prosedür) içinde birinci seviyede tanımlanabilir, ancak iç içe bloklar (örneğin, For, If, While) içinde tanımlanamazlar.

İç içe prosedürler asenkron (Async Sub/Function) olabilir mi?

Evet, asenkron local functions tanımlanabilir; bu da yöntem içinde asenkron yürütme mantığını kapsüller:

Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("Asenkron işlem tamamlandı.") End Function End Sub

Tipik Hatalar ve Anti-Desenler

  • If/for veya diğer iç içe blokların içinde iç içe prosedürler tanımlamak.
  • Diğer sınıf bölümlerinde faydalı olabilecek bir mantık için iç içe prosedürler kullanmak (daha iyi bir özel yöntem yapmak).
  • Yakalanan değişkenlerin görünüm alanının uyumsuzluğu (hatalara yol açar).

Gerçek Hayattan Örnek

Negatif Durum

Projede fazla sayıda private yöntem kullanılması nedeniyle, local functions yerine private yöntemler kullanıldı ve bu da sınıfın arayüzünü "kirletti". Gezinme zorlaştı.

Artılar:

  • Yöntemler gelecekte yeniden kullanılabilir.

Eksiler:

  • Sınıfın bakımını yapmak zorlaşıyor, birçok yardımcı yöntem ana iş mantığını okumayı engelliyor.
  • Bazı yöntemler ana prosedür dışında yanlışlıkla çağrılıyordu, bu da hatalara yol açıyordu.

Pozitif Durum

İç mantık için yerel fonksiyonlar kullanma yaklaşımı benimsendi: tüm yardımcı işleme ana yöntemin içinde yer alıyor, kod kendini belgelemektedir, bakımı kolaydır.

Artılar:

  • Yardımcı yöntemler prosedür dışında görünmez.
  • Sınıfın daha temiz bir mimarisi.

Eksiler:

  • Bu prosedürleri diğer yöntemlerden kullanamazsınız (eğer böyle bir ihtiyaç doğarsa kodun tekrarı gerekmektedir).