Forum: Ders Arası RSS
Yerel işlevleri sevmeye başladım
acehreli (Moderator) #1
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Subject: 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
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Forum: Ders Arası RSS
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 11:19:30 (UTC -08:00)