O zaman, mantığını anlatalım istediğinizdeki aksaklıkları. Bunu Fonksiyon, Sınıflar ve nesneler açısından ayrı ayrı anlatmak gerekir.
Evet, bu sorunuzu daha önce cevaplamıştık. Kabaca, fonksiyon içindeki bir değişkeni, kopyalarak, global tanımlayarak, scope unu farklı tanımlayarak bir çok şekilde erişilir hale getirilebilir.
Ama önemli olan programlama mantığında dikkat etmenizde faydalı olabilecek bir kaç konuya da değinebiliriz.
Öncelikle fonksiyon yapısından bahsedelim. Fonksiyonları matematikteki fonksiyonlara benzetebiliriz.
Bir veya birden falza değişken girip, bir veya berden fazla sonuç döndürebilen yapılardır. Tabi hiç değişken girmeden yada hiç bir dönüş değeri de vermeden çalışan fonksiyonlar da vardır. Eskiden biz bunlara yani girdisi çıktısı olmayan belli işlemleri yapan fonksiyonlara prosedür derdik.
Dönelim fonksiyonlara;
Hem okunaklılık, hem programın modülerliği açısından fonksiyonlar mümkün olduğunda bir işi yapan ve diğer fonksiyonlara bağımlı olmadan çalışır şekilde ayrılmaya çalışılır.
Yani bir fonksiyon iki iş birden yapıyorsa teoride ayrılması gereken iki farklı fonksiyon yazılması gerekiyor demektir.
Yani doğru tasarlanmamış bir fonksiyon demektir. Aynı şekilde eğer bir fonksiyondaki bir parametre birden fazla fonksiyonda ihtiyaç duyuluyorsa yine tasarım hatası var demektir.
Normalde fonksiyona değer girer, değer çıkar, çıkan değer de başka bir fonksiyona girdi olabilir şekilde tasarlanmaya özen gösterilmelidir.
Bunun bir çok amacı vardır, biri okunurluk, ikincisi değişkenlerin takibinin kolaylaştırılması, üçüncüsü ile iyi bellek yönetimi içindir.
Örneğinizdeki deneme fonksiyonunuz üzerinden anlatalım.
Eğer
static void
yerine, fonksiyonunuzu
int olarak tanımlarsanız ve dönüş değeri olarak
return b;
kullanırsanız fonksiyonu her çağırdığınızda size ihtiyaç duyduğunuz b değerini zaten verecektir.
Bu şeklde yapmaz ve global bir b değişkeni tanımlarsanız, fazladan bellek harcayacaktır. Oysaki return ile alırsanız, bu durumda b fonksiyon çağırılmadığı sürece ayrıca bellek kaplamayacaktır.
Bu ve benzeri nedenlerle fonksiyon içerisindeki değerlere doğrudan erişim pek tavsiye edilmez. Bunun yanı sıra kontrolsüz dışardan erişim ile programınız çalışmaz hale gelebilir ve siz bu değeri hangi fonksiyonun ne zaman değiştirdiğini bulmakta zorluk çekebilirsiniz.
İş sınıflar için de benzerlik gösterir ama sınıflar için bir kaç açıklamaya daha ihtiyaç vardır.
Sınıflar çalışmaz, sınıflar bir nevi tip tanımlaması gibidir. Sınıflardan tanımlanarak nesneler oluşturulur ve nesneler de tabi ki çalıştırılabilir sınıf kopyalarıdır artık.
Bu durumda sınıfların dışarıdan erişilebilr değişkenleri olabilir. Bu değişkenler sınıfın dışından fonksiyonlar yerine haberleşmesi gerektiğinde tabi ki ihtiyaç duyulabilen özelliklerdir.
Bu nedenle de sınıf değişkenlerine erişim gerekebilir ve erişimi konusunda yine erişim değiştiriciler konusuna bakmanız gerekecektir.
Sınıflardan oluşturulan, nesnelerin kullanıldığı nesneye yönelik programlamanın amacı,
Daha güvenli kod yazmak, tekrarlanan fonksiyon gruplarını ve değişkenleri kopyalayarak iyi bir bellek yönetimi ve kolay kod yazmak gibi yararlarından dolayı tercih edilir.
Peki güvenli kod yazmak ne demek;
Güvenli kod yazmak, mümkün olduğundca, nesnelerinizin kendi içinde çalıştığı, dışarıdan, diğer fonksiyon ve sınıflardan erişilmeyen kodlardır diyebiliriz.
Burada amaç yine aynıdır. Eğer bir nesneye dışardan erişim gerekiyorsa sınıf yanlış tanımlanmıştır.
Mümkün olduğunca, nesnelere (doğal olarak tanımlayan sınıfları yazarken) tek görev yüklenmelidir. Dışarıdan erişime kapalı, Sadece alması gereken parametreleri alacak şekilde tasarlanmalı, sonuçları da aynı şekilde tasarlanmalıdır.
Bu şekilde bir mantık yerleştirirseniz, güvenli, düzenli, okunaklı, hataya daha az açık kod yazmış olursunuz.
Size verilen tavsiye bu nedenledir.
Sonuç olarak:
Evet fonksiyonlardaki, ve sınıflardan türetilen nesnelerdeki değişkenlere dışardan erişebilirsiniz.
Ama bunu yapıyorsanız, hatalı bir tasarım yapmış olma ihtimaliniz vardır ve yukarıdaki risklerden kaçınmak için fonksiyon ve sınıflarınızı yeniden tasarlamalısınız.
Size yapılan uyarıların maksadı da bu yöndedir.
Kolay gelsin.