• o sirada calisan fonksiyonun local namespace'inin disinda bulunan degiskenler. fonksiyonun icinde kullanilmasi tavsiye edilmez.
  • programın her faaliyet alanı yani kapsamı (scope) tarafından erişilebilen değişkenlere denilir. global değişkenlerin kullanımı programın her tarafından her fonksiyonundan erişilmesi, erişim sağlarken kısıtlamaları sağlayan kapsamları (scope) düşünmeden çok rahat bir şekilde erişilmesi avantaj gibi düşünülse de çok kötü bir programlama pratiğidir. birçok programlama dili tarafından desteklense de deneyimlerime göre mümkün olduğunca kullanılmaması gerekir çünkü programın karmaşıklığını kullanıldığı anda katlayarak arttırır. bildiğim kadarı ile c/c++, php, python gibi diller tarafından desteklenirken, bilinenin aksine java tarafından desteklenmez. javada her değişkenin yasam süresi dahil olduğu sınıfın yasam süresi ile kısıtlıdır. fakat bu kısıt çeşitli yöntemlerle aşılabilir ve değişken (aslında bir bilgi) global hale getirilebilir.

    peki bu global değişken kullanmak neden iyi değil? benim programlamaya bakış açıma göre, bir program gerçek dünyanın mümkün olduğunca soyut hali olmalı, ama gerçeklik kurallarından çıkmamalı. o yüzden bu değişkenlerin neden olduğu problemi gerçek dünyadan örneklerle anlatabilirim. değişkenleri bir telefon gibi düşünelim. cep telefonları lokal değişkenlerdir çünkü size aittir, o telefon üzerindeki kontrol sizindir. bu telefonu kullanacak kişi önce size sormalı, sizin için de uygunsa kullanabilmelidir. peki bu telefonu global yaparsak ne olur. bir aile düşünün, herkes ayrı ayrı bir cep telefonuna sahip olmak yerine sadece bir global telefonla bu durumu çözüyorlar. bu konuda da avantaj olarak gösterdikleri ama avantaj olmayan nedenleri ise sunlar. telefona ailedeki herkes ulaşabilir ve kullanabilir çünkü telefonun sahibi belirli biri değil bu da erişim kolaylığı sağlıyor. ailedeki herkese ayrı telefon yerine 1 telefon kullanılması hem daha tasarruflu, hem de fatura için birçok telefonu kontrol etmek yerine tek telefonu kontrol ettiğimiz için karışıklık da azalıyor. bu örnekleri verince 90’lı yıllardaki evlerdeki sabit telefonlarla yaşadığımız problemler aklımıza gelmiştir. arkadaşımızı acilen aramamız gerekir ama evin annesi gün arkadaşları ile bitmek bilmeyen konuşma yapmaktadır, arayamayız. ya da önemli bir yerden telefon bekleriz ama evin genç oğlu kız arkadaşıyla gereksiz bir konuşma yapmaktadır, "önce sen kapat...", "yok sen kapat..." gibi. peki ya evin babasi; evin babasi da telefon rehberindeki kisileri isimlere göre degil de soyadi sirasina göre alfabetik siralamistir, soyadini bilmediginiz sadece ismen tanidiginiz kisiyi rehberde bulamazsiniz. evin kücük kizi ise telefonun cagri melodisini degistirmis, bir yerden bir melodi duyuyorsunuz ama o melodinin telefondan mi geldigini ayirt edemiyorsunuz. tam bir kaos. temelde bu problemler iki nedene dayanir 1. neden; telefonu baskalari kontrol eder, bir seyleri degistir ama siz ne oldugunu bilemezsiniz. 2. neden; telefonu siz kontrol eder, birseyleri degistirirsiniz ama baskalari ne oldugunu bilemez. bunun yerine herkesin ayri bir telefonu olsaydi ve her degisiklik icin önce telefonun sahibinin olurunu alsaydik bu karmasalar yasanmayacakti. bu örnegi proglamlamaya aynen aktarabiliriz. bir fonksiyon global bir degiskene erisebilir, bu degiskeni istedigi gibi degistirebilir ve diger fonksiyonlarin bundan haberi bile olamaz. ya da bir degisken kullanmak istiyoruz ama bu degisken baska bir fonksiyon tarafindan kullaniliyor, kullanmamiza izin verilirse diger fonksiyonun o an yapmakta oldugu isi bozabiliriz, kullanmamiza izin verilmez ise o fonksiyonun isinin bitmesini beklemeliyiz, yani senkronize yürütme/asenkronize yürütme (syncronized thread/asyncronized thread). degiskende her bir degisiklik ona yeni bir durum (state) kazandiracaktir. her degiskeni kullanmadan önce ne durumda oldugnu kontrol etmemiz gerekir cünkü degiskenin durumu baskasi tarafindan degistirilmis olabilir. mesela "saat" degiskenine "11" degerini attik. daha sonra fonsiyonumuz (ya da methodumuz) kodu yürütürken arkada bir baska fonksiyon "saat" degerini "null" olarak sifirladi. eger fonksiyonumuz bu "saat" degerini arttirmaya calisirsa hata alacaktir. bu degeri kimin ne zaman degistirdigini de bilemeyecegiz.

    özetle, eğer global değişken kullanırsan fonksiyonlar arası bağımlılık artacaktır bu da hata ayıklamayı (debugging) zorlaştıracak, program yapısı daha karmaşık olduğu için "spagetti code" kıvamına gelecek, "modularity" düşecektir. fonksiyonlar içinde ise objenin durumunu (state) her isleme almadan önce kontrol etmemiz gerekecek, her olasılığa göre "exception handling" yapmamız gerekecek bu da fonksiyon içinde de daha fazla kod yazmamıza ve karmaşıklığa neden olacaktır. dolayısı ile büyük resimden baktığımızda kodun "maintainability", "extendibility" ve "reliability" düşecektir. tüm bunları hesaba katarsak sadece değişkene erişimimizi kolaylaştırmak için birçok önemli kriterden feragat etmemiz, kötü kod yazmamız olası olur.
  • global variables kod blogunun hemen disinda en ustte yazilir boylece bu degiskenlere her yerden ulasilabilir, fonksiyonlar icinde kullanilabilir.
hesabın var mı? giriş yap