Bazı oyunları oynarken bir karakter üretirsiniz. Daha başka bir sürü karekter, araç gereç üretmiş ve aktif bir alanda rakiplerinizle karşılaşmaya göndermişsinizdir. İşte bu karakteri ürettirdikten sonra oyunun en hareketli sahnesinde başka bir eyleme odaklanırsınız ve o son ürettirdiğiniz karakter, oyunun en pasif bölgelerinin birinde kendi halinde kalır.
Güzel tasarlanmış oyunların bazılarında bu tür karakterlerle uzun süre etkileşmediğinizde, karakter elindeki araç, gereç, silahla hemhâl olmuş, sizin ilgisizliğinizden sıkıldığını belirten hareketler yapmaya başlar. Yere bağdaş kurar, gereçlerini bırakır, ellerini oğuşturur falan filan...
Bizim Kahramanımızın da ilgisizliğimizden doğan şikayetlerini Ali Hocamıza bildirmesine fırsat vermeden , ihtiyacı olan kodlamalara **Önemli bir not ** düşerek kaldığımız yerden devam edelim.
Alıntı:
> void bıçakDarbesiniHesapla(ref double kahramanınEnerjisi)
> {
> kahramanınEnerjisi = kahramanınEnerjisi * 0.1;
> }
> ```
>
**Önemli bir not:**
İşlev Parametreleri dersinde gördüğümüz gibi D'de işlev parametreleri normalde işlevlere kopyalanarak geçirilirler.
Benim yukarıda tasarladığım kodda ise işlev parametresinde kullandığımız **ref** işareti, işlevimize gönderdiğimiz **kahramanınEnerjisi** parametresinin işlevimize referans olarak geçirilmesini sağlar.
Eğer ben **bıçakDarbesiniHesapla()** işlevimde bir işlem yapacak ve bunun sonucunda **main()** içerisindeki kahramanınEnerjisi'ni değiştirerek kullanacaksam, işlevime kullanacağım parametreyi **ref** olarak işaretleyerek göndermeliyim ki, kahramanım ölümsüzlüğe adım atıp oyunumu tutarsızlaştırmasın.
Ancak bu yaptığım işaretlemenin, benim işlevimin parametresinde değişiklik yapması, onun artık değer üreten bir işlev değil, yan etki oluşturan bir işlev haline gelmesine neden olur. Bu da tasarımımın, işlevsel programlamada pek istenilmeyen bir duruma düşmesine sebep olur. Yan etki üreten işlevlerin kontrol edilebilme yetersizlikleri, ileride programıma yeni özellikler eklemeye kalkıştıkça, programımın güvenilirliği üzerinde tutarsızlıklara sebep olacaktır ki, yeni palazlanmış bir programcı olarak ben, bu duruma düşmemeliyim. Benim kodlarım olağanüstü becerikli ve tutarlı olmak zorundalar, yani değer üretmeliler. "Kahramanım çok yaşa!" nidaları eşliğinde programımda gereken değişiklikleri yapmaya koyuluyorum.
import std.stdio;
double bıçakDarbesiniHesapla(in double kahramanınEnerjisi) // [1]
{
double değerlendir = kahramanınEnerjisi * 0.1;
return değerlendir;
}
void main()
{
double kahramanınEnerjisi = 100_000;
double bıçakDarbeliKahraman = bıçakDarbesiniHesapla(kahramanınEnerjisi);
writeln("Hâlâ sakar ama artık canı sıkılmayan kahramanın enerjisi : ", bıçakDarbeliKahraman);
}
// Hâlâ sakar ama artık canı sıkılmayan kahramanın enerjisi :10000
**bıçakDarbesiniHesapla()** işlevimizi artık double türünde değer üreten bir işlev haline getirdikten sonra yoluma güvenle devam edebilirim artık...
[1] **in** anahtar sözcüğü işlevimize gönderdiğimiz parametrenin yalnızca giriş bilgisi olduğunu bildirir. Yan etki oluşturan önceki işlevimizde ref anahtar kelimesiyle paramateremizi işlev içinde değiştirmek isterken, şimdiki tasarımımızda in anahtar kelimesini kullanarak parametremizin değiştirilmeyeceğini sadece giriş bilgisi olarak kullanılacağını belirtmiş oluyoruz.
**İlgi :** <http://ddili.org/ders/d/islev_parametreleri.html>
**Bilgi:** *Bir programda yan etki oluşturmak her zaman istenmeyen ve pek önerilmeyen durumlardan değildir. Tasarladığımız programlardaki işlevlerde yan etki üreten durumlar pek istenmiyor olarak kabul edilebilirken kodlamamızın ilerleyen sahfalarında yapı ve sınıfları kullanırken programımızın bazı bölümlerinin yan etki üretmesini doğallıkla kabul etmek isteriz. Örneğimizin ilerleyen safhalarında sınıfların sarma yeteneklerinden bahsederken bu konuya da değinmeyi umuyorum.*
**Püf:** *Bir işlevin yan etki üretip üretmediği, parametresindeki ref işaretinden anlaşılabilir. İşlev parametrelerinizdeki ref işaretlemesi bir anlamda uyarıcı olarak da görülebilir. Dönüş türü void olarak işaretlenmiş bir işlevin parametresinde de ref işareti varsa, işlevinizin yan etki oluşturduğunu düşünebilirsiniz. Bu durumda tasarladığınız işlevi beklentilerinize uygunluğu açısından bir kez daha gözden geçirmek isteyebilirsiniz.*
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]