2010-07-27 21 views
6

Aşağıdaki kodu aldığımı varsayalım, temel olarak bazı koşulların eşleştiğini belirledikten sonra boole değerini atayıp ardından bazı kodları çalıştırın. Ardından booleanValue false olursa bir istisna atar. BooleanValue kodların geri kalanını çalıştırmadan false olursa hemen bir istisna atmak isterse ne olur? İkinci şartlı ifadeyi ilkine koyarsam, çoğaltılan kodlar olacaktır. Lütfen bana bunu yapmanın akıllı bir yolunu gösterin (kodu benim kodlarıma benzetmek için değiştirdim). Bunun yerineJava'da koşullu bir deyimin yeniden yazılması

booleanValue = anotherMethod(); 

ait

boolean booleanValue = false; 
Permission value; 

if (someCondition) { 
    value = getPermission_1(); 
    booleanValue = someMethod(value); 
    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 
    booleanValue = anotherMethod(value); 

    useValue_2(value); 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

cevap

7

Boole değişkeni elimine ne dersin? Böyle kodunuzu yazabilirsiniz:

gözlerimin daha kolay görünüyor, ama böyle şeyler zevk meselesidir olan
if (someCondition) { 
    if (!someMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 
else { 
    if (!anotherMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 

...

Ekstra avantaj: istisna yığın-izlemesinde sona ererse Durumun ne olduğunu biliyorsunuz, çünkü iki farklı atış ifadeniz var. Bu hata ayıklama biraz hızlandırabilir.

boolean booleanValue = false; 

if (someCondition) { 
    booleanValue = someMethod(); 
    if(booleanValue){ 
     //some codes... 
    } 
} 
else { 
    booleanValue = anotherMethod(); 
    some codes... 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

... ama bana başka istisna atıyorlar bir kavramsal farklı nedeni büyük olasılıkla, çünkü if(!booleanValue) throw Exception(); bit tekrar umursamıyorum:

+0

Bunu seviyorum çünkü basit ve açık görünüyor. – newguy

4

sadece genel İstisna atma günü

if(!someMethod()) 
    throw new SomeException(); 

yazardı - yok. Bir istisna atmanızın sebebi, arayan kişiye istisnai bir şey meydana geldiğini söylemektir. Onlara neyi, ne arayanı ne de onun hakkında bir şeyler yapabileceklerini söylemek neredeyse her zaman faydalıdır. İki some codes..., muhtemelen yapmak için farklı istiyorsanız varsayarsak

+0

Haklısınız, ama sorduğum soru farklı bir sorudur, bu yüzden belirli bir excpetion ismini koymadım. – newguy

+1

Sadece işaret etmek için (! SomeMethod()) orijinal kodun – MadMurf

+0

ile devam edip edemeyeceğini sorun. Aslında sorun bundan daha karmaşıktır, lütfen değiştirilen kodlarıma bakın. – newguy

2

: Eğer


(varsayımsal olarak) bir var

boolean booleanValue = someCondition ? someMethod() : anotherMethod(); 
if(!booleanValue) { 
    throw new Exception(); 
} 

if(someCondition) { 
    // some code 
} else { 
    // some code 
} 

aynı if(someCondition) iseniz gerekli değildir Üçlü ifadelere izin vermeyen statik analiz aracı ile ilk satırları şu şekilde değiştirebilirsiniz:

boolean booleanValue; 
if(someCondition) { 
    booleanValue = someMethod(); 
} else { 
    booleanValue = anotherMethod(); 
} 
+0

ile aynı çözüm Bu benim için kötü kod stili. CheckStyle aşamasında başarısız olur. – newguy

+2

@newguy Peki, iyi kod stilinizin ne olduğunu tanımlamanız gerekecek; Bu kodla ilgili hiçbir sorunum yok –

+0

Projem, ilk satıra benzer kodlara izin vermeyen bir denetim stili eklentisi kullanmaktadır, dolayısıyla bu kurala uymak zorundayım. – newguy

1

bariz bir çözümdür. (Örneğin, istisnada daha iyi bir hata msg sağlayabilirsiniz.)

+0

Bu çözüm değil. İstediğim şey, kodun geri kalanının çalıştırılmasını istemediğim için, booleanValue atandıktan hemen sonra istisna atmak. – newguy

+0

@newguy: tekrar bakın, lütfen. İşte böyle. Benim tadı için biraz belirsiz olsa da. Joel ve Nils'ın verdiği cevabı tercih ederim. –

+0

@newguy: Bu çözüm size istediklerinizi veriyor. Şahsen ben tarzı sevmiyorum, ama muhtemelen en az düzenlenmiş fark ile çözüm. – Akusete

1

Hepsi çok öznel, belki de?

boolean booleanValue = aBoolean; 
if (someCondition) { 
    if (!someMethod()) { 
     throw new SomeException(); 
    } 
    some codes... 
} else { 
    if (!anotherMethod()) { 
    throw new AnotherException(); 
    } 
    some other codes... 
} 
1

En iyi çözüm olacaktır ...

if (someCondition) { 
    value = getPermission_1(); 

    if (!someMethod(value)) { 
    throw new SomeException(); 
    } 

    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 

    if (!anotherMethod(value)) { 
    throw new AnotherException(); 
    } 

    useValue_2(value); 
} 

Ve bir özel durum istiyorsanız o zaman beklenti olacağı için kod çoğaltma olarak baktığında gerektiğini sebeple istisna her durumda farklı olacaktır ve bu nedenle farklı bir İstisna veya her durumda farklı bir mesaj iletilmelidir.

Hangi koşulun yürütüldüğünü ve sonradan başarısız olduğunuzu bilmek istediğinizi farz edelim, çünkü geri döndüğünüz her şeyden bir boole ... Yöntem, başarısızlık nedenini muhtemelen bu konuda belirgin olmayacaktır. senaryo.

0

Bu tür kokular ... "kod kokusu" gibi. Bir dönüş değeri istisna haline dönüştürülüyor. Görünüşe göre, arayan kişi bazı Metod ve başka bir Metodu yazdıysa, çözüm bu yöntemleri yeniden yazmak ve bir dönüş değeri kullanmak yerine bu yöntemlerden istisna atmaktır. Ancak bu sadece programcının kodlara erişimi varsa. Üçüncü taraf bir API çağrısı ise, çevirinin gerçekleşmesi gerekebileceğini varsayalım.

İlgili konular