मेरी एक शर्त है
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)
{}