සංවර්ධකයා අවධාරනය කරන්නේ ප්‍රකාශයන් ප්‍රතික්ෂේප කළ කොන්දේසි නොතිබිය යුතු අතර සෑම විටම වෙනත් වාරණයක් තිබිය යුතු බවයි


175

මට වඩා හඳුනන, මට වඩා පළපුරුදු සංවර්ධකයෙක් සිටී. අපි කතා කළේ ක්‍රමලේඛන භාවිතයන් ගැන වන අතර, 'if' ප්‍රකාශ පිළිබඳ ඔහුගේ ප්‍රවේශය නිසා මම නොසන්සුන් විය. මා පවසන ප්‍රකාශයන් අමුතු දෙයක් ලෙස සලකන්නේ නම් ඔහු සමහර පරිචයන් අවධාරනය කරයි.

පළමුවෙන්ම , if ප්‍රකාශයක් වෙනත් ප්‍රකාශයක් අනුගමනය කළ යුතුය, එයට යමක් දැමිය යුතුද නැද්ද යන්න. මේ වගේ කේත වලට මඟ පෙන්වන:

if(condition) 
{
    doStuff();
    return whatever;
}
else
{
}

දෙවනුව , අසත්‍යයට වඩා සත්‍ය සාරධර්ම පරීක්ෂා කිරීම වඩා හොඳය. එයින් අදහස් වන්නේ '! දොර විවෘත' විචල්‍යය වෙනුවට 'දොර වසා ඇති' විචල්‍යයක් පරීක්ෂා කිරීම වඩා හොඳ බවයි

ඔහුගේ තර්කය වන්නේ කේතය කරන්නේ කුමක්ද යන්න එය පැහැදිලි කරයි .

එමඟින් මා තරමක් ව්‍යාකූල වේ, එම නීති දෙකේ සංයෝජනයක් නිසා කොන්දේසිය සපුරා නොමැති විට ඔහුට යමක් කිරීමට අවශ්‍ය නම් මේ ආකාරයේ කේතයක් ලිවීමට ඔහුට හැකි වේ.

if(condition)
{
}
else
{
    doStuff();
    return whatever;
}

මේ පිළිබඳ මගේ හැඟීම නම් එය සැබවින්ම ඉතා කැත සහ / හෝ ගුණාත්මකභාවය වැඩිදියුණු කිරීම නොසැලකිලිමත් බවය. නමුත් කනිෂ් As යෙකු ලෙස මගේ සහජ බුද්ධිය සැක කිරීමට මම පෙළඹෙමි.

ඉතින් මගේ ප්‍රශ්න නම්: එය හොඳ / නරක / "ප්‍රශ්නයක් නොවේ" පුහුණුවක් ද? එය සාමාන්‍ය සිරිතක්ද?



57
ඔබේ සහායකයා ජීවිතය හා අවයව අවදානමට ලක්විය හැකි පසුබිමකින් පැමිණිය හැකිද? කේත මත කූට ටොන් පරීක්ෂණයක් සහ ස්වයංක්‍රීය විශ්ලේෂණයක් සිදු කරන අතර එය වැරදියට තේරුම් ගැනීම යමෙකුගේ ජීවිතයට වචනාර්ථයෙන් අහිමි විය හැකි පද්ධතිවල මේ ආකාරයේ කරුණු කිහිපයක් මම දැක ඇති බව මම විශ්වාස කරමි.
jpmc26

11
ඔබේ සමාගමේ කේත විලාසිතාවේ මාර්ගෝපදේශය පවසන්නේ කුමක්ද?
Thorbj Rrn Ravn Andersen

4
ඔබගේ "දෙවනුව" ප්‍රශ්නයට අර්ධ ප්‍රතිචාරයක්. එක් ක්‍රියාකාරී බ්ලොක් එකක් දිගු වන අතර අනෙක කෙටි නම්, කෙටි බ්ලොක් එකට මුල් තැන දෙන කොන්දේසියක් පරීක්ෂා කරන්න, එවිට කේතය කියවීමේදී එය මඟ හැරීමට ඇති ඉඩකඩ අඩුය. එම කොන්දේසිය ප්‍රතික්ෂේප කිරීමක් විය හැකිය, නැතහොත් එය සත්‍යය සඳහා පරීක්ෂණයක් බවට නම් කිරීම.
ඊතන් බොල්කර්

9
"ඔබේ කේතය අතිරික්ත හා නිෂ් less ල ය, මා එය මකා දැමීමට / ප්‍රතිනිර්මාණය කිරීමට ඔබට අවශ්‍යද?"
BgrWorker

Answers:


189

පැහැදිලි elseවාරණය

පළමු රීතිය මඟින් කේතය දූෂණය වන අතර එය වඩාත් කියවිය නොහැකි හෝ අඩු දෝෂ සහිත වේ. ඔබේ සගයාගේ පරමාර්ථය - තත්වය තක්සේරු කළ හැකි බව සංවර්ධකයා හොඳින් දැන සිටි බව පෙන්වීමෙන් පැහැදිලි විය යුතුය false. පැහැදිලිව ප්‍රකාශ කිරීම හොඳ දෙයක් වන අතර, එවැනි පැහැදිළි බවක් අතිරේක කේත පේළි තුනක වියදමින් නොපැමිණිය යුතුය .

ifප්‍රකාශයක් අනිවාර්යයෙන්ම elseකිසිවක් හෝ කිසිවක් අනුගමනය නොකිරීම යන කාරණය ගැන මම සඳහන් නොකරමි : එය එකක් හෝ වැඩි ගණනක් අනුගමනය කළ හැකිය elif.

මෙම ඉදිරියේ returnප්රකාශයක් වඩාත් නරක අතට කරයි. elseවාරණය තුළ ක්‍රියාත්මක කිරීමට ඔබට ඇත්ත වශයෙන්ම කේතයක් තිබුණද , එය මේ ආකාරයෙන් කිරීමට වඩා කියවිය හැකිය:

if (something)
{
    doStuff();
    return whatever;
}

doOtherThings();
return somethingElse;

මෙමඟින් කේතය පේළි දෙකක් අඩු වන අතර elseවාරණය ඉවත් කරයි. ආරක්ෂක වගන්ති සියල්ලම ඒ ගැන ය.

කෙසේ වෙතත්, ඔබේ සගයාගේ තාක්‍ෂණයට අවකාශයක් නොමැති ගොඩගැසී ඇති කොන්දේසි සහිත කොටස්වල ඉතා නරක රටාවක් අර්ධ වශයෙන් විසඳිය හැකි බව සලකන්න:

if (something)
{
}
if (other)
{
}
else
{
}

පෙර කේතයේ, පළමු වාරණයෙන් පසු නිවැරදි රේඛා බිඳීමක් නොමැති වීම ifකේතය වැරදි ලෙස අර්ථ දැක්වීම ඉතා පහසු කරයි. කෙසේ වෙතත්, ඔබේ සගයාගේ රීතිය කේතය වැරදි ලෙස කියවීම වඩාත් අපහසු වන අතර පහසු විසඳුමක් වනුයේ නව රේඛාවක් එක් කිරීමයි.

සඳහා trueනොව, සඳහා පරීක්ෂා කරන්නfalse

දෙවන රීතිය යම් අර්ථයක් ඇති කළ හැකි නමුත් එහි වර්තමාන ස්වරූපයෙන් නොවේ.

විවෘත නොකළ දොරක් පරීක්ෂා කිරීමට වඩා සංවෘත දොරක් පරීක්ෂා කිරීම වඩා බුද්ධිමත් බව අසත්‍යයක් නොවේ . නිෂේධනයන් සහ විශේෂයෙන් කැදැලි ප්‍රතික්ෂේප කිරීම් සාමාන්‍යයෙන් තේරුම් ගැනීමට අපහසුය:

if (!this.IsMaster || (!this.Ready && !this.CanWrite))

එය විසඳීම සඳහා, හිස් කුට්ටි එකතු කරනවා වෙනුවට , අදාළ විට හෝ දේශීය විචල්‍යයන්හි අතිරේක ගුණාංග සාදන්න .

ඉහත කොන්දේසිය පහසුවෙන් කියවිය හැකි පරිදි සකස් කළ හැකිය:

if (this.IsSlave || (this.Synchronizing && this.ReadOnly))

172
හිස් කුට්ටි සෑම විටම මට වැරදි ලෙස පෙනේ. එය වහාම මගේ අවධානයට යොමු වනු ඇති අතර මම අසන්නේ 'ඇයි මෙතැන?'
නෙල්සන්

51
E නීල් කොන්දේසියක් නිෂේධනය කිරීම සඳහා අමතර CPU කාලයක් අවශ්‍ය නොවේ. X86 ට සම්පාදනය කරන ලද සී සඳහා පැනීමේ උපදෙස් JZ(ශුන්‍ය නම් පනින්න) if (foo)සිට JNZ(පැනීම ශුන්‍ය නොවේ නම් ) සඳහා මාරු කළ if (!foo)හැකිය.
8bittree

71
" පැහැදිලි නම් සහිත අතිරේක ගුණාංග සාදන්න ": ඔබට වසම පිළිබඳ ගැඹුරු විශ්ලේෂණයක් නොමැති නම්, මෙය දේශීය ගැටලුවක් විසඳීම සඳහා ගෝලීය විෂය පථය (මුල් පන්තිය) වෙනස් කිරීම විය හැකිය (නිශ්චිත ව්‍යාපාර රීතියක් යෙදීම). මෙහි කළ හැකි එක් දෙයක් නම්, "var isSlave =! This.IsMaster" වැනි අපේක්ෂිත තත්වය සමඟ දේශීය බූලියන් නිර්මාණය කිරීම සහ වෙනත් දේපල කිහිපයක් නිර්මාණය කරනවා වෙනුවට දේශීය බූලියන් සමඟ ඔබේ යෙදුම යොදන්න. එබැවින්, ලුණු ධාන්ය වර්ගයක් සමඟ උපදෙස් ලබාගෙන නව ගුණාංග නිර්මාණය කිරීමට පෙර වසම විශ්ලේෂණය කිරීමට යම් කාලයක් ගත කරන්න.
Machado

83
එය "කේත පේළි තුනක්" ගැන නොවේ, එය සුදුසු ප්‍රේක්ෂකයින් සඳහා ලිවීම ගැන ය (අවම වශයෙන් ක්‍රමලේඛනය පිළිබඳ මූලික අවබෝධයක් ඇති අයෙක්). ක ifදැනටමත් තත්ත්වය බොරු විය හැකි බව ගැන පැහැදිලි නම්, හෝ ඔබ විසින් ඒ සඳහා පරීක්ෂා කළ නොහැකි වනු ඇත. හිස් බ්ලොක් එකක් මඟින් දේවල් අඩු පැහැදිලි කරයි, වැඩි නොවේ, මන්ද කිසිදු පා er කයෙකු එය අපේක්ෂා කිරීමට පෙළඹී නැති නිසා, දැන් ඔවුන්ට එය නැවැත්විය හැකි ආකාරය ගැන සිතා බැලිය යුතුය.
හොබ්ස්

15
Mark මාක් අදහස් දැක්වීමට වඩා පැහැදිලි if (!commonCase) { handle the uncommon case },නැත.
පෝල්

62

පළමු රීතිය සම්බන්ධයෙන්, මෙය නිෂ් less ල ටයිප් කිරීම සඳහා උදාහරණයකි. එය ටයිප් කිරීමට වැඩි කාලයක් ගත කරනවා පමණක් නොව, කේතය කියවන ඕනෑම කෙනෙකුට එය විශාල ව්‍යාකූලත්වයක් ඇති කරයි. කේතය අවශ්‍ය නොවේ නම් එය ලියන්න එපා. elseකේතය වාරණයෙන් ආපසු පැමිණෙන විට මෙය ඔබේ නඩුවේ ජනගහනයක් නොමැති වීම දක්වා විහිදේ if:

if(condition) 
{
    doStuff();
    return whatever;
}

doSomethingElse(); // no else needed
return somethingelse;

දෙවන කරුණ සම්බන්ධයෙන්, negative ණාත්මක අඩංගු බූලියන් නම් වළක්වා ගැනීම හොඳ ය:

bool doorNotOpen = false; // a double negative is hard to reason
bool doorClosed = false; // this is much clearer

කෙසේ වෙතත්, ඔබ පෙන්වා දෙන පරිදි, නැවත සෘණාත්මකව පරීක්ෂා නොකිරීමට මෙය දිගු කිරීම වඩාත් නිෂ් less ල ටයිප් කිරීමට හේතු වේ. පහත දැක්වෙන්නේ හිස් ifකොටසකට වඩා පැහැදිලි ය :

if(!condition)
{
    doStuff();
    return whatever;
}

122
ඉතින් ... ද්විත්ව negative ණාත්මක බවක් නැතැයි ඔබට පැවසිය හැකිද? ;)
Patsuan

6
At පැට්සුආන්, ඉතා දක්ෂයි. මම ඒකට කැමතියි. :)
ඩේවිඩ් ආර්නෝ

4
ප්‍රතිලාභ සමඟ වෙනත් ආකාරයකින් හැසිරවිය යුත්තේ කෙසේද යන්න පිළිබඳව බොහෝ අය එකඟ නොවනු ඇතැයි මට හැඟේ, තවද සෑම අවස්ථාවකම එය හැසිරවිය යුතු නැතැයි සමහරු පැවසිය හැකිය. මට මනාප මනාපයක් නැත, නමුත් වෙනත් බොහෝ ක්‍රම පිටුපස ඇති තර්කය මට නිසැකවම දැකිය හැකිය.
ඩුකලින්

6
පැහැදිලිවම, if (!doorNotOpen)භයානක ය. එබැවින් නම් හැකි තරම් ධනාත්මක විය යුතුය. if (! doorClosed)පරිපූර්ණයි.
ඩේවිඩ් ෂ්වාට්ස්

1
ඔබගේ දොර උදාහරණය සම්බන්ධයෙන්, උදාහරණ නම් දෙක අනිවාර්යයෙන්ම සමාන නොවේ. භෞතික ලෝකයේ විවෘත හා සංවෘත වීම අතර සංක්‍රාන්ති තත්වයක් ඇති බැවින් doorNotOpenඑය සමාන නොවේ doorClosed. මගේ කාර්මික යෙදීම්වල සෑම විටම මෙය පෙනෙන්නේ බූලියන් තත්වයන් භෞතික සංවේදක මගින් තීරණය වන බැවිනි. ඔබට දොරේ විවෘත පැත්තේ තනි සංවේදකයක් තිබේ නම් ඔබට කිව හැක්කේ දොර විවෘතව හෝ විවෘතව නොමැති බවය. ඒ හා සමානව සංවේදකය සංවෘත පැත්තේ තිබේ නම්, ඔබට කිව හැක්කේ වසා ඇති හෝ වසා නොමැති බව පමණි. සංවේදකය විසින්ම තාර්කික තත්වය තහවුරු කරන්නේ කෙසේද යන්න තීරණය කරයි.
පීටර් එම්

45

1. හිස් elseප්‍රකාශයන්ට පක්ෂව තර්කයක් .

මම බොහෝ විට එම පළමු ඉදිකිරීමට සමාන යමක් හිස් (වෙනත්) භාවිතා කරමි. එය කේතයේ පා readers කයන්ට සං human ා කරයි (මානව හා ස්වයංක්‍රීය විශ්ලේෂණ මෙවලම්) ක්‍රමලේඛකයා විසින් යම් තත්වයක් පිළිබඳව යම් අදහසක් තබා ඇති බව. නොපැමිණෙන elseප්‍රකාශයන් නිසා මිනිසුන් මිය ගොස්, වාහන අනතුරට ලක්ව ඇති අතර ඩොලර් මිලියන ගණනක් වැය වී තිබේ. නිදසුනක් ලෙස, මිස්රා-සී, අවම වශයෙන් අදහස් දැක්වීමක් නියම කර ඇති අතර, අතුරුදහන් වූ අවසාන කොටස if (condition_1) {do_this;} else if (condition_2) {do_that;} ... else if (condition_n) {do_something_else;}අනුපිළිවෙලින් චේතනාන්විත ය . වෙනත් ඉහළ විශ්වසනීයත්ව ප්‍රමිතීන් ඊටත් වඩා ඉදිරියට යයි: කිහිපයක් හැරුණු විට, වෙනත් ප්‍රකාශයන් අතුරුදහන් වීම තහනම්ය.

එක් ව්‍යතිරේකයක් යනු සරල අදහස් දැක්වීමකි /* Else not required */. පේළි තුන හිස්ව ඇති ආකාරයටම මෙය එකම අභිප්‍රාය සං sign ා කරයි. එම හිස් වෙනත් අවශ්‍ය නොවන තවත් ව්‍යතිරේකයක් නම්, එය කේතයේ පා readers කයන්ට මෙන්ම ස්වයංක්‍රීයව විශ්ලේෂණ මෙවලම් වලට වඩා පැහැදිලිව පෙනෙන තැනකි. උදාහරණයක් ලෙස, if (condition) { do_stuff; return; }ඒ හා සමානව, හිස් එකක් අවශ්‍ය නොවේ නම් throw somethingහෝ goto some_label1 වෙනුවට return.

2. කැමති තර්කය සඳහා if (condition)වැඩි if (!condition).

මෙය මානව සාධක අයිතමයකි. සංකීර්ණ බූලියන් තර්කනය බොහෝ අය ඉහළට ගමන් කරයි. පළපුරුදු ක්‍රමලේඛකයෙකුට පවා සිතා බැලිය if (!(complex || (boolean && condition))) do_that; else do_this;යුතුය. අවම වශයෙන්, මෙය නැවත ලියන්න if (complex || (boolean && condition)) do_this; else do_that;.

3. හිස් thenප්‍රකාශයන්ට යමෙකු කැමති විය යුතු යැයි මින් අදහස් නොවේ .

දෙවන කොටස පවසන්නේ "ඔබ කැමති" යන්නට වඩා "කැමති" බවයි. එය රීතියකට වඩා මාර්ගෝපදේශයකි. ධනාත්මක ifකොන්දේසි වලට වැඩි කැමැත්තක් දැක්වීමට එම මාර්ගෝපදේශයට හේතුව කේතය පැහැදිලි සහ පැහැදිලි විය යුතුය. හිස් පසුව වගන්තියක් (උදා if (condition) ; else do_something;:) මෙය උල්ලං lates නය කරයි. එය අපැහැදිලි ක්‍රමලේඛයක් වන අතර, වඩාත් පළපුරුදු ක්‍රමලේඛකයින් පවා උපස්ථගත කර ifතත්වය එහි නිෂේධිත ස්වරූපයෙන් නැවත කියවීමට හේතු වේ. එබැවින් එය මුලින් ප්‍රතික්ෂේප කළ ස්වරූපයෙන් ලියා වෙනත් ප්‍රකාශය අතහරින්න (නැතහොත් හිස් එකක් තිබේ නම් හෝ එසේ කිරීමට අදහස් කරන්නේ නම් ඒ සඳහා අදහස් දක්වන්න).



1 මා ලිවූයේ එවිට අවසන් returnවන throwහෝ gotoවෙනත් හිස් අවශ්‍ය නොවන වගන්ති ය . අනෙක් වගන්තිය අවශ්‍ය නොවන බව පැහැදිලිය. නමුත් කුමක් ද goto? අනෙක් අතට, ආරක්ෂිත-විවේචනාත්මක ක්‍රමලේඛන රීති සමහර විට කලින් ආපසු පැමිණීමට ඉඩ නොදෙන අතර සෑම විටම පාහේ විසි කිරීම ව්‍යතිරේකයට ඉඩ නොදේ. කෙසේ වෙතත් ඒවා gotoසීමිත ස්වරූපයෙන් ඉඩ දෙයි (උදා. goto cleanup1;). මෙම සීමිත භාවිතය gotoසමහර ස්ථානවල වඩාත් කැමති පුරුද්දකි. නිදසුනක් ලෙස ලිනක්ස් කර්නලය එවැනි gotoප්‍රකාශයන්ගේ චොක්ෆුල් ය .


6
!පහසුවෙන් නොසලකා හරිනු ලැබේ. එය ඉතා වෙහෙසකරයි.
Thorbj Rrn Ravn Andersen

4
නැත, හිස් වෙනත් දෙයක් ක්‍රමලේඛකයා ඒ ගැන යම් අදහසක් තබා ඇති බව පැහැදිලි නොකරයි. එය වඩාත් ව්‍යාකූලත්වයට මඟ පාදයි "සමහර ප්‍රකාශ සැලසුම් කර තිබුණද ඒවා අමතක වී ඇත්ද? නැතහොත් හිස් වගන්තියක් ඇත්තේ මන්ද?" අදහස් දැක්වීමක් වඩා පැහැදිලිය.
සයිමන්

9
Im සිමොන්: සාමාන්‍ය ස්වරූපයක් else { /* Intentionally empty */ }හෝ එම රේඛා ඔස්සේ යමක්. නීතිමය උල්ලං .නයන් ගැන සිහියෙන් තොරව බලා සිටින ස්ථිතික විශ්ලේෂකය හිස් තැනින් සෑහීමකට පත්වේ. අදහස් දැක්වීම පා readers කයන්ට දැනුම් දෙන්නේ හිස් වෙනත් දේ හිතාමතා බවය. පළපුරුදු ක්‍රමලේඛකයෝ සාමාන්‍යයෙන් අදහස් දැක්වීම අනවශ්‍ය යැයි අතහරිති - නමුත් හිස් ඒවා නොවේ. ඉහළ විශ්වසනීයත්ව වැඩසටහන්කරණය යනු තමන්ගේම වසමකි. මෙම ඉදිකිරීම් බාහිර පුද්ගලයින්ට තරමක් අමුතු පෙනුමක්. මෙම ඉදිකිරීම් භාවිතා කරනුයේ දෘඩ තට්ටු පාසලෙන් පාඩම්, ජීවිතය හා මරණය හෝ $$$$$$$$$ අත ළඟ ඇති විට තට්ටු කිරීම නිසාය.
ඩේවිඩ් හැමන්

2
හිස් වෙනත් වගන්ති නොමැති විට වගන්ති කොතරම් හිස්දැයි මට තේරෙන්නේ නැත (අපි එම විලාසය තෝරා ගනිමු යැයි සිතමු). මට පේනවාif (target == source) then /* we need to do nothing */ else updateTarget(source)
බර්ගි

2
notB ThorbjørnRavnAndersen nope, C ++ හි ඇති ප්‍රධාන පදයකි, අනෙක් බිට්වේස් සහ තාර්කික ක්‍රියාකරුවන් මෙන්. විකල්ප ක්‍රියාකරු නිරූපණයන් බලන්න .
රුස්ලාන්

31

ඉතා දුර්ලභ අවස්ථාවන්හිදී මම හිස් වෙනත් ශාඛාවක් (සහ සමහර විට හිස් නම් ශාඛාවක්) භාවිතා කරමි: if සහ වෙනත් කොටස් කෙසේ හෝ හැසිරවිය යුතු බව පැහැදිලිව පෙනෙන විට, නමුත් සුළු නොවන හේතු නිසා නඩුව හැසිරවිය හැකිය කිසිවක් නොකර. එබැවින් අවශ්‍ය වෙනත් ක්‍රියාමාර්ගයක් සමඟ කේතය කියවන ඕනෑම කෙනෙකුට යමක් නැතිවී ඇති බවට වහාම සැක කර ඔවුන්ගේ කාලය නාස්ති කරනු ඇත.

if (condition) {
    // No action needed because ...
} else {
    do_else_action()
}

if (condition) {
    do_if_action()
} else {
    // No action needed because ...
}

නමුත් එසේ නොවේ:

if (condition) {
    do_if_action()
} else {
    // I was told that an if always should have an else ...
}

5
මෙය. එම ප්‍රකාශය if test succeeds -> no action needed -> else -> action neededඅර්ථ නිරූපණයට වඩා බෙහෙවින් වෙනස් බව මට පෙනේ if it applies that the opposite of a test outcome is true then an action is needed. මාටින් ෆෝලර්ගේ උපුටා දැක්වීම මට මතක් වේ: "ඕනෑම කෙනෙකුට කේත පරිගණක ලිවිය හැකිය; හොඳ ක්‍රමලේඛකයින් මිනිසුන්ට තේරුම් ගත හැකි කේත ලියයි".
Tasos Papastylianou

2
@TasosPapastylianou එය වංචාවකි. 'පරීක්ෂණය සාර්ථක වුවහොත් -> කිසිදු ක්‍රියාවක් අවශ්‍ය නොවේ' යනු 'පරීක්ෂණය සාර්ථක නොවන්නේ නම් -> ක්‍රියාව අවශ්‍ය වේ' යන්නයි. ඔබ එය වචන 10 කින් පමණ පුරවා ඇත.
ජෙරී බී

Er ජෙරීබී එය "පරීක්ෂණය" මත රඳා පවතී. සමහර විට ප්‍රතික්ෂේප කිරීම (භාෂාමය වශයෙන්) සරල ය, නමුත් සමහර විට එය එසේ නොවන අතර එය ව්‍යාකූලත්වයට හේතු වේ. එවැනි අවස්ථාවන්හිදී, "ප්‍රති come ලය සත්‍ය වීම ප්‍රතික්ෂේප කිරීම / ප්‍රතිවිරුද්ධ දෙය" සහ "ප්‍රති" ලය සත්‍ය නොවීම "ගැන කථා කිරීම වඩාත් පැහැදිලිය. කෙසේ වෙතත් කාරණය වන්නේ 'හිස්' පියවරක් හඳුන්වා දීම හෝ විචල්ය නාමවල අර්ථය හරවා යැවීම ඊටත් වඩා පැහැදිලි වනු ඇත. මෙය "ඩි මෝගන්" තත්වයන් තුළ සාමාන්‍ය වේ: උදා: if ((missing || corrupt) && !backup) -> skip -> else do stuffif ((!missing && !corrupt) || backup) -> do stuff
ටසෝස් පැපස්ටිලියානූ

1
AsTasosPapastylianou ඔබට ලිවීමට if(!((missing || corrupt) && !backup)) -> do stuffහෝ වඩා හොඳට ලිවිය හැකිය if((aviable && valid) || backup) -> do stuff. (නමුත් සැබෑ උදාහරණයකින් එය භාවිතා කිරීමට පෙර උපස්ථය වලංගු දැයි පරීක්ෂා කර බැලිය යුතුය)
12431234123412341234123

2
AsTasosPapastylianou මා කී දෙයින් ද්විත්ව නිෂේධනයක් ඇත්තේ කොහේද? නිසැකවම, ඔබ විචල්ය නාමයක් ලෙස නිරුපද්‍රිතව භාවිතා කරන්නේ නම් ඔබට පැහැදිලි කරුණක් ඇත. ඔබ මේ වගේ මිශ්‍ර බූලියන් ක්‍රියාකරුවන් වෙත පැමිණි විට, භාවිතා කිරීමට තාවකාලික විචල්‍යයන් තිබීම වඩා හොඳ විය හැකිය if: file_ok = !missing && !corrupt; if(file_ok || backup) do_stuff();මට පෞද්ගලිකව දැනෙන එය වඩාත් පැහැදිලි කරයි.
බෝල්ඩ්රික්

22

අනෙක් සියල්ලම සමාන වීම, සංක්ෂිප්තතාවයට වැඩි කැමැත්තක් දක්වන්න.

ඔබ ලියන්නේ නැති දේ කිසිවෙකුට කියවා තේරුම් ගත යුතු නැත.

පැහැදිළි වීම ප්‍රයෝජනවත් විය හැකි නමුත්, එය එසේ වන්නේ ඔබ ලිවූ දෙය සැබවින්ම ඔබට ලිවීමට අවශ්‍ය දේ බව අනවශ්‍ය වාචිකතාවයකින් තොරව පැහැදිලි වුවහොත් පමණි.


එබැවින් හිස් අතු වළක්වා ගන්න, ඒවා නිෂ් less ල පමණක් නොව අසාමාන්‍ය වන අතර එමඟින් ව්‍යාකූලත්වයට මග පාදයි.

ඔබ ශාඛාවෙන් කෙළින්ම පිටව ගියහොත් වෙනත් ශාඛාවක් ලිවීමෙන් වළකින්න.

පැහැදිලිකිරීමේ ප්‍රයෝජනවත් යෙදුමක් වනුයේ ඔබ ස්විච්-නඩු හරහා වැටෙන සෑම විටම // FALLTHRUඅදහස් දැක්වීම සහ ඔබට හිස් ප්‍රකාශයක් අවශ්‍ය තැනක අදහස් දැක්වීමක් හෝ හිස් බ්ලොක් එකක් භාවිතා කිරීමයි for(a;b;c) /**/;.


7
// FALLTHRUඅහ්, තිරගත කිරීමේ කැප්ස් වල හෝ txtspk කෙටි යෙදුම් සමඟ නොවේ. එසේ නොමැතිනම්, මම මෙම පුරුද්දට එකඟ වී අනුගමනය කරමි.
කෝඩි ග්‍රේ

7
Ody කෝඩි ග්‍රේ - මෙය SHOUTING හොඳ අදහසක් ඇති එක් ස්ථානයකි. බොහෝ ස්විච් ප්‍රකාශයන් එක් එක් සිද්ධිය සමඟ අවසන් වේ break. එය ලබා ගැනීමට අපොහොසත් වීම breakසමහර දර්ශනීය මෘදුකාංග අසාර්ථක වීමට හේතු වී තිබේ. පහත වැටීම හිතාමතා යැයි කේතය පා readers කයන්ට shout ෝෂා කරන අදහස් දැක්වීම හොඳ දෙයකි. එම ස්ථිතික විශ්ලේෂණ මෙවලම් වලට මෙම නිශ්චිත රටාව සෙවිය හැකි අතර තත්වය හරහා වැටීමක් ගැන පැමිණිලි නොකිරීම එය ඊටත් වඩා හොඳ දෙයක් බවට පත් කරයි.
ඩේවිඩ් හැමන්

1
Oss නම: මම දැන් මගේ පරීක්‍ෂා කළ vimඅතර එහි කිසිදු වෙනසක් හඳුනා නොගනී FALLTHRU. මම හිතන්නේ, හොඳ හේතුවක් නිසා: TODOසහ FIXMEඅදහස් දැක්වීම් යනු අශෝභන විය යුතු අදහස් වන git grepඅතර, ඔබේ කේතයේ ඔබ දන්නා දන්නා අඩුපාඩු මොනවාද සහ ඒවා පිහිටා ඇත්තේ කොහේදැයි විමසීමට ඔබට අවශ්‍ය නිසාය . කඩාවැටීම අඩුපාඩුවක් නොවන අතර, ඒ සඳහා කෙඳිරිගාමින් සිටීමට හේතුවක් නැත.
cmaster - මොනිකා

4
Av ඩේවිඩ් හැමන් නැත, කෑ ගැසීම හොඳ අදහසක් නොවේ: අපේක්ෂිත විවේකයක් වෙනුවට ඔබට // පසුබෑමක් තිබේ නම්, එය ඕනෑම සංවර්ධකයෙකුට වහාම තේරුම් ගැනීමට ප්‍රමාණවත් විය යුතුය. එසේම, // කඩාවැටීම අඩුපාඩුවක් ගැන කතා නොකරයි, එය හුදෙක් සං als ා කරන්නේ තත්වයන් සලකා බැලූ බවත්, විවේකය බවත්; එය අතුරුදහන් වී ඇති බව පෙනේ, ඇත්ත වශයෙන්ම එහි නොසිටීමට අදහස් කෙරේ. මෙය තනිකරම තොරතුරු දැනගැනීමේ අරමුණක් වන අතර කෑ ගැසීමට කිසිවක් නැත.
cmaster -

1
macmaster - කෑ ගැසීම හොඳ අදහසක් නොවන බව ඔබේ මතයයි. අනෙක් අයගේ අදහස් වෙනස් වේ. නිසා පමනක් ඔබගේ විම් වින්යාසය හඳුනාගන්නේ නැත FALLTHRUඅන් අය එසේ කිරීමට විම් සකසා නොමැති බව ඉන් අදහස් කරන්නේ නැහැ.
ඩේවිඩ් හැමන්

6

IF ප්‍රකාශයක් සඳහා ධනාත්මක හෝ negative ණාත්මක කොන්දේසි පිළිබඳ දැඩි හා වේගවත් රීතියක් නොමැත, මගේ දැනුමට අනුව නොවේ. මම පෞද්ගලිකව වඩාත් සුදුසු වන්නේ negative ණාත්මක අවස්ථාවකට වඩා ධනාත්මක නඩුවක් සඳහා කේතීකරණයට ය. හිස් IF බ්ලොක් එකක් සෑදීමට එය මග පෙන්වන්නේ නම්, පසුව තර්කානුකූලව පිරුණු ELSE එකක් අනුගමනය කළ හොත් මම මෙය නොකරමි. එවැනි තත්වයක් ඇති වුවහොත්, එය කෙසේ හෝ ධනාත්මක නඩුවක් සඳහා නැවත පරීක්ෂා කිරීම සඳහා තත්පර 3 ක් වැනි කාලයක් ගතවනු ඇත.

ඔබගේ උදාහරණ ගැන මම ඇත්තටම අකමැති වන්නේ හිස් ELSE විසින් ගන්නා ලද සම්පූර්ණයෙන්ම අනවශ්‍ය සිරස් අවකාශයයි. මෙය කිරීමට කිසිදු හේතුවක් නැත. එය තර්කනයට කිසිවක් එකතු නොකරයි, කේතය කරන්නේ කුමක්ද යන්න ලේඛනගත කිරීමට එය උදව් නොකරයි, එය කියවීමේ හැකියාව කිසිසේත් වැඩි නොකරයි. ඇත්ත වශයෙන්ම, එකතු කරන ලද සිරස් අවකාශය කියවීමේ හැකියාව අඩු කළ හැකි යැයි මම තර්ක කරමි .


2
එම අනවශ්‍ය සිරස් අවකාශය සෑම විටම වරහන් භාවිතා කිරීම, වෙනත් දේ අතුරුදහන් වීම තහනම් කිරීම සහ ඉන්ඩෙන්ටේෂන් සඳහා ඕල්මන් ශෛලිය භාවිතා කිරීම සඳහා වූ වරමෙහි ප්‍රති ence ලයකි.
ඩේවිඩ් හැමන්

හොඳයි, සෑම විටම වරහන් භාවිතා කිරීම හොඳ දෙයක් යැයි මම සිතමි, මන්ද එය සංවර්ධකයින්ගේ අභිප්‍රායන් පැහැදිලි කරයි - ඔවුන්ගේ කේතය කියවන විට අනුමාන කිරීමට ඉඩක් නැත. එය මෝඩකමක් ලෙස පෙනෙන්නට තිබුණත්, මාව විශ්වාස කරන්න, විශේෂයෙන් කනිෂ් develop සංවර්ධකයින්ට උපදෙස් දෙන විට, වරහන් අතුරුදහන් වීම සම්බන්ධ වැරදි සිදු වේ. මම පෞද්ගලිකව කිසි විටෙකත් ඕල්මන් විලාසිතාවේ ඉන්ඩෙන්ටේෂන් හි රසිකයෙක් නොවෙමි, ඔබ සඳහන් කළ හේතුව නිසාම: අනවශ්‍ය සිරස් අවකාශය. නමුත් එය මගේ මතය සහ පෞද්ගලික ශෛලිය පමණි. එය මා මුලින් ඉගෙන ගත් දෙයයි, එබැවින් එය කියවීමට වඩාත් පහසුවක් දැනේ.
ලැන්ග්ක්‍රූ

පුද්ගලික විලාසිතාව: මම කුමන වරහන් විලාසය භාවිතා කළත් (Allman, 1TB, ...), මම සෑම විටම වරහන් භාවිතා කරමි.
ඩේවිඩ් හැමන්

සංකීර්ණ කොන්දේසි හෝ තේරුම් ගැනීමට අපහසු යැයි ඔබ සිතන ඒවා සෑම විටම පාහේ විසඳා ගත හැක්කේ ඔවුන්ගේම ක්‍රමවේදයන් / ක්‍රියාකාරකම් වලට නැවත සාධක කිරීමෙන් ය. මේ වගේ දෙයක් if(hasWriteAccess(user,file))යටින් සංකීර්ණ විය හැකි නමුත් බැලූ බැල්මට එහි ප්‍රති result ලය කුමක් විය යුතුදැයි ඔබ හරියටම දන්නවා. එය කොන්දේසි කිහිපයක් පමණක් වුවද, උදා: if(user.hasPermission() && !file.isLocked())සුදුසු නමක් සහිත ක්‍රම ඇමතුමකින් කාරණය වටහා ගත හැක, එබැවින් නිෂේධනීය කාරණා අඩු වේ.
ක්‍රිස් ෂ්නයිඩර්

එකඟ විය. නැවත වරක්, මම හැකි සෑම විටම ප්‍රතිනිර්මාණය කිරීමේ විශාල රසිකයෙක් වෙමි :)
ලැන්ග්‍රෙක්

5

පැහැදිලි elseවාරණය

සියලු ප්‍රකාශ ආවරණය වන පරිදි ifහිස් ප්‍රකාශයක් ලෙස මම මෙය එකඟ නොවෙමි, නමුත් elseපුරුද්දෙන් බැහැරව එකතු කිරීම හොඳ දෙයකි.

ifප්රකාශය, මගේ මතකයට, ඇත්තටම වෙනස් කාර්යයන් දෙකක් ආවරණය කරයි.

අපට යමක් කිරීමට අවශ්‍ය නම් එය මෙහි කරන්න.

මේ වගේ දේවල් වලට පැහැදිලිවම කොටසක් අවශ්‍ය නැහැelse .

    if (customer.hasCataracts()) {
        appointmentSuggestions.add(new CataractAppointment(customer));
    }
    if (customer.isDiabetic()) {
        customer.assignNurse(DiabeticNurses.pickBestFor(customer));
    }

සමහර අවස්ථාවලදී එකතු කිරීමක් ඉල්ලා සිටීම elseනොමඟ යැවිය හැකිය.

    if (k > n) {
        return BigInteger.ZERO;
    }
    if (k <= 0 || k == n) {
        return BigInteger.ONE;
    }

නොවන ලෙස එම

    if (k > n) {
        return BigInteger.ZERO;
    } else {
        if (k <= 0 || k == n) {
            return BigInteger.ONE;
        }
    }

එය ක්‍රියාකාරීව සමාන වුවද. පළමුවැන්න ifහිස්ව ලිවීම elseඅනවශ්‍ය ලෙස කැත වන දෙවන ප්‍රති result ලයට ඔබව යොමු කරයි.

අපි නිශ්චිත තත්වයක් සඳහා පරික්ෂා කරන්නේ නම්, එම සිදුවීම elseආවරණය කිරීමට ඔබට මතක් කිරීම සඳහා හිස් එකක් එකතු කිරීම බොහෝ විට හොඳ අදහසකි

        // Count wins/losses.
        if (doors[firstChoice] == Prize.Car) {
            // We would have won without switching!
            winWhenNotSwitched += 1;
        } else {
            // We win if we switched to the car!
            if (doors[secondChoice] == Prize.Car) {
                // We picked right!
                winWhenSwitched += 1;
            } else {
                // Bad choice.
                lost += 1;
            }
        }

මෙම නීති අදාළ වන්නේ ඔබ නව කේතයක් ලියන විට පමණක් බව මතක තබා ගන්න . IMHO පිරික්සීමට පෙර හිස් elseවගන්ති ඉවත් කළ යුතුය.


සඳහා trueනොව, සඳහා පරීක්ෂා කරන්නfalse

නැවතත් මෙය සාමාන්‍ය මට්ටමින් හොඳ උපදෙස් වන නමුත් බොහෝ අවස්ථාවලදී මෙය කේතය අනවශ්‍ය ලෙස සංකීර්ණ වන අතර කියවිය නොහැකි තරම් අඩු කරයි.

කේතය කැමති වුවත්

    if(!customer.canBuyAlcohol()) {
        // ...
    }

යනු පා er කයාට විහිළුවක්, නමුත් එය සෑදීමයි

    if(customer.canBuyAlcohol()) {
        // Do nothing.
    } else {
        // ...
    }

අවම වශයෙන් නරක නම්, නරක නොවේ නම්.

මම මීට වසර ගණනාවකට කලින් BCPL මත ලියවුණු හා එම භාෂාවෙන් එහි දී ය IFවගන්තිය සහUNLESSකොපමණ වැඩියෙන් ඔබ readably ලෙස කේතය හැකි නිසා වගන්තිය:

    unless(customer.canBuyAlcohol()) {
        // ...
    }

එය සැලකිය යුතු ලෙස වඩා හොඳ නමුත් තවමත් පරිපූර්ණ නොවේ.


මගේ පෞද්ගලික ක්‍රියාවලිය

පොදුවේ ගත් කල, මම නව කේතයක් ලියන විට බොහෝ විට ප්‍රකාශයක් සඳහා හිස් elseබ්ලොක් එකක් එකතු ifකරමි. මෙය මට DFSඋගුලෙන් බේරීමට උපකාරී වන අතර කේතය සමාලෝචනය කරන විට තවත් බොහෝ දේ ඇති බව මම දනිමි. කෙසේ වෙතත්, මම සාමාන්‍යයෙන් TODOඅදහස් දැක්වීමක් එකතු කරමි .

  if (returnVal == JFileChooser.APPROVE_OPTION) {
    handleFileChosen();
  } else {
    // TODO: Handle case where they pressed Cancel.
  }

elseබොහෝ විට කේත සුවඳක් දැක්විය හැකි බැවින් මම සාමාන්‍යයෙන් මගේ කේතයේ භාවිතා කරන්නේ කලාතුරකිනි.


ඔබ "හිස්" කොටස් හසුරුවන්නේ thngs ක්‍රියාත්මක කිරීමේදී සම්මත ස්ටබ් අවුට් කේතය වැනි කියවීමකි ...
Deduplicator

මෙම unlessවාරණ හොඳ යෝජනාවක් වන අතර, කිසිසේත් BCPL සීමා.
tchrist

@TobySpeight අපොයි. එය කෙසේ හෝ මගේ අවධානයෙන් ගැලවී ගියේ මා ලියා ඇති දේ ...ඇත්ත වශයෙන්ම ය return. (ඇත්ත වශයෙන්ම, සමඟ k=-1, n=-2පළමු ආපසු ගැනීම ගනු ලැබේ, නමුත් මෙය බොහෝ දුරට වැදගත් වේ.)
ඩේවිඩ් රිචර්බි

නූතන පර්ල් සතුව ifසහ unless. එපමණක්ද නොව, එය ප්‍රකාශයකින් පසුවද මේවාට ඉඩ දෙයි, එබැවින් ඔබට පැවසිය හැකිය print "Hello world!" if $born;හෝ print "Hello world!" unless $dead;දෙදෙනාම ඔවුන් සිතන දේ හරියටම කරනු ඇත.
CVn

1

පළමු කරුණ සඳහා, IF ප්‍රකාශයන් මේ ආකාරයෙන් භාවිතා කිරීමට බල කරන භාෂාවක් මම භාවිතා කර ඇත්තෙමි (ඔපල් හි, ප්‍රධාන රාමු පද්ධති සඳහා GUI ඉදිරිපස කෙළවරක් තැබීම සඳහා මේන්ෆ්‍රේම් තිර සීරීමට පිටුපස ඇති භාෂාව), සහ IF සඳහා එක් පේළියක් පමණක් ඇත සහ එල්එස්ඊ. එය ප්‍රසන්න අත්දැකීමක් නොවේ!

ඕනෑම සම්පාදකයෙකු එවැනි අතිරේක ELSE වගන්ති ප්‍රශස්ත කරනු ඇතැයි මම බලාපොරොත්තු වෙමි. නමුත් සජීවී කේතය සඳහා එය කිසිවක් එකතු නොකරයි (සංවර්ධනයේදී එය වැඩිදුර කේත සඳහා ප්‍රයෝජනවත් සලකුණු කාරකයක් විය හැකිය).

CASE / WHEN වර්ගයේ සැකසුම් භාවිතා කරන විට මම මෙම අමතර වගන්ති වැනි දෙයක් භාවිතා කරන කාලයක් වේ. හිස් වුවත් මම සෑම විටම පෙරනිමි වගන්තියක් එක් කරමි. මෙය භාෂාවන්ගෙන් දිගු කාලීන පුරුද්දක් වන අතර එවැනි වගන්තියක් භාවිතා නොකළහොත් එය වැරදියට වැටෙනු ඇති අතර දේවල් සැබවින්ම අතහැර දැමිය යුතුද යන්න ගැන සිතීමට බල කරයි.

බොහෝ කලකට පෙර මේන්ෆ්‍රේම් (උදා: පීඑල් / 1 සහ කෝබෝල්) පුහුණුව negative ණාත්මක චෙක්පත් අඩු කාර්යක්ෂමතාවයක් ඇති බව පිළිගෙන ඇත. ක්ෂුද්‍ර ප්‍රශස්තිකරණය ලෙස නොසලකා හරින ලද මේ දිනවල වඩා වැදගත් කාර්යක්ෂමතා ඉතිරියක් ඇති නමුත් මෙය 2 වන කරුණ පැහැදිලි කළ හැකිය.

එවැනි සරල IF ප්‍රකාශයක් මත එතරම් ප්‍රමාණවත් නොවුවද, තර්කනය අඩු කියවිය හැකි ය.


2
මම මෙය දැක වූ යම් අවස්ථාවක දී සාමාන්ය සිරිතකි.
පැට්සුආන්

At පැට්සුආන් - ඔව්, යම් දුරකට. කාර්ය සාධන විවේචනාත්මක කේත සඳහා මේන්ෆ්‍රේම් එකලස් කිරීම බරපතල විකල්පයක් වූ විට එය එසේ විය.
කික්ස්ටාර්ට්

1
"බොහෝ කලකට පෙර ... negative ණාත්මක චෙක්පත් අඩු කාර්යක්ෂමතාවයක් ඇති බව පිළිගෙන ඇත." හොඳයි, ඔවුන් සම්පාදකවරයා මනා නම් if !A then B; else Cකිරීමට if A then C; else B. තත්වය ප්‍රතික්ෂේප කිරීම ගණනය කිරීම අතිරේක CPU උපදෙස් වේ. (ඔබ පවසන පරිදි, මෙය සැලකිය යුතු ලෙස අඩු කාර්යක්ෂමතාවයක් ඇති බවක් නොපෙනේ .)
ඩේවිඩ් රිචර්බි

Av ඩේවිඩ් රිචර්බි අපි පොදුවේ කතා කරන්නේ නම්, සමහර භාෂාවන්ට එවැනි ප්‍රශස්තිකරණයන් දුෂ්කර කළ හැකිය. නිදසුනක් ලෙස, අධික බර !සහ ==ක්‍රියාකරුවන් සමඟ C ++ ගන්න . කිසිවෙකු එය කළ යුතු බව නොවේ , ඔබ මතක තබා ගන්න ...
CVn

1

හිස් elseකුට්ටි සෑම විටම පාහේ විද්‍යුත් තීන්ත හානිකර නාස්තියක් බවට බොහෝ පිළිතුරු වල ස්ථාවරය මම දෙවෙනි කරමි . ඔබට එසේ කිරීමට හොඳ හේතුවක් තිබේ නම් මිස මේවා එකතු නොකරන්න, හිස් කොටස කිසිසේත් හිස් නොවිය යුතුය, එය එහි ඇත්තේ මන්දැයි පැහැදිලි කරන අදහසක් එහි අඩංගු විය යුතුය.

නිෂේධනයන් වළක්වා ගැනීමේ ගැටළුව තවත් අවධානය යොමු කළ යුතුය: සාමාන්‍යයෙන්, ඔබට බූලියන් අගයක් භාවිතා කිරීමට අවශ්‍ය වූ විට, එය සකසා ඇති විට ක්‍රියාත්මක වීමට ඔබට කේත කිහිපයක් අවශ්‍ය වන අතර, එය සකසා නොමැති විට ක්‍රියාත්මක වීමට තවත් කොටස් අවශ්‍ය වේ. එනිසා, ඔබ නිෂේධාත්මක නොවන රීතියක් බලාත්මක කරන්නේ නම්, ඔබ if() {} else {...}ප්‍රකාශයන් (හිස් ifබ්ලොක් එකක් සමඟ) බලාත්මක කරයි , නැතහොත් එක් එක් බූලියන් සඳහා එහි නිෂේධිත අගය අඩංගු දෙවන බූලියන් සාදයි. ඔබේ පා .කයන් ව්‍යාකූල කරන බැවින් විකල්ප දෙකම නරක ය.

ප්‍රයෝජනවත් ප්‍රතිපත්තියක් මෙයයි: කිසි විටෙකත් බූලියන්ගේ නමක් තුළ නොසලකා හරින ලද පෝරමයක් භාවිතා නොකරන්න, තනි ලෙස ප්‍රතික්ෂේප කිරීම ප්‍රකාශ කරන්න !. වැනි ප්‍රකාශයක් if(!doorLocked)මනාව පැහැදිලිය, if(!doorUnlocked)ගැට ගැට මොළය වැනි ප්‍රකාශයකි . අදහස් ප්රකාශ කිරීමේ පසුව වර්ගය ඔබ සියලු පිරිවැය, තනි ඉදිරියේ නො වැළකී සිටිය යුතු දේ මේ !තුළ සිටින if()තත්වය.


0

මම කියන්නේ එය අනිවාර්යයෙන්ම නරක පුරුද්දක් බවයි. වෙනත් ප්‍රකාශ එකතු කිරීම මඟින් කිසිවක් නොකරන ඔබේ කියවීමට අර්ථ විරහිත රේඛා රාශියක් එකතු වන අතර කියවීම වඩාත් අපහසු වේ.


1
එක් කාල පරිච්ඡේදයක් සඳහා නිපදවන ලද SLOCs මත පදනම්ව ඔබේ කාර්යසාධනය ශ්‍රේණිගත කරන සේවා යෝජකයෙකු වෙනුවෙන් ඔබ කිසි විටෙකත් වැඩ කර නැති බව මට අසන්නට ලැබේ ...
CVn

0

හිස් නඩුවක් තිබේ නම් දෙවන නඩුව හැසිරවීම පිළිබඳව තවමත් සඳහන් කර නොමැති තවත් රටාවක් තිබේ. එය සමඟ ගනුදෙනු කිරීමට එක් ක්‍රමයක් නම් if block හි නැවත පැමිණීමයි. මෙවැනි:

void foo()
{
    if (condition) return;

    doStuff();
    ...
}

දෝෂ තත්වයන් පරීක්ෂා කිරීම සඳහා මෙය පොදු රටාවකි. සහතික කිරීමේ නඩුව තවමත් භාවිතා වන අතර, එහි ඇතුළත තවදුරටත් හිස්ව නොපවතින අතර අනාගත වැඩසටහන් ක්‍රමලේඛකයින් කල්පනා කර බැලීමට ඉඩ නොදේ. ඔබට නව ශ්‍රිතයක් කිරීමට අවශ්‍ය විය හැකි බැවින් එය කියවීමේ හැකියාව වැඩි දියුණු කළ හැකිය (මේ අනුව විශාල ශ්‍රිත කුඩා තනි ශ්‍රිතවලට කැඩීම).


0

වෙනත් පිළිතුරකින් මා දැක නැති "සෑම විටම වෙනත් වගන්තියක් ඇත" යන තර්කය සලකා බැලීමේදී එක් කරුණක් තිබේ: එය ක්‍රියාකාරී ක්‍රමලේඛන ශෛලියකින් අර්ථවත් කළ හැකිය. වර්ග කිරීම.

ක්‍රියාකාරී ක්‍රමලේඛන ශෛලියක් තුළ, ඔබ ප්‍රකාශයන්ට වඩා ප්‍රකාශන සමඟ කටයුතු කරයි. එබැවින් සෑම කේත කොටසකටම ප්‍රතිලාභ අගයක් ඇත - if-then-elseප්‍රකාශනයක් ඇතුළුව . කෙසේ වෙතත්, එය හිස් elseඅවහිරයක් වළක්වනු ඇත . මම ඔබේ උදාහරණයක් දෙන්නම්:

var even = if (n % 2 == 0) {
  return "even";
} else {
  return "odd";
}

දැන්, සී ස්ටයිල් හෝ සී ස්ටයිල් දේවානුභාවයෙන් යුත් සින්ටැක්ස් සහිත භාෂාවලින් (ජාවා, සී # සහ ජාවාස්ක්‍රිප්ට් වැනි, කිහිපයක් නම් කිරීමට) මෙය අමුතුයි. කෙසේ වෙතත් එය ලිවීමේදී එය වඩාත් හුරුපුරුදු බව පෙනේ:

var even = (n % 2 == 0) ? "even" : "odd";

යුරෝවෙන් බැහැරවීම elseඅපි ක්රියාකාරිත්වය වැඩසටහන්ගත විට වලංගු නඩුව වීමට අවශ්ය දේ නොවේ, බොහෝ අවස්ථාවලදී - ශාඛාව මෙහි හිස් නිර්වචනය නොකළ යුතු අගය ඇති වනු ඇත. එය සම්පූර්ණයෙන්ම අත්හැර දැමීමත් එසේමයි. කෙසේ වෙතත්, ඔබ ක්‍රියාකාරීව ක්‍රමලේඛනය කරන විට සෑම විටම elseඅවහිරයක් ඇතිවීමට මම ඉතා සුළු හේතුවක් ඉදිරිපත් කරමි .


0

... if ප්‍රකාශයක් වෙනත් ප්‍රකාශයක් අනුගමනය කළ යුතුය, එයට යමක් දැමිය යුතුද නැද්ද යන්න.

මම එකඟ if (a) { } else { b(); }ලෙස නැවත ලිවිය යුත්තේ if (!a) { b(); }හා if (a) { b(); } else { }ලෙස නැවත ලිවිය යුත්තේ if (a) { b(); }.

කෙසේ වෙතත්, මට කලාතුරකින් හිස් අත්තක් ඇති බව පෙන්වා දීම වටී. මෙයට හේතුව සාමාන්‍යයෙන් මම වෙනත් ආකාරයකින් හිස් ශාඛාවකට ගිය බව ලොග් වීමයි. මේ ආකාරයෙන් මට ලොග් පණිවිඩ වලින් සම්පූර්ණයෙන්ම ඉවත් විය හැකිය. මම නිදොස් කිරීමක් භාවිතා කරන්නේ කලාතුරකිනි. නිෂ්පාදන පරිසරයන් තුළ ඔබට නිදොස් කිරීමක් නොලැබේ; ඔබ සංවර්ධනය කිරීමට භාවිතා කරන මෙවලම් සමඟම නිෂ්පාදන ගැටළු නිරාකරණය කිරීමට හැකිවීම සතුටක්.

දෙවනුව, අසත්‍යයට වඩා සත්‍ය සාරධර්ම පරීක්ෂා කිරීම වඩා හොඳය. එයින් අදහස් වන්නේ '! දොර විවෘත' විචල්‍යය වෙනුවට 'දොර වසා ඇති' විචල්‍යයක් පරීක්ෂා කිරීම වඩා හොඳ බවයි

මට මේ ගැන මිශ්‍ර හැඟීම් ඇත. ඇති වීම සඳහා මෙහි අවාසිය doorClosedහා doorOpenedඑය හැකි ඔබ දැනුවත් විය යුතු වචන / පද සංඛ්යාව දෙගුණ. තවත් අවාසියක් නම් කාලයාගේ ඇවෑමෙන් එහි අර්ථය doorClosedසහ doorOpenedවෙනස් විය හැකිය (ඔබට පසුව පැමිණෙන අනෙකුත් සංවර්ධකයින්) සහ ඔබ එකිනෙකාගේ නිරවද්‍ය ප්‍රතික්ෂේප කිරීම් නොවන දේපල දෙකකින් අවසන් විය හැකිය. නිෂේධනයන් වළක්වා ගැනීම වෙනුවට, කේතයේ භාෂාව (පන්ති නම්, විචල්‍ය නම් ආදිය) ව්‍යාපාරික භාවිතා කරන්නන්ගේ වචන මාලාවට සහ මට ලබා දී ඇති අවශ්‍යතාවයන්ට අනුවර්තනය වීම මම අගය කරමි. එය වළක්වා ගැනීම සඳහා නව යෙදුමක් සෑදීමට මට අවශ්‍ය නොවනු ඇත!එම යෙදුමට ව්‍යාපාර පරිශීලකයින්ට නොතේරෙන සංවර්ධකයෙකුට පමණක් අර්ථයක් තිබේ නම්. සංවර්ධකයින් භාවිතා කරන්නන් හා අවශ්‍යතා ලිවීමේදී එකම භාෂාව කතා කිරීම මට අවශ්‍යය. දැන් නව යෙදුම් ආකෘතිය සරල කරන්නේ නම්, එය වැදගත් ය, නමුත් අවශ්‍යතා අවසන් වීමට පෙර එය හැසිරවිය යුතුය, පසුව නොවේ. කේතීකරණය ආරම්භ කිරීමට පෙර සංවර්ධනය විසින් මෙම ගැටළුව විසඳිය යුතුය.

මගේ සහජ බුද්ධිය සැක කිරීමට මට ඉඩ තිබේ.

ඔබ ගැන දිගටම ප්‍රශ්න කිරීම හොඳයි.

එය හොඳ / නරක / "ප්‍රශ්නයක් නොවේ" පුහුණුවක්ද?

යම් තරමකට මේ බොහෝ දේ වැදගත් නොවේ. ඔබේ කේතය සමාලෝචනය කර ඔබේ කණ්ඩායමට අනුගත වන්න. එය සාමාන්‍යයෙන් නිවැරදි දෙයකි. ඔබගේ කණ්ඩායමේ සිටින සෑම කෙනෙකුම යම් ආකාරයකින් කේත කිරීමට අවශ්‍ය නම්, එය එසේ කිරීම වඩාත් සුදුසුය (පුද්ගලයන් 1 දෙනෙකු වෙනස් කිරීම - ඔබම - පුද්ගලයින් කණ්ඩායමක් වෙනස් කිරීමට වඩා අඩු කථා ලකුණු ගනී).

එය සාමාන්‍ය සිරිතක්ද?

හිස් අත්තක් දුටු බව මට මතක නැත. ප්‍රතික්ෂේප කිරීම් වලක්වා ගැනීම සඳහා මිනිසුන් දේපල එකතු කරන බව මට පෙනේ.


0

මම ප්‍රශ්නයේ දෙවන කොටස පමණක් ඇමතීමට යන අතර මෙය පැමිණෙන්නේ කාර්මික පද්ධතිවල වැඩ කිරීම සහ සැබෑ ලෝකයේ උපාංග හැසිරවීම පිළිබඳ මගේ දෘෂ්ටි කෝණයෙන් ය.

කෙසේ වෙතත් මෙය කෙසේ හෝ පිළිතුරකට වඩා දීර් comment අදහස් දැක්වීමකි.

එය ප්‍රකාශ කළ විට

දෙවනුව, අසත්‍යයට වඩා සත්‍ය සාරධර්ම පරීක්ෂා කිරීම වඩා හොඳය. එයින් අදහස් වන්නේ '! දොර විවෘත' විචල්‍යය වෙනුවට 'දොර වසා ඇති' විචල්‍යයක් පරීක්ෂා කිරීම වඩා හොඳ බවයි

ඔහුගේ තර්කය වන්නේ කේතය කරන්නේ කුමක්ද යන්න එය පැහැදිලි කරයි.

මගේ දෘෂ්ටි කෝණයෙන් උපකල්පනය කරනුයේ දොර තත්වය ද්විමය රාජ්‍යයක් වන අතර ඇත්ත වශයෙන්ම එය අවම වශයෙන් තෘතීය තත්වයක් වන විට ය:

  1. දොර විවෘතයි.
  2. දොර සම්පූර්ණයෙන්ම විවෘත හෝ සම්පූර්ණයෙන්ම වසා නැත.
  3. දොර වසා ඇත.

මේ අනුව තනි ද්විමය ඩිජිටල් සංවේදකයක් පිහිටා ඇති ස්ථානය මත පදනම්ව ඔබට උපකල්පනය කළ හැක්කේ සංකල්ප දෙකෙන් එකක් පමණි:

  1. සංවේදකය දොරේ විවෘත පැත්තේ තිබේ නම්: දොර විවෘතව හෝ විවෘත නොවේ
  2. සංවේදකය දොරේ සංවෘත පැත්තේ තිබේ නම්: දොර වසා ඇත හෝ වසා නැත.

ද්විමය නිෂේධනයක් භාවිතා කිරීමෙන් ඔබට මෙම සංකල්ප හුවමාරු කර ගත නොහැක. මේ අනුව doorClosed, !doorOpenedබොහෝ විට ඒවා සමාන නොවන අතර ඒවා සමාන යැයි මවා පෑමට ගන්නා ඕනෑම උත්සාහයක් වැරදි චින්තනයක් වන අතර එය ඇත්ත වශයෙන්ම පවතින තත්වයට වඩා පද්ධති තත්වය පිළිබඳ වැඩි දැනුමක් උපකල්පනය කරයි.

ඔබේ ප්‍රශ්නයට නැවත පැමිණීමේදී විචල්‍යය නියෝජනය කරන තොරතුරු වල මූලාරම්භයට ගැලපෙන වාචික වචන වලට මම සහාය දෙමි. මේ අනුව තොරතුරු ලබාගෙන ඇත්තේ දොරේ සංවෘත පැත්තෙන් නම් doorClosedයනාදිය සමඟ යන්න . මෙයින් ඇඟවෙන්නේ අවශ්‍ය පරිදි විවිධ ප්‍රකාශයන්හි භාවිතා කිරීම doorClosedහෝ !doorClosedඅවශ්‍ය පරිදි භාවිතා කිරීම ය. නමුත් එය නොකරන්නේ පද්ධතියේ තත්වය පිළිබඳව උපකල්පන ව්‍යංගයෙන් ප්‍රචාරය කිරීමයි.


මා කරන කාර්යයන් සඳහා සාකච්ඡා අරමුණු සඳහා, පද්ධතියේ තත්වය පිළිබඳව මා සතුව ඇති තොරතුරු ප්‍රමාණය සමස්ත පද්ධතියටම අවශ්‍ය ක්‍රියාකාරිත්වය මත රඳා පවතී.

සමහර විට මට දැන ගැනීමට අවශ්‍ය වන්නේ දොර වසා තිබේද නැද්ද යන්නයි. කුමන ද්විමය සංවේදකයක් පමණක් ප්‍රමාණවත් වේ. නමුත් වෙනත් අවස්ථාවලදී දොර විවෘතව, වසා ඇති හෝ සංක්‍රාන්ති බව දැන ගැනීමට මට අවශ්‍යය. එවැනි අවස්ථාවන්හිදී ද්විමය සංවේදක දෙකක් (දොර චලනයේ සෑම අන්තයකම - දොර එකවර විවෘතව හා වසා දමා ඇති බවට දෝෂ සහිතව) හෝ දොර කොතරම් විවෘතදැයි මනින ඇනලොග් සංවේදකයක් ඇත.

පළමුවැන්න උදාහරණයක් වන්නේ මයික්‍රෝවේව් උදුනක දොරයි. දොර වසා තිබීම හෝ වසා නොතිබීම මත පදනම්ව ඔබ උඳුනේ ක්‍රියාකාරිත්වය සක්‍රීය කරයි. දොර කොතරම් විවෘතදැයි ඔබට ප්‍රශ්නයක් නැත.

දෙවැන්න සඳහා උදාහරණයක් වනුයේ සරල මෝටර් ධාවකයක්. ක්‍රියාකරු සම්පූර්ණයෙන්ම අක්‍රිය වූ විට ඔබ මෝටරය ඉදිරියට ධාවනය කිරීම වළක්වයි. තවද, ක්‍රියාකරු සම්පූර්ණයෙන්ම ක්‍රියාත්මක වන විට ඔබ මෝටරය ආපසු හරවා යැවීම වළක්වයි.

මූලික වශයෙන් සංවේදක ගණන සහ වර්ගය පැමිණෙන්නේ අවශ්‍ය ක්‍රියාකාරිත්වය සාක්ෂාත් කර ගැනීම සඳහා අවශ්‍ය දේ විශ්ලේෂණයට එරෙහිව සංවේදකවල පිරිවැය විශ්ලේෂණයක් ක්‍රියාත්මක කිරීමට ය.


"මගේ දෘෂ්ටි කෝණයෙන් මෙහි උපකල්පනය කෙරෙන්නේ දොර තත්වය ද්විමය තත්වයක් වන අතර ඇත්ත වශයෙන්ම එය අවම වශයෙන් තෘතීය තත්වයක් වන විට ය:" සහ "ඔබ දොර වසා දමා හෝ වසා නොතිබීම මත පදනම්ව උදුන ක්‍රියාත්මක කිරීමට ඉඩ සලසයි. දොර කොතරම් විවෘතදැයි ඔබට ප්‍රශ්නයක් නැත. එකිනෙකාට පරස්පරයි. එසේම, ප්‍රශ්නය දොරවල් සහ සංවේදක ගැන යැයි මම නොසිතමි.
සැන්චයිසස්

An ප්‍රකාශයන් ඔබ ඒවා සන්දර්භයෙන් ඉවතට ගෙන ඇති බැවින් ප්‍රකාශ පරස්පර විරෝධී නොවේ. පළමු ප්‍රකාශයන් වන්නේ ත්‍රිමාණ රාජ්‍යයක ප්‍රතිවිරුද්ධ ද්විමය මිනුම් දෙකක් ද්විමය නිෂේධනය හරහා හුවමාරු කළ නොහැකි සන්දර්භය තුළ ය. දෙවන ප්‍රකාශය සන්දර්භය තුළ යෙදුමක් නිවැරදිව වැඩ කිරීමට ප්‍රමාණවත් විය හැක්කේ තෘතීය තත්වයක් පිළිබඳ අර්ධ දැනුමක් පමණි. දොරවල් සම්බන්ධයෙන් ගත් කල, දොරවල් විවෘතව හා වසා දමා ඇති බව OPs ප්‍රශ්න කරයි. මම දැන් පෙන්වා දෙන්නේ දත්තවලට සලකන ආකාරය කෙරෙහි බලපෑම් කළ හැකි පැහැදිලි උපකල්පනයක්.
පීටර් එම්

-1

කොන්ක්‍රීට් විලාසිතාවේ නීති සෑම විටම නරක ය. මාර්ගෝපදේශ හොඳයි, නමුත් අවසානයේදී බොහෝ විට ඔබට මාර්ගෝපදේශ අනුගමනය නොකරන දෙයක් කිරීමෙන් දේවල් වඩාත් පැහැදිලි කර ගත හැකි අවස්ථා තිබේ.

එයින් කියැවෙන්නේ හිස් වෙනත් බොහෝ දේ "එය රේඛා නාස්ති කරයි" "අමතර ටයිප් කිරීම" ය, එය නරක ය. ඔබට සිරස් අවකාශය සැබවින්ම අවශ්‍ය නම් වරහන් එකම රේඛාවකට ගෙනයාම සඳහා ඔබට තර්කය ඉදිරිපත් කළ හැකිය, නමුත් එය ගැටළුවක් නම් ඔබ කෙසේ හෝ වෙනම රේඛාවක් මත තැබිය යුතු නොවේ.

වෙනත් තැනක සඳහන් කර ඇති පරිදි, අනෙක් අවස්ථාවේදී කිසිවක් සිදුවීමට ඔබට පැහැදිලිවම අවශ්‍ය නැති බව පෙන්වීමට අනෙක් කොටස තිබීම ඉතා ප්‍රයෝජනවත් වේ. බොහෝ ක්‍රියාකාරී ක්‍රමලේඛන සිදු කිරීමෙන් පසු (වෙනත් අවශ්‍යතාවයක් ඇති විට), එසේ නම් ලිවීමේදී ඔබ සැමවිටම අනෙක් කරුණු සලකා බැලිය යුතු බව මම ඉගෙන ගතිමි. කෙනෙකුට වෙනත් දෙයක් තිබිය යුතුය, යමෙකුට එසේ නොවිය යුතුය. කනගාටුවට කරුණක් නම්, ඔබට සෑම විටම බැලූ බැල්මට පැවසිය හැකි දෙයක් නොවේ.

'නිෂේධනයක් නැත' සම්බන්ධයෙන්, නැවතත්, නිරපේක්ෂ නීති නරක ය. හිස්ව තිබීම අමුතු දෙයක් විය හැකිය, විශේෂයෙන් එය වෙනත් දෙයක් අවශ්‍ය නොවන්නේ නම්, ඒ නිසා ඒ සියල්ල ලිවීමට වඩා! හෝ == අසත්‍යයක් නරක ය. එයින් කියැවෙන්නේ negative ණාත්මක අර්ථයක් ඇති අවස්ථා රාශියක් ඇති බවයි. පොදු උදාහරණයක් වනුයේ වටිනාකමක් රඳවා ගැනීමයි:

static var cached = null

func getCached() {
    if !cached {
        cached = (some calculation, etc)
    }

    return cached
}

සත්‍ය (මානසික / ඉංග්‍රීසි) තර්කනයට negative ණාත්මක සම්බන්ධයක් තිබේ නම්, එසේ නම් ප්‍රකාශය කළ යුතුය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.