Forum: Ders Arası RSS
Yerel işlevleri sevmeye başladım
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Yerel işlevleri sevmeye başladım
C++'da yerel işlev olmadığı için yararlarını anlamıyormuşum. (Aslında C++'da da yerel sınıf tanımlayabilir ve onları işlev nesneleri (functor) olarak kullanabiliriz; ama yazımları fazla uzun olduğu için kimsenin aklına gelmez ve yazımları uzun olabileceği için zararları yararlarından fazla olabilir.)

Belirli bir işlemin bir işlev içinde birden fazla noktada gerektiğini düşünelim. (Güzel bir örnek bulamadım. :( )

import std.stdio;
import std.random;
 
void foo()
{
    int birDeğişken;
    int başkaDeğişken;
 
    foreach (i; 0 .. 10) {
        birDeğişken = uniform(0, 10);
        başkaDeğişken = uniform(0, 10);
 
        if ((i + birDeğişken + başkaDeğişken) % 2) {
            writefln("toplamları tek: %s %s %s",
                     i, birDeğişken, başkaDeğişken);
 
            birDeğişken = uniform(0, 10);
 
            if ((i + birDeğişken + başkaDeğişken) % 2) {
                writefln("      hâlâ tek: %s %s %s",
                         i, birDeğişken, başkaDeğişken);
            }
        }
    }
}
 
void main()
{
    foo();
}

İki yerde, üç değişkenin toplamlarının tek sayı olup olmadıklarını hesaplıyor. Normalde kod tekrarını ortadan kaldırmak için serbest bir işlev yazarız:

bool toplamları_tek_mi(int birinci, int ikinci, int üçüncü)
{
    return ((birinci + ikinci + üçüncü) % 2) != 0;
}
 
void foo()
{
// ...
 
        if (toplamları_tek_mi(i, birDeğişken, başkaDeğişken)) {
// ...
            if (toplamları_tek_mi(i, birDeğişken, başkaDeğişken)) {

(Tabii aslında çokuzlu (tuple) parametresi olan bir işlev şablonu daha kullanışlı olurdu. Böylece yalnızca üç adet değil, istediğimiz kadar sayının toplamlarının tek olup olmadıklarını da anlayabilirdik.)

Yukarıdakinin bir sorunu, üç adet yerel değişkenin her seferinde toplamları_tek_mi işlevine gönderilmelerinin gerekiyor olması... Onun yerine, yerel bir işlev kullanabiliriz ve böylece parametre göndermekten kurtuluruz:

import std.stdio;
import std.random;
 
void foo()
{
    int birDeğişken;
    int başkaDeğişken;
 
    foreach (i; 0 .. 10) {
        bool toplamlar_tek_mi()
        {
            return ((i + birDeğişken + başkaDeğişken) % 2) != 0;
        }
 
        birDeğişken = uniform(0, 10);
        başkaDeğişken = uniform(0, 10);
 
        if (toplamlar_tek_mi()) {
            writefln("toplamları tek: %s %s %s",
                     i, birDeğişken, başkaDeğişken);
 
            birDeğişken = uniform(0, 10);
 
            if (toplamlar_tek_mi()) {
                writefln("      hâlâ tek: %s %s %s",
                         i, birDeğişken, başkaDeğişken);
            }
        }
    }
}
 
void main()
{
    foo();
}

Oradaki toplamlar_tek_mi yerel işlevi; yerel değişkenlere erişebildiği için artık i, birDeğişken, ve başkaDeğişken'in parametre olarak gönderilmeleri gerekmiyor.

Güzel bir örnek bulamadım ama kullanışlı işte... :)

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-23, 23:13:17 (UTC -08:00)