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.
)
İ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:
(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:
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
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
acehreli
Show profile
Link to this post