October 19, 2012

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. ]
October 19, 2012

Mert hocam,

Peki 'in' takısı kullanan parametreler ile kullanmayanlar arasında önemli bir farklılık var mı? Tam da bu konuya alt parantez açmam gerekiyor, çünkü yeni kullanmaya başladığımız 'const ref' yerine 'in ref' olayını şurada Ali hocam anlatmıştı: http://ddili.org/forum/thread/970

Son olarak tek başına ref'i bir kenara bırakırsak diğerleri hep kafamı karıştırdığı için kullanmıyorum...:)

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Alıntı:

>

Salih:
Mert hocam,

Bir öğrenciyim sadece. Aman diyeyim karışmasın.
Alıntı:

>

Salih:
Peki in takısı kullanan parametreler ile kullanmayanlar arasında önemli bir farklılık var mı?

in için 'anahtar kelime' demek, ortak bir dil kullanabilmemiz açısından daha uygun sanırım. Şu anda örneğimizde işlevlere kadar ilerleyebilmiş olduğumuzdan, işlevlerde kullanılan in anahtar kelimesinin yazdığımız işlevde nasıl etkili olduğuna değinebildik henüz.
" 'const ref' yerine yeni 'in ref' " başlıklı konuyu inceledim. in anahtar kelimesi kullanmadan da işlevlerimize parametreler geçirebiliriz. Ancak bu şekilde davrandığımızda o parametrenin işlevimizin içinde değişmeyeceği gibi bir garantimiz olamıyor. Başka bir yaklaşım da; eğer sorunumuz sadece parametremizin işlev içinde değişmiyor olduğu garantisini sağlamaksa const, immutable gibi değişmezliği belirli seviyelerde bize sunan anahtar kelimeleri kullanabiliriz. Benim şu aşamada kullandığım in (belirteci) bu örneği oluştururken belirlediğim düzeyin, biraz kodlama alışkanlığımın ve biraz da in anahtar kelimesinin arkasında iş gören farklı yordamların olabileceği önsezisinden kaynaklanmaktaydı ki, senin de referans verdiğin konu başlığında http://ddili.org/forum/thread/970 Ali hocam bu olanağa değinmiş.
Alıntı:

>

acehreli:
Aslında tam aynı anlamda değiller çünkü 'in' ayrıca 'scope' belirtecini de içerir. (scope yukarıdaki bağlantıda geçiyor ama henüz hiçbir derleyici onu desteklemiyor.)

Salih hocam; Sorunu tam olarak kavrayamayıp beklediğin yanıtı verememiş olabilirim. Ama detaylandırmak her zaman mümkün elbet. Bu doğrultuda katkıda bulunmak ister misiniz?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Alıntı (mert):

>

Alıntı (Salih Dinçer"):

>

Mert hocam,
Bir öğrenciyim sadece. Aman diyeyim karışmasın.

Aynı şekilde ben de dahil çoğumuz öğrenme aşamasındayız ve öğrenmenin hayat boyu sürdüğünü düşünürsek hepimiz öğrenciyiz. Ancak sanırım bu başlık ile sayenizde bir şeyler öğreniyorsak bal gibi de hoca işte...:)

Alıntı (mert):

>

in için 'anahtar kelime' demek, ortak bir dil kullanabilmemiz açısından daha uygun sanırım.

Sanırım İngilizce'deki "keyword", do, while, for, if dahil her dil olanağının karşılığı oluyor. Bu bağlamda doğru ama bu takıları ayırma taraftarıyım. Belirteç de çok güzel görünüyor çünkü işaretlerden oluşanlarına da işleç diyoruz. Üstelik "abahtar sözcük" iki sözcükten oluştuğu için kullanımı zor görünüyor. Eğer Ali hocam kitapta sıklıkla belirteç kullandıysa bence böyle devam edelim.

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Alıntı (mert):

>

in anahtar kelimesi kullanmadan da işlevlerimize parametreler geçirebiliriz. Ancak bu şekilde davrandığımızda o parametrenin işlevimizin içinde değişmeyeceği gibi bir garantimiz olamıyor. Başka bir yaklaşım da; eğer sorunumuz sadece parametremizin işlev içinde değişmiyor olduğu garantisini sağlamaksa const, immutable gibi değişmezliği belirli seviyelerde bize sunan anahtar kelimeleri kullkanabiliriz. Benim şu aşamada kullandığım in parametresi hem bu örneği oluştururken belirlediğim düzeyin, birazda kodlama alışkanlığımın ve biraz da in anahtar kelimesinin arkasında iş gören farklı yordamların olabileceği önsezisinden kaynaklanmaktaydı ki senin de referans verdiğiniz konu başlığında http://ddili.org/forum/thread/970 Ali hocam bu olanağa değinmiş.

Alıntı (acehreli):

>

Aslında tam aynı anlamda değiller çünkü 'in' ayrıca 'scope' belirtecini de içerir. (scope yukarıdaki bağlantıda geçiyor ama henüz hiçbir derleyici onu desteklemiyor.)

Sorunu tam olarak kavrayamayıp beklediğin yanıtı verememiş olabilirim. Ama detaylandırmak her zaman mümkün elbet. Bu doğrultuda katkıda bulunmak ister misin Salih hocam?

An itibariyle bu konuda kullanmaya başladığımız in belirteçleri hakkında ekleyebileceğim bir şey yok. Ancak şimdi assembly kodlarını inceleyerek bunun biz programcılar için sadece bir takı olduğumu yoksa bir araç ve gereç gibi bir işi yapan belirteç mi olduğundan emin olabilirim. Konuyu çok şişirmemek için hemen aşağıda iletimi düzenleyerek cevaplayacağım:

Şu örneği denedim:

int func(int foo, in int bar) {
 foo += bar;
 return foo;
}

Assembly kodlarına baktım ve vardığım sonuç şu:

Öncelikle in ile const arasında hiç bir fark yok! Birisi diğerinin alias'ı gibi çünkü MD5SUM ile de dosyanı birebir aynı olduğunu kontrol ettim. Ancak bu takıları kullanmadığımız zaman parametre değişkenlerine bellekte farklı bir şekilde yer ayrılıyor. Yine de 'main()' ve 'func()' işlevleri içindeki assembly komutlarında en ufak bir şey değişmediğini söyleyebilirim...:)

Değişen belki de tek şey var, yukarıdaki örnekte eğer in belirteçini ilk parametre önüne koyarsanız doğal olarak derleme hatası alıyorsunuz. Sanırım bütün bu olanaklar yazılım geliştikçe bir şeylerin karışmasını engellemek için türetilmiş. Çünkü siz örnekti foo değişkenini const veya in özelliği verirseniz, bunun içeriğini değiştiremeyeceğiniz için işlevden çıkana kadar güvenle kullanabilirsiniz. Çünkü değişmeyeceğinin garantisi var, yoksa derlenirdi...

Özetle bunlar bir takıdan çok derleyici için bir belirteç, yoksa kenara bir yere "aman bu değişkeni içeride kullanma" diyebilirdik. Öyle ya, scope(exit) gibi olanaklar içinde bu değerin ilk halini kullandığımızda işler karışabilirdi. Şimdi her şeyi daha net anlıyorum...:D

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Alıntı:

>

acehreli:
Daha çok bir kişisel tercih ve belki de yazının bu aşamasında göstermek istemedin ama ben atamalı işleçleri yeğliyorum:

Atamalı işleçler benim de tercihim, ancak düz mantık kolay kavranır şu aşamada diye düşündüğümden
Alıntı:

>

acehreli:
bıçakDarbeliKahraman değişkeninin ismini bıçakDarbeliEnerji diye değiştirmek daha uygun olacak gibi geliyor.

İleriki aşamalarda enerji - para gibi sorunlarımız ortaya çıkacak ve işte o zaman bu değişim bir zorunluluğa dönüşecek
Alıntı:

>

acehreli:
'in' çok yararlı bir anahtar sözcük. (Ben bu gibi anahtar sözcüklere belirteç de diyorum.)

Alıntı:

>

Salih:
Sanırım İngilizce'deki "keyword", do, while, for, if dahil her dil olanağının karşılığı oluyor. Bu bağlamda doğru ama bu takıları ayırma taraftarıyım. Belirteç de çok güzel görünüyor çünkü işaretlerden oluşanlarına da işleç diyoruz. Üstelik "abahtar sözcük" iki sözcükten oluştuğu için kullanımı zor görünüyor. Eğer Ali hocam kitapta sıklıkla belirteç kullandıysa bence böyle devam edelim.

Belirteç deyip dememek konusunda yazarken kararsız kalmıştım. Sayenizde oturdu o da. Oldukça güzel niteler. Belirteç demeye devam :-)
Alıntı:

>

acehreli;
Örneğin, 'double' ve 'in double' çağıranın açısından aynı anlamdalar çünkü ikisinde de çağıranın değişkeni değiştirilemez. Ama tabii ki 'in double' yeğlenmeli çünkü parametre hakkında daha fazla bilgi taşıyor.

Katılıyorum. Yeri geldikçe uygulamaya devam.
Alıntı:

>

Salih:
Ancak şimdi assembly kodlarını inceleyerek bunun biz programcılar için sadece bir takı olduğumu yoksa bir araç ve gereç gibi bir işi yapan belirteç mi olduğundan emin olabilirim. Konuyu çok şişirmemek için hemen aşağıda iletimi düzenleyerek cevaplayacağım:

Çok güzel. Demek ki dağarcığımız genleşecek. Salih hocam bulgularını bekliyorum.
Bu aşamadan sonra yavaş yavaş yapı haline döndürebileceğiz belki de programı.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Bu tartışma şekillenirken aklıma püf noktalarına eklenebileceğini düşündüğüm bir şeyler geliverdi.

Acaba: "Eğer gelişmekte olan bir programlama dilinde %100 aynı işi yaptığına inandığımız olanaklardan iki adet varsa, bunların bir tanesi ya gerçekten diğerinden farklı işler yapıyordur veya biri emekliye ayrılmak üzeredir." demek ne kadar doğru olur veya mantıklı mıdır?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Örneğin clean() yerine gelen destroy() 2.060'da clean'nın yılbaşında emekliye ayrılacağını söylüyor. Ayrıca bir süre hata olmasın diye alias ile clean'ı destroy'a bağlamışlar.

Bir de yukarıdakilere benzer delete() var ki aynı gibi görünse de ek olarak bellekten de temizliyor. Yani an itibariyle destroy() ve delete() birbirine benzese de destroy() ile sildiğimiz nesneyi GC'ye emanet ederken, delete()'de ise onun yerine siliyoruz. Bu sefer de yüksek sayıdaki işlemlerde yapılan bu belleğe boşaltma işlemi bize ek zaman kaybı anlamına geliyor.

Özetle göründüğü gibi olmayan şeyler var ama in ile const 2.059 için birebir aynı olduğuna yemin bile edebilirim...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Alıntı:

>

Salih:
Özetle göründüğü gibi olmayan şeyler var ama in ile const 2.059 için birebir aynı olduğuna yemin bile edebilirim...

Sizler kadar deneyimli değilim. Ancak genelde in belirtecini işlev parametrelerinde kullanmaya aşinayız. **const **ise çoğunlukla pek çok durumda kullanılıyor. Belki de ek fark birinin diğerine göre daha geniş kapsamlar için kullanılıyor olmasındadır. (const)
Bu durum bile benim const'u ayrıcalıklı bir konuma yerleştirmeme yetiyor.
Şuradaki bilgi benim için şu aşamada yeterli:
Alıntı:

>

http://ddili.org/ders/d/islev_parametreleri.html dersi in belirteci konusu
in anahtar sözcüğü parametrenin bu düzenekte yalnızca bir giriş bilgisi olarak kullanıldığını belirler. Bu tür parametreler işlevde yalnızca bilgi olarak kullanılırlar, kendileri değiştirilemezler. in bu açıdan const'a benzese de, İngilizce'de "içeriye" anlamına geldiği için, parametrenin amacını daha açık bir şekilde ifade eder:

Gayet açık, gayet net.
Alıntı:

>

acehreli:
Zararı yok ama gerek de yok.

Gerek yoksa atlanır. Hiç ikilenmez.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 19, 2012

Mert, bu yazı çok güzel gelişiyor! :) En önemli konuları bulup çıkartmışsın. Sonunda makaleler bölümünde mi birleştirelim yoksa basılı kitap olarak mı? ;)

  • Daha çok bir kişisel tercih ve belki de yazının bu aşamasında göstermek istemedin ama ben atamalı işleçleri yeğliyorum:
   kahramanınEnerjisi *= 0.1;
  • bıçakDarbeliKahraman değişkeninin ismini bıçakDarbeliEnerji diye değiştirmek daha uygun olacak gibi geliyor.

'in' çok yararlı bir anahtar sözcük. (Ben bu gibi anahtar sözcüklere belirteç de diyorum.) Ancak, bazı durumlarda etkisinin olmaması yararına gölge düşürüyor. Örneğin, 'double' ve 'in double' çağıranın açısından aynı anlamdalar çünkü ikisinde de çağıranın değişkeni değiştirilemez. Ama tabii ki 'in double' yeğlenmeli çünkü parametre hakkında daha fazla bilgi taşıyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]