-While(0); C hack önlemek için bazı iyi yolları nelerdir ?
Kod akışı böyle olduğunda:
if(check())
{
...
...
if(check())
{
...
...
if(check())
{
...
...
}
}
}
Genellikle bu etrafında yukarıda dağınık kod akışını önlemek için çalışma gördüm:
do {
if(!check()) break;
...
...
if(!check()) break;
...
...
if(!check()) break;
...
...
} while(0);
Bunu önlemek için bazı iyi yolları iş çevresinde/üst düzey (endüstri seviyesi) bir kod olur o kadar hack nedir?
Kutunun dışında, herhangi bir öneri bekliyoruz!
CEVAP
Kimi durumlarda kullanma goto
aslında DOĞRU cevap - en az duyanlara değil yetişmiş dini inanç "goto
... asla bir cevap, ne olursa olsun asıl soru şu," - ve bu bir vaka.
Bu kod break
goto
soyunma tek için do { ... } while(0);
kesmek amacıyla kullanıyor. Eğer goto
, kullanmak için gidiyoruz eğer bu konuda açık olun. Kod okumak için DAHA da zorlaştıran bir anlamı yok.
Belirli bir durum sadece oldukça karmaşık koşulları ile bir sürü kod var
void func()
{
setup of lots of stuff
...
if (condition)
{
...
...
if (!other condition)
{
...
if (another condition)
{
...
if (yet another condition)
{
...
if (...)
...
}
}
}
....
}
finish up.
}
Aslında kod doğru olduğunu daha NET gibi karmaşık bir mantığa sahip değil.
void func()
{
setup of lots of stuff
...
if (!condition)
{
goto finish;
}
...
...
if (other condition)
{
goto finish;
}
...
if (!another condition)
{
goto finish;
}
...
if (!yet another condition)
{
goto finish;
}
...
....
if (...)
... // No need to use goto here.
finish:
finish up.
}
Edıt: açıklığa kavuşturmak İçin, hiçbir şekilde genel bir çözüm olarak goto
kullanılmasını teklif ediyorum. Ama goto
diğer çözümlerden daha iyi bir çözüm olduğu durumlar vardır.
Düşünün örneğin bizim bazı veri toplama ve farklı koşullarda test edilmiştir olmak için bir çeşit "bu son bilgi toplanan" - hangi bağlı bir çeşit "devam/son" işaretleri değişen bağlı olarak Neredesin veri akışı.
İşimiz bittiğinde, verileri bir dosyaya kaydetmek için ihtiyacımız var.
Ve evet, genellikle makul bir çözüm sağlayacak başka çözümler vardır, ama her zaman değil.
Nasıl Perl'in @INC kurulur? (aka ...
Java'da bir nesne oluşturmak için tüm ...
Bir UİWebView içinde Javascript hata a...
's "yanlış" C wchar_t v...
PHP bir sitede xss saldırıları önlemek...