Bir şartım var
if(exists && !isDirectory || !exists)
{}
daha fazla anlaşılabilir olması için nasıl değiştirebilirim.
exists
ve isDirectory
her ikisi de doğrudur?
Bir şartım var
if(exists && !isDirectory || !exists)
{}
daha fazla anlaşılabilir olması için nasıl değiştirebilirim.
exists
ve isDirectory
her ikisi de doğrudur?
Yanıtlar:
||
değişmeli
if(!exists || (exists && !isDirectory))
eşdeğerdir.
Şimdi var olduğu için her zaman doğrudur, ikinci bölümünüzü ||
bırakabilirsiniz &&
:
if(!exists || !isDirectory)
Veya bir adım daha ileri gidip şunları yapabilirsiniz:
if(!(exists && isDirectory))
&&
öncekinin (en azından en iyi bilinen dillerde - istisnalar olabilir) olduğundan daha yüksek önceliğe sahip olmasıdır ||
. Böylece a && b || c
eşittir, (a && b) || c
ancak değildir a && (b || c)
.
!exists || !isDirectory
daha "anlaşılabilir", çünkü isDirectory
eğer doğru olamaz !exists
. Dolayısıyla bir insan olarak “eğer yoksa ya da [varsa ve bir dizin değil” diyeceğiz.
||
sadece yan etkisi olmayan değerlerde kullanılırsa değişimlidir - örneğin, işlevlerle birlikte kullanılıyorsa, bazı işlevler çağrılmayabilir (kısa devre yaptırma) veya farklı bir sırada farklı bir değer döndürme.
Bir süreç olarak bir doğruluk tablosu oluşturmayı öneriyorum:
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Bu basitçe NAND
işlemle eşleşir :
!(exists && isDirectory)
Tüm mantık geçitlerinizi hatırlamıyorsanız, wikipedia'nin gerçek tablolarla başlatılması için güzel bir referansı var .
@Hristoffer Hammarström, devlete bağlı isDirectory
olma durumu hakkında önemli bir noktaya geldi exists
. Aynı referansa başvurduklarını ve referansın bulunmadığı ve bir dizin olduğu bir duruma sahip olmanın mümkün olmadığını varsayarak , doğruluk tablosu aşağıdaki gibi yazılabilir:
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | n/a
1 | 0 | 1
1 | 1 | 0
Önemli n/a
olmayan bir durumu temsil etmek için kullanılır. Kabul edilebilir indirimler, 1
veya 0
ile sonuçlanan devletlerde sonuçlanabilir n/a
.
Bu düşünceyle, !(exists && isDirectory)
bir sonuçlanan hala geçerli bir azalma olduğu 1
için !e && d
.
Bununla birlikte, !isDirectory
sonuçta ortaya çıkan çok daha basit bir azalma 0
olacaktır !e && d
.
isDirectory
bağlı olduğunu anlamaktır exists
. Her ikisi de bir dizin olamaz ve olamaz.
n/a
, devletin ulaşmasının imkansız olduğu yerlerde doldurulmalı ve denklem buna göre azaltılmalıdır.
Daha iyi okunabilirlik için, boole koşullarını yöntemlere çıkarmak isterim:
if(fileNameUnused())
{...}
public boolean fileNameUnused() {
return exists && !isDirectory || !exists;
}
Veya daha iyi bir yöntem adıyla. Bu yöntemi doğru şekilde adlandırabilirseniz, kodunuzun okuyucusunun boolean koşulunun ne anlama geldiğini çözmesi gerekmez.
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Sadece tırnak deneyebilirsiniz no-go dava ve eğer gösterileri yukarı kurtarmak.
while(someCondition) {
if(exists && isDirectory)
continue;
// maybe "break", depends on what you're after.
// the rest of the code
}
ya da
function processFile(someFile)
{
// ...
if(exists && isDirectory)
return false;
// the rest of the code
// ...
}
Belirtildiği gibi bir doğruluk tablosu kullanabilirsiniz. İkinci adım , terim sayısını en aza indirgemek için bir KV haritası olabilir .
Boolean cebirinin yasalarını kullanmak başka bir yaklaşımdır:
A = var
B =! İsDirectory
! A =! Var
&& = *
|| = +
[Düzenle]
Daha basit bir dönüşüm, çünkü AND ve OR işlemleri karşılıklı olarak dağıtılıyor:
var &&! isDirectory || ! var
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Düzenle]
var &&! isDirectory || ! var
= A * B +! A
= A * B +! A * 1 // Kimlik
= A * B +! A * (B + 1) // Yok edici
= A * B +! A * B +! A / / Dağıtıcılık ve Kimlik
= B * (A +! A) +! A // Dağıtımcılık
= B * 1 +! A // Tamamlama 2
= B +! A // Kimlik
=! İsDirectory || ! mevcutsa
Veya çift tamamlayıcı ile (!! x = x):
A * B +! A
= !! (A * B +! A)
=! (! (A * B) * A)
=! ((!! A +! B) * A)
=! (! A * A + ! B * A)
=! (0 +! B * A)
=! (! B * A)
= B +! A
=! İsDirectory || ! mevcutsa
"!" Kullanmaktan hoşlanmıyorum. ifadesinde birden fazla koşul olduğunda. Daha okunaklı hale getirmek için kod satırları ekleyeceğim.
doesNotExist = !exists;
isFile = exists && !isDirecotry;
if (isFile || doesNotExist)
{}
Daha önce belirtildiği gibi, durum aşağıdakilere düşürülebilir:
if (!(exists && isDirectory))
Ancak, bir dizin olmanın varoluşu ima ettiğini iddia edeceğim. Eğer öyleyse, durumu şu şekilde azaltabiliriz:
if (!isDirectory)