Nasıl sadece bir kez bir kez bir işlev tetiklemek, sonra da ...?

oy
6

Sık sık sadece bir kez belirli bir işlevi tetiklemek istiyorum, ama tekrar tekrar çağrılan başka bir işlev içinde onu tetikleyecek gerekir. Örneğin, daha sonra kullanılmak üzere bir şeyin görüntüsünü alma. Genellikle küresel boolean ayarlayarak bunu.

Bunu yapacak bir yol aslında iyi yolu olup olmadığını merak ediyorum?

Küresel değişkenler kötü, ve küresel boolean değişkenler daha da kötü olduğunu okuma hatırlamak görünüyor!

Neyse, bu genellikle sadece bir kez belirli bir tetikleme yöntemini gerçekleştirmek nasıl:

değişkenlerin benim ilk setinde ...

private var myStatus:Boolean = false;

Ardından, işlev içinde sık sık çağrılan o ...

if (!myStatus) {
    doMyFunction();
    myStatus = true;
}

Bana oldukça mantıklı görünüyor, ama öyle doğru şey ?

GÜNCELLEME : Eh, bunun yerine küresel bir boolean değişkeni kontrol etme gereğini cevaplar öğrendiklerini dayanarak, ben şimdi ilk (I diski oluşur herhangi yazmadan önce bir XML yapısı içinde görüntüleri depolamak am) XML düğümü var olup olmadığını kontrol edin ve bunları yapmazsa, o zaman görüntü verilerini kodlanmış base64 ile yeni bir düğüm ekleyin. Gerektiği takdirde ben kullanıcı düzenlenmiş resim verileri ile boş resmi üzerine yazabilirsiniz üzerinde hala böylece daha sonra bir boolean bayrak kurarım. Bu mükemmel çalışıyor. Yardımlarınız için teşekkür ederiz!

Ben de artık belli durumlarda söz konusu (iplik güvensiz) sistemini kullanarak ilgili daha rahat hissediyorum.

Oluştur 09/12/2008 saat 23:59
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
7

Bir işlevini çağırdığınızda size bunu verin argümanlarla yapmasını istediğiniz şeyi yapmalıdır. Tam olarak aynı şekilde iki kez bir işlevi çağırırsanız o işlev de aynı sonuçları verir veya aynı şeyi yapmak için beklemek gerekir.

Sizin işlevi defalarca çağrıları mantığa bu çağrı bir kez bağımlılık taşımak için muhtemelen daha iyidir. Yalnızca işlevi çağırmak gerekiyorsa kez o zaman sadece bir kez diyoruz. Alternatif olarak, farklı bir şey yapıyoruz belirtmek için işleve farklı argümanlar geçmektedir.

Cevap 10/12/2008 saat 00:17
kaynak kullanıcı

oy
5

Gerçekten ne demek tam olarak bağlıdır. Kodunuzu birden fazla iplikten çağrılır, o zaman anlamına gelebilir bir yarış duruma sahip doMyFunctionbirçok kez adlandırılabilir. Birden fazla iş parçacığı kontrol edebilir olmasıdır myStatussonra çağırmak, yanlış olduğunu görüyoruz, doMyFunction. Önce değişkeni ayarlayarak olaya biraz iyileştirebilir:

if (!myStatus) {
    myStatus = true;
    doMyFunction();
}

ama sadece sorunları için pencereyi daraltır ki bunu ortadan kaldırmaz.

yarış durumu ortadan kaldırmak için, bir kilit gerekir.

Cevap 10/12/2008 saat 00:06
kaynak kullanıcı

oy
4

genellikle doMyFunction () yalnızca bir kez kapsüllü şöyle bir statik değişkeni kullanarak denir gerçeğini tutabilir C ++ / C:

void doMyFunction() {
     // gets called only once.
     // side effects go here.
}

void functionThatGetsCalledALot() {
    static bool called = false;
    if (!called) {
        doMyFunction();
        called = true;
    }
    // do more stuff
}

Bu globaller kullanımını önler ama aynı etkiye sahiptir ve statik var alakalı olduğunu kıvama ilan edilir, bu yüzden neler olduğunu net. Bu evreli olmadığını, sen konuları varsa bir kilit gerekir böylece unutmayın.

Cevap 10/12/2008 saat 00:09
kaynak kullanıcı

oy
2

Bu iş parçacığı güvenli değil. Bu sizin için önemli olmayabilir, ama siz "dil agnostik" dedin: muhtemelen Java için bir genel amaçlı kitaplığında bu kalıbı kullanmak istemem.

Çok mevcut alternatifler dile bağlıdır, çünkü bu, bir dil agnostik şekilde cevap vermek zor bir sorudur. Eğer iş parçacığı güvenliği gerekiyorsa POSIX Örneğin siz pthread_once var. C size küresel kapsam dışında olduğu boole'sini almak için statik yerel değişkenler var. daha sonra kullanmak üzere bir "şey" görüntüsünü alma eğer herhangi OO-dilinde, daha sonra bayrağı depolayabilir (veya anlık) "şey", karşılık gelen uygun bir nesne olabilir.

Cevap 10/12/2008 saat 00:09
kaynak kullanıcı

oy
0

Perl 5.10 yılında veya daha sonra, bir kullanırsınız statedeğişkeni.

use 5.010;

sub test{
  state $once = 1;

  if( $once ){
    $once = undef;
    say 'first';
  } else {
    say 'not first';
  }
}

test for 1..5;

çıktılar

ilk
değil ilk
değil ilk
değil ilk
değil ilk
Cevap 10/12/2008 saat 21:01
kaynak kullanıcı

oy
0

Başka bir yol görmüyorum. Bu nasıl geliştirilebileceğine dair akla gelen tek şey - parçacığı güvenliği. Eğer işlevini çağırarak birden konuları varsa Ama bu sadece gerekli.

Cevap 10/12/2008 saat 00:06
kaynak kullanıcı

oy
0

Ben burada yaklaşımı yanlış bir şey görmüyorum. Orada kesinlikle yanlış şeylerdir ama ne doğru sübjektif olabilir ve aynı zamanda dramatik sistemin gereksinimlerine göre bağlı olabilir ... "Sağ" şey her zaman yoktur unutmayın.

Cevap 10/12/2008 saat 00:02
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more