मेरी एक शर्त है
if(exists && !isDirectory || !exists)
{}
मैं इसे कैसे संशोधित कर सकता हूं, ताकि यह अधिक समझ में आ सके।
exists
और isDirectory
दोनों सच हैं?
मेरी एक शर्त है
if(exists && !isDirectory || !exists)
{}
मैं इसे कैसे संशोधित कर सकता हूं, ताकि यह अधिक समझ में आ सके।
exists
और isDirectory
दोनों सच हैं?
जवाबों:
||
इतना सराहनीय है
if(!exists || (exists && !isDirectory))
समतुल्य है।
अब क्योंकि मौजूद है के दूसरे भाग में हमेशा सच है ||
आप ड्रॉप कर सकते हैं &&
:
if(!exists || !isDirectory)
या आप एक कदम और आगे बढ़ सकते हैं:
if(!(exists && isDirectory))
&&
इसकी उच्च मिसाल है (कम से कम ज्यादातर प्रसिद्ध भाषाओं में - इससे अधिक अपवाद हो सकते हैं ||
। इस प्रकार a && b || c
के बराबर है, (a && b) || c
लेकिन करने के लिए नहीं a && (b || c)
।
!exists || !isDirectory
यह अधिक "समझने योग्य" है, क्योंकि, isDirectory
अगर यह सच नहीं हो सकता है !exists
। इसलिए एक मानव के रूप में हम कहेंगे "यदि इसका अस्तित्व नहीं है या यह [अस्तित्व में है और यह] एक निर्देशिका नहीं है"।
||
यदि केवल साइड इफेक्ट्स के बिना मूल्यों पर उपयोग किया जाता है, तो यह सराहनीय है - यदि उदाहरण के लिए फ़ंक्शन के साथ उपयोग किया जाता है, तो कुछ फ़ंक्शन को कॉल नहीं किया जा सकता है (शॉर्ट-सर्किटिंग) या एक अलग क्रम में एक अलग मान लौटाएं।
एक प्रक्रिया के रूप में, मैं एक सत्य तालिका बनाने का सुझाव देता हूं:
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
यह NAND
ऑपरेशन से मेल खाता है , जो कि बस है:
!(exists && isDirectory)
यदि आपको अपने सभी लॉजिक गेट्स याद नहीं हैं, तो विकिपीडिया में बूट करने के लिए सत्य तालिकाओं के साथ एक अच्छा संदर्भ है ।
@Christoffer Hammarström की स्थिति के बारे में एक महत्वपूर्ण बिंदु पाला isDirectory
के राज्य से बंधा जा रहा है exists
। यह मानते हुए कि वे एक ही संदर्भ को संदर्भित करते हैं, और यह संभव नहीं है कि एक राज्य है जहां संदर्भ मौजूद नहीं है और एक निर्देशिका है, सत्य तालिका निम्नानुसार लिखी जा सकती है:
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | n/a
1 | 0 | 1
1 | 1 | 0
इसका n/a
उपयोग उस स्थिति का प्रतिनिधित्व करने के लिए किया जाता है जो मायने नहीं रखता है। स्वीकार्य कटौती के परिणामस्वरूप 1
या 0
राज्यों के लिए परिणाम हो सकते हैं n/a
।
इसे ध्यान में रखते हुए, !(exists && isDirectory)
अभी भी एक वैध कमी है, जिसके परिणामस्वरूप एक 1
है !e && d
।
हालांकि, !isDirectory
एक बहुत सरल कमी हो सकता है, जिसका परिणाम 0
के लिए !e && d
।
isDirectory
निर्भर करता है exists
। यह दोनों एक निर्देशिका नहीं हो सकता है और मौजूद नहीं है।
n/a
स्थानों से भरा होना चाहिए जहां राज्य को प्राप्त करना असंभव है, और समीकरण तदनुसार कम हो गया है।
बेहतर पठनीयता के लिए, मैं बूलियन स्थितियों को विधियों में निकालना पसंद करता हूं:
if(fileNameUnused())
{...}
public boolean fileNameUnused() {
return exists && !isDirectory || !exists;
}
या एक बेहतर विधि नाम के साथ। यदि आप इस विधि को ठीक से नाम दे सकते हैं, तो आपके कोड के पाठक को यह पता लगाने की आवश्यकता है कि बूलियन स्थिति का क्या मतलब है।
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
आप बस नो-गो केस को नाकाम करने की कोशिश कर सकते हैं और यदि वह दिखाता है तो जमानत दे सकता है।
while(someCondition) {
if(exists && isDirectory)
continue;
// maybe "break", depends on what you're after.
// the rest of the code
}
या और भी
function processFile(someFile)
{
// ...
if(exists && isDirectory)
return false;
// the rest of the code
// ...
}
आप एक सत्य तालिका का उपयोग कर सकते हैं जैसा कि बताया गया है। दूसरा चरण शब्दों की संख्या को कम करने के लिए केवी-मैप हो सकता है ।
बूलियन बीजगणित के नियमों का उपयोग करना एक और दृष्टिकोण है:
A = मौजूद है
B =! IsDirectory
! A =! मौजूद है
&& = *
|| = +
[संपादित करें]
एक सरल रूपान्तरण, क्योंकि संचालन और या पारस्परिक रूप से वितरण हैं:
मौजूद है & amp; isDirectory || मौजूद!
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Edit
मौजूद है & amp; isDirectory || मौजूद!
= A * B +! A
= A * B +! A * 1 // पहचान
= A * B +! A * (B + 1) // Annihilator
= A * B +! A * B +! A / / वितरण और पहचान
= B * (A +! A) +! A // वितरण
= B * 1 +! A // पूरक 2
= B +! A // पहचान
=! IsDirectory !! !मौजूद
या दोहरे पूरक के साथ (!! 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
=! IsDirectory !! !मौजूद
मैं "का उपयोग करना पसंद नहीं करता!" जब अभिव्यक्ति में एक से अधिक स्थितियां हों। मैं इसे और अधिक पठनीय बनाने के लिए कोड की पंक्तियों को जोड़ूंगा।
doesNotExist = !exists;
isFile = exists && !isDirecotry;
if (isFile || doesNotExist)
{}