Her şey çok güzel; artık değişken tanımlamanın birçok yolunu ve bunları ekrana yazdırmayı biliyoruz. Fakat burada anlamamız gereken ‘Scope’ adında önemli bir kavram var. İsterseniz bu kavramı direkt olarak bir örnekle anlamaya çalışalım.

Bu kısımda, daha önce de gösterdiğim gibi ‘f_name()’ adında yeni bir fonksiyon oluşturduk. Beyaz kutular ile işaretlediğim kısımlar, her fonksiyonun kendi kapsama alanıdır (scope). Kapsama alanı (süslü parantez ‘{}’) ile gösterilir. Yani hem ‘main()’ fonksiyonunun hem de yeni tanımlamış olduğumuz ‘f_name()’ fonksiyonunun kendine özgü kapsama alanları mevcuttur.

Gördüğünüz gibi aynı kod sayfasında aynı isimde iki tane değişken ataması yaptık; ‘name’. Normalde olsa hata alacağımız bir kullanımda hata almadık. Yani aynı isimde iki değişken tanımlayamazdık. Buna rağmen çıktımız başarılı bir şekilde geldi. İşte bunun sebebi tam olarak ‘Scope’ kavramıdır. Tanımlanan değişkenler, öncelikle kendi fonksiyonu içerisinde aranır. Eğer kendi fonksiyonu içerisinde varsa çalıştırır. Elbette aynı değişkeni farklı yerlerde defalarca tanımlamanızı önermem; büyük projelerde size sorun yaratabilirler. Şimdi de Python gibi dillerde ‘global’ olarak ifade edilen kavrama burada bakalım.

Dikkat ettiyseniz; ne ‘main()’ fonksiyonu içerisinde ne de ‘f_name()’ fonksiyonu içerisinde ‘name’ adında bir değişken atadık. Buna rağmen ‘name’ değişkenini ‘fmt’ ile yazdırdık ve yine de hata almadık. Bunun sebebi nedir? En üstte duran, kırmızı kutu içerisine aldığım ifadeye bakın; değişkenimizi orada tanımladık. Bu tanımlamanın anlamı az önce söylediğim ‘global’dir. Yani herhangi bir fonksiyona dahil olmayan tanımlamalar, bütün kod sayfası boyunca, istenen yerde kullanılabilir. Her fonksiyon, global alana tanımladığımız değişkenlere ulaşabilir ve onun üzerinde işlemler yapabilir.
“Eğer öyleyse neden her fonksiyonun altına bir şeyler tanımlıyoruz? Bunun yerine her şeyi global kısıma tanımlayalım ve her yerden erişebilelim.” diye bir soru sorabilirsiniz ama bunu her zaman yapamayız. Bunun sebebi, önceliğimiz olan ‘verimlilik ve depolama’dır. Global kısıma tanımlanan her değişken, yazılımın çalıştığı her saniye boyunca çalışır. Bu da gereksiz hafıza doluluğuna neden olur ve biz bu durumla karşılaşmayı istemiyoruz. Fonksiyonlar ise sadece o fonksiyon lazım olduğunda çalışırlar ve bu yüzden gerekli şeyleri ait oldukları fonksiyonların içerisine yazarız.
Şimdi, çok kısa bir şekilde global tanımlamasının bir ayrıntısına dikkat çekelim.

Kısa tanımlama yapmak istediğimizde GoLang bize, ‘Syntax Error’ veriyor. Yazım yanlışı şeklinde çevirebileceğimiz bu hatanın asıl sebebi, Go’nun tanımladığımız şeyin ne olduğunu anlayamaması. Dikkat ederseniz global kısımda tanımlanan her şeyin ilk kelimesi, bir anahtar kelimedir. Örneğin;
>>> ‘package main’ satırı bize, orada bir paketin bulunduğunu ifade eder.
>>> ‘import “fmt”’ satırı bize, orada “fmt”yi import ettiğini (çalışmaya dahil ettiğini) ifade eder.
Bizim, değişken tanımlarken kullandığımız anahtar kelime ise ‘variable’ kelimesinden gelen ‘var’ anahtar kelimesi idi. Dolayısıyla global kısımda bir değişken tanımlarken onun bir ‘değişken’ yani ‘var’ olduğunu belirtmemiz gerekir.
İçinde yorum satırı olan ve ‘main()’ fonksiyonu içerisinde bulunan ‘f_name()’ satırını da inceleyelim.

Daha önce, ‘main()’ fonksiyonunun ana fonksiyonumuz olduğundan bahsetmiştik. Bir Go programında ‘main()’ fonksiyonu, olmazsa olmazdır. Dolayısıyla ‘main()’ dışında tanımladığımız her fonksiyonu ‘main()’ fonksiyonuna tanıtmamız gerekir. Eğer yazdığımız başka bir fonksiyonu ‘main()’ içerisine ekranda gördüğünüz gibi tanımlamazsak o fonksiyon ve içindeki kodlar çalışmayacaktır.
Yukarıdakı kodu, tanıtma işlemini yapmadan çalıştırmayı deneyelim.

‘f_name()’ satırını yorum satırı hâline getirdim. Yani o satır Go tarafından okunmayacak. Silmişim gibi düşünebilirsiniz. Dikkat ederseniz ‘f_name()’ fonksiyonu içerisinde çalışması gereken kodlarımız var ama çıktıya baktığımız zaman sadece ‘main()’ fonksiyonundaki kodun çalıştığını görüyoruz. Bunun sebebi, ‘main()’ fonksiyonunun ‘f_name()’ fonksiyonunu göremiyor olmasıdır. 'main()' fonksiyonunun 'f_name()' fonksiyonunu görebilmesi için 'f_name()' fonksiyonunu 'main()' fonksiyonu içerisine çağırmalıyız (çağırmak kelimesi İngilizce'de 'call the function' olarak geçer). Bu çağırma işlemini de sadece parantezlerle birlikte fonksiyonun ismini 'main()' içerisine yazarak yaparız.
Uyarı: Lütfen anlattıklarımızı tek tek uygulayın ve kodu farklılaştırarak deneme-yanılma yöntemiyle pratik yapın. Hata almaktan korkmayın, kodu bozmaktan korkmayın. Hatasız kod olmaz!
Yayınlanma Tarihi: 2022-07-16 23:58:49
Son Düzenleme Tarihi: 2022-07-19 19:40:01