මා කලින් ශ්‍රිතයකින් ආපසු පැමිණිය යුතුද? නැතහොත් if ප්‍රකාශයක් භාවිතා කළ යුතුද? [වසා ඇත]


302

මම බොහෝ විට ආකෘති දෙකෙහිම මෙවැනි ක්‍රියාකාරිත්වයක් ලියා ඇති අතර, එක් ආකෘතියක් තවත් ආකෘතියකට වඩා කැමති දැයි මම කල්පනා කළෙමි.

public void SomeFunction(bool someCondition)
{
    if (someCondition)
    {
        // Do Something
    }
}

හෝ

public void SomeFunction(bool someCondition)
{
    if (!someCondition)
        return;

    // Do Something
}

මම සාමාන්‍යයෙන් පළමු එක සමඟ කේත කරන්නේ කේතීකරණයේදී මගේ මොළය ක්‍රියා කරන ආකාරය නිසා ය, නමුත් මම සිතන්නේ 2 වන ක්‍රමයට වඩා වැඩි කැමැත්තක් දක්වන්නේ එය කිසියම් දෝෂයක් හැසිරවීම ගැන වහාම බලා ගන්නා නිසා සහ කියවීමට පහසු වන බැවිනි


9
මම මෙම සාකච්ඡාවට ටිකක් ප්‍රමාදයි, එබැවින් මම මෙය පිළිතුරකට නොයවන්නෙමි; මම මීට වසර දෙකකට පෙරද මේ ගැන සිතුවෙමි: lecterror.com/articles/view/code-formatting-and-readability කියවීමට, වෙනස් කිරීමට, නඩත්තු කිරීමට සහ නිදොස්කරණය කිරීමට දෙවන පහසුකම මට පෙනේ. නමුත් සමහර විට එය මා පමණක් විය හැකිය :)
ආචාර්ය හැනිබල් ලෙක්ටර්


4
දැන් මෙම ප්‍රශ්නය මතය පදනම් කරගත් ප්‍රශ්නයකට කදිම නිදසුනකි
රුඩොල්ෆ් ඕලා

2
එසේනම් එක් හෝ වෙනත් දිශාවකට නිරපේක්ෂ සාක්ෂි නොමැති නම් කුමක් කළ යුතුද? එක හා තවත් දිශාවකට ප්‍රමාණවත් තර්ක ඉදිරිපත් කර ඇති අතර පිළිතුර නිවැරදි නම් ඡන්ද විමසීමක් සිදු වන විට - එය ඉතා ප්‍රයෝජනවත් වේ. මේ වගේ අවසාන ප්‍රශ්න මෙම වෙබ් අඩවියේ වටිනාකමට හානිකර බව මට පෙනේ.
gsf

9
මම අදහස් මත පදනම් වූ ප්‍රශ්න සහ පිළිතුරු වලට කැමතියි. බහුතරයක් කැමති දේ ඔවුන් මට පවසන අතර අනෙක් අයට කියවීමට කේතය ලිවීමට එය මට ඉඩ දෙයි.
සිගිමන්තස්

Answers:


399

මම දෙවන විලාසිතාවට කැමතියි. පළමුවෙන්ම අවලංගු අවස්ථා මඟහරින්න, එක්කෝ සුදුසු පරිදි පිටවීම හෝ ව්‍යතිරේකයන් මතු කිරීම, හිස් රේඛාවක් එහි දමා, ඉන්පසු ක්‍රමයේ “සැබෑ” ශරීරය එක් කරන්න. මට කියවීම පහසුය.


7
ස්මාල්ටෝක් මෙම "ආරක්ෂක වගන්ති" ලෙස හැඳින්වේ. අවම වශයෙන් කෙන්ට් බෙක් ඔවුන්ව ස්මාල්ටෝක් හොඳම පුහුණු රටාවන්ගෙන් හඳුන්වයි; එය සාමාන්‍ය උපහාසයක් දැයි මම නොදනිමි.
ෆ්‍රෑන්ක් ෂෙයාර්

154
වේලාසනින් පිටවීම මඟින් ඔබේ සීමිත මානසික තොගයෙන් දේවල් ඉවත් කර ගත හැකිය. :)
ජෝර්න්

50
මෙය "Bouncer Pattern" ලෙස හඳුන්වන බව මා මීට පෙර අසා ඇත්තෙමි - නරක දොරවල් දොරටුවට යාමට පෙර ඒවා ඉවත් කරන්න.
RevBingo

14
මම බොහෝ දුර ගොස් මෙය අනිවාර්යයෙන්ම කළ යුතු එකම දෙය යැයි කියමි.
ඔලිවර් වෙයිලර්

38
ආරම්භයේ දී ඔබ දේශ සීමා නඩු වලින් මිදුනහොත් ඔබ දිගටම ඉන්ඩෙන්ට් එකතු නොකරයි.
doppelgreener

169

නිසැකවම දෙවැන්න. කලින් සඳහන් කළ දේ දැන් නරක නැත, නමුත් ඔබ වඩාත් සංකීර්ණ කේතයක් ලබා ගත් විට, කිසිවෙකු මෙය සිතනු ඇතැයි මට සිතාගත නොහැකිය:

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    int retval = SUCCESS;
    if (someCondition)
    {
        if (name != null && name != "")
        {
            if (value != 0)
            {
                if (perms.allow(name)
                {
                    // Do Something
                }
                else
                {
                    reval = PERM_DENY;
                }
            }
            else
            {
                retval = BAD_VALUE;
            }
        }
        else
        {
            retval = BAD_NAME;
        }
    }
    else
    {
        retval = BAD_COND;
    }
    return retval;
}

වඩා කියවිය හැකි ය

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    if (!someCondition)
        return BAD_COND;

    if (name == null || name == "")
        return BAD_NAME;

    if (value == 0)
        return BAD_VALUE;

    if (!perms.allow(name))
        return PERM_DENY;

    // Do something
    return SUCCESS;
}

තනි පිටවීමේ ස්ථානවල වාසිය මා කිසි විටෙකත් තේරුම් නොගත් බව මම සම්පූර්ණයෙන්ම පිළිගනිමි.


20
තනි පිටවීමේ ස්ථානයක ඇති වාසිය නම් ... තනි පිටවීමේ ස්ථානයක් ඇත! ඔබේ උදාහරණය සමඟ, ආපසු යා හැකි කරුණු කිහිපයක් තිබේ. වඩාත් සංකීර්ණ ශ්‍රිතයක් සමඟ, ප්‍රතිලාභ අගයෙහි ආකෘතිය වෙනස් වන විට එය දඩයම්-පිටවීමේ ස්ථානයක් බවට පත්විය හැකිය. ඇත්ත වශයෙන්ම, එක් පිටවීමේ ස්ථානයකට බල කිරීම අර්ථවත් නොවන අවස්ථා තිබේ.
ජෝන් එල්

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

4
Ar යාර්: ඇත්ත, නමුත් කාරණය පවතී. මම කිසිවෙකු උත්සාහ කර හැරවීමට යන්නේ නැත, මම හැකි තරම් පිටවීමේ ස්ථාන කිහිපයකට යාමේ වාසිය පෙන්වා දෙමි (ජේසන්ගේ උදාහරණය කෙසේ හෝ පිදුරු මිනිසෙකි). ඊළඟ වතාවේදී ඔබ ඔබේ කොණ්ඩය අදින විට සමෆන්ෂන් සමහර විට අමුතු අගයන් ලබා දෙන්නේ ඇයිදැයි සොයා බැලීමට උත්සාහ කරයි, සමහර විට ඔබ නැවත පැමිණීමට පෙර ලොග් ඇමතුමක් එක් කළ හැකිය . එක් බගර් එකක් පමණක් තිබේ නම් නිදොස් කිරීම පහසුය! :)
ජෝන් එල්

76
Ason ජේසන් වයර්ස් තනි පුද්ගලයෙක් return value;උදව් කරනවා වගේ!?! එවිට කෙනෙකුට දුසිම් භාගයක් දඩයම් value = ...කළ යුතු අතර, මෙම පැවරුම සහ අවසාන ප්‍රතිලාභ අතර වටිනාකම වෙනස් නොවන බව ඔබට කිසි විටෙකත් විශ්වාස නැත. අවම වශයෙන් ක්ෂණික ආපසු යාමකින් පැහැදිලි වන්නේ කිසිවක් තවදුරටත් ප්‍රති result ලය වෙනස් නොකරන බවයි.
Sjoerd

5
ජෝජ්: මම මෙහි දෙවන ස්ජෝර්ඩ්. ඔබට ප්‍රති result ලය ලොග් කිරීමට අවශ්‍ය නම්, ඔබට ඇමතුම් අඩවියට පිවිසිය හැකිය. ඔබට හේතුව දැන ගැනීමට අවශ්‍ය නම්, ඔබ එක් එක් පිටවීමේ ස්ථානයේ / පැවරුමේදී ලොග් විය යුතුය, එවිට දෙකම මෙම අංශයෙන් සමාන වේ.
මැතිව් එම්.

32

එය රඳා පවතින්නේ - පොදුවේ ගත් කල, ශ්‍රිතයෙන් ඉවත්වීම සඳහා කේත පොකුරක් ගෙනයාමට උත්සාහ කිරීමට මම නොයන්නෙමි - සම්පාදකයා සාමාන්‍යයෙන් මා වෙනුවෙන් ඒ ගැන බලා ගනී. කෙසේ වෙතත්, මට අවශ්‍ය මූලික පරාමිතීන් කිහිපයක් තිබේ නම් සහ වෙනත් ආකාරයකින් ඉදිරියට යා නොහැකි නම්, මම වේලාසනින් කඩාවැටෙන්නෙමි. ඒ හා සමානව, යම් තත්වයක් මඟින් යෝධ ifබ්ලොක් එකක් ජනනය කරන්නේ නම්, එහි ප්‍රති result ලයක් ලෙස මට එය කඩාවැටෙනු ඇත.

කෙසේ වෙතත්, යම් ශ්‍රිතයක් හැඳින්වූ විට යම් දත්තයක් අවශ්‍ය නම්, මම සාමාන්‍යයෙන් නැවත පැමිණීමට වඩා ව්‍යතිරේකයක් විසි කරමි (උදාහරණය බලන්න).

public int myFunction(string parameterOne, string parameterTwo) {
  // Can't work without a value
  if (string.IsNullOrEmpty(parameterOne)) {
    throw new ArgumentNullException("parameterOne");
  } 
  if (string.IsNullOrEmpty(parameterTwo)) {
    throw new ArgumentNullException("parameterTwo");
  }

  // ...      
  // Do some work
  // ...

  return value;
}

9
අවසාන ප්‍රති result ලය පවත්වා ගත හැකි නම්, තෝරාගත් ශෛලිය ගැන සැලකිලිමත් වන්නේ කවුද?
ජෙෆ් සිවර්

3
E ජෙෆ් සිවර් - මේ අනුව මෙය “ශුද්ධ-යුද්ධ” විලාසිතාවේ ප්‍රශ්නයක් වන්නේ ඇයි, දවස අවසානයේදී එය පුද්ගලික මනාපයන් සහ අභ්‍යන්තර විලාසිතාවේ මාර්ගෝපදේශකයෙකු පවසන ඕනෑම දෙයකට පැමිණේ.
rjzii

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

මගේ සම්පාදකයා යෝජනා කරන පරිදි චක්‍රීය සංකීර්ණතාව ගැන කුමක් කිව හැකිද? යමෙකුට උදව් කළ හැකි නම් කූඩු කේතය නොකිරීම වඩා හොඳ නොවේ ද?
l --'''''--------- '' '' '' '' '' '

24

මම කලින් පැමිණීමට කැමතියි.

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

එක් ප්‍රවේශයක් සහ බහුවිධ පැවැත්මක් ඇති විට, ඔබ ඔබේ ප්‍රති result ලය ලැබුණු විට නැවත පැමිණෙන අතර කිසිවෙකු ඒ සඳහා වෙන කිසිවක් නොකරන බව දැකීමට එය කරදර නොවන්න (මන්ද ඔබ ආපසු පැමිණි දා සිට වෙනත් කිසිවක් නොතිබෙනු ඇත). එය හරියට ශරීරය තවත් පියවර කිහිපයකට බෙදීම හා සමාන වන අතර, සෑම පියවරක්ම ප්‍රති result ලය ලබා දීමට හෝ ඊළඟ පියවරට එහි වාසනාව අත්හදා බැලීමට ඉඩ සලසයි.


13

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

සී ++ ක්‍රමලේඛනයේදී ඔබට ඩිස්ට්‍රැක්ටර්ස් ඇති අතර දැන් පවා විෂය පථයෙන් පිටවීමේ ආරක්ෂකයින් සිටී. කේතය ව්‍යතිරේක-ආරක්ෂිත බව සහතික කිරීම සඳහා මේ සියල්ලම මෙහි තිබිය යුතුය, එබැවින් කේතය කලින් පිටවීම වැළැක්වීම සඳහා හොඳින් ආරක්ෂා වී ඇති අතර එබැවින් එසේ කිරීමෙන් කිසිදු තාර්කික අවාසියක් නොමැති අතර එය හුදෙක් විලාසිතාවේ ගැටලුවකි.

මම ජාවා ගැන ප්‍රමාණවත් දැනුමක් නොදක්වමි, “අවසාන වශයෙන්” බ්ලොක් කේතය කැඳවනු ඇත්ද සහ යම් දෙයක් සිදු වන බව සහතික කිරීමට අවශ්‍ය තත්වයට අවසාන තරඟකරුවන්ට මුහුණ දිය හැකිද යන්න.

සී # මට නිසැකවම පිළිතුරු දිය නොහැක.

ඩී-භාෂාව ඔබට නිසි ලෙස ගොඩනඟන ලද විෂය පථයෙන් පිටවීමේ ආරක්ෂකයින් ලබා දෙන අතර එම නිසා කලින් පිටවීම සඳහා හොඳින් සූදානම්ව සිටින අතර එම නිසා ශෛලිය හැර වෙනත් ප්‍රශ්නයක් ඉදිරිපත් නොකළ යුතුය.

කාර්යයන් ඇත්ත වශයෙන්ම එතරම් දිගු නොවිය යුතු අතර, ඔබට විශාල ස්විච් ප්‍රකාශයක් තිබේ නම් ඔබේ කේතය ද නරක ලෙස සාධක වේ.


1
C ++ මඟින් ප්‍රතිලාභ අගය ප්‍රශස්තිකරණය ලෙස හඳුන්වන අතර එමඟින් ඔබ අගයක් ආපසු ලබා දෙන විට සාමාන්‍යයෙන් සිදුවිය හැකි පිටපත් ක්‍රියාකාරිත්වය අත්හැර දැමීමට සම්පාදකයාට අවසර දෙයි. කෙසේ වෙතත්, විවිධ තත්වයන් යටතේ එය කිරීමට අපහසු වන අතර, බහු ප්‍රතිලාභ අගයන් එවැනි අවස්ථාවන්ගෙන් එකකි. වෙනත් වචන වලින් කිවහොත්, C ++ හි බහු ප්‍රතිලාභ අගයන් භාවිතා කිරීමෙන් ඇත්ත වශයෙන්ම ඔබේ කේතය මන්දගාමී විය හැකිය. මෙය නිසැකවම එම්.එස්.සී. මත රැඳී ඇති අතර, හැකි ප්‍රතිලාභ ප්‍රතිලාභ සමඟ RVO ක්‍රියාත්මක කිරීම තරමක් උපක්‍රමශීලී (කළ නොහැකි නම්), එය සියලු සම්පාදකයින්ගේ ගැටලුවක් විය හැකිය.
ඊමොන් නර්බෝන්

1
C හි, භාවිතා කරන්න, gotoසහ සමහර විට, කරුණු දෙකක ප්‍රතිලාභයක්. උදාහරණය (අදහස් දැක්වීමේදී කේත ආකෘතිකරණය කළ නොහැක):foo() { init(); if (bad) goto err; bar(); if (bad) goto err; baz(); return 0; err: cleanup(); return 1; }
මිරබිලෝස්

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

"යමෙකු ඔබගේ කාර්යය සංස්කරණය කළ හැකිය" - මෙය තීරණ ගැනීම සඳහා හාස්‍යජනක පැහැදිලි කිරීමකි. ඕනෑම කෙනෙකුට අනාගතයේදී ඕනෑම දෙයක් කළ හැකිය. අනාගතයේ දී යමෙකු දේවල් බිඳ දැමීම වැළැක්වීම සඳහා ඔබ අද නිශ්චිත යමක් කළ යුතු යැයි එයින් අදහස් නොවේ.
වික්ටර් යාරෙමා

ඔබගේ කේතය නඩත්තු කළ හැකි යැයි කියනු ලැබේ. තථ්‍ය ලෝක කේතය ව්‍යාපාර අරමුණු සඳහා ලියා ඇති අතර සමහර විට සංවර්ධකයෙකු පසුව එය වෙනස් කළ යුතුය. නවීන C ++
CashCow

9

ජයග්‍රහණය සඳහා මුල් ප්‍රතිලාභ. ඒවා කැත ලෙස පෙනේ, නමුත් විශාල ifඑතීමට වඩා අඩු කැතයි , විශේෂයෙන් පරීක්ෂා කිරීමට විවිධ කොන්දේසි තිබේ නම්.


9

මම දෙකම පාවිච්චි කරනවා.

DoSomethingකේත පේළි 3-5 ක් නම් පළමු හැඩතල ගැන්වීමේ ක්‍රමය භාවිතයෙන් කේතය ලස්සනයි.

නමුත් එයට වඩා බොහෝ රේඛා තිබේ නම්, මම දෙවන ආකෘතියට කැමතියි. විවෘත කිරීමේ සහ වසා දැමීමේ වරහන් එකම තිරයේ නොමැති විට මම කැමති නැත.


2
ලස්සන ක්‍රමයක් නැහැ! ඕනෑවට වඩා ඉන්ඩෙන්ෂන්!
ජිමීකේන්

Im ජිමීකේන් පේළි 3-5 කින් සිදුවිය හැකි බොහෝ ඉන්ඩෙන්ටේෂන් පමණක් ඇත, විශේෂයෙන් ඔබට මට්ටමට පේළි 2 (?) අවශ්‍ය බැවින් ඉතිරිය ඉන්ඩෙන්ට් වේ: පාලක ව්‍යුහය සහ බ්ලොක් ආරම්භය සඳහා එකක්, බ්ලොක් අවසානය සඳහා එකක්.
අඩුකිරීමේ

8

තනි පිවිසුම්-තනි-පිටවීම සඳහා සම්භාව්‍ය හේතුවක් නම්, විධිමත් අර්ථ නිරූපණය වෙනත් ආකාරයකින් කිව නොහැකි තරම් කැත බවට පත්වීමයි (GOTO හානිකර යැයි සැලකූ එකම හේතුව).

වෙනත් ක්‍රමයක් තබන්න, ඔබට 1 ප්‍රතිලාභයක් පමණක් තිබේ නම් ඔබේ මෘදුකාංගය සාමාන්‍යයෙන් ඉවත් වන්නේ කවදාදැයි තර්ක කිරීම පහසුය. එය ද ව්‍යතිරේකයට එරෙහි තර්කයකි.

සාමාන්‍යයෙන් මම කලින් ආපසු එන ප්‍රවේශය අවම කරමි.


නමුත් විධිමත් විශ්ලේෂණ මෙවලමක් සඳහා ඔබට මෙවලමට අවශ්‍ය අර්ථකථන සමඟ බාහිර ශ්‍රිතයක් සංස්ලේෂණය කළ හැකි අතර කේතය මිනිසුන්ට කියවිය හැකි ලෙස තබා ගන්න.
ටිම් විලිස්ක්‍රොෆ්ට්

Im තිම්. එය රඳා පවතින්නේ ඔබට කොපමණ ප්‍රමාණයක් කළ යුතුද යන්න සහ ඔබ විශ්ලේෂණය කරන දේ මතය. කෝඩරය දේවල් ගැන බුද්ධිමත් නම් SESE තරමක් කියවිය හැකි බව මට පෙනේ.
පෝල් නේතන්

විශ්ලේෂණය සඳහා මගේ ආකල්පය හැඩගස්වා ඇත්තේ ස්වයං ව්‍යාපෘතියේ ප්‍රශස්තිකරණයෙනි. ගතික ක්‍රම ඇමතුම් වලින් 99% ක්ම ස්ථිතිකව විසඳා ගත හැකිය. එවිට ඔබට සරල රේඛීය කේත කිහිපයක් විශ්ලේෂණය කළ හැකිය. වැඩ කරන ක්‍රමලේඛකයෙකු ලෙස, මා වැඩ කරන බොහෝ කේත සාමාන්‍ය ක්‍රමලේඛකයින් විසින් ලියන ලද්දක් යැයි මට විශ්වාස කළ හැකිය. එබැවින් ඔවුන් ඉතා හොඳ කේතයක් ලියන්නේ නැත.
ටිම් විලිස්ක්‍රොෆ්ට්

Im තිම්: ප්‍රමාණවත්. ස්ථිතික භාෂාවන්ට තවමත් විශාල සෙල්ලම් ප්‍රමාණයක් ඇති බව පෙන්වා දීමට මට බල කළද.
පෝල් නේතන්

ව්‍යතිරේකයන් හමුවේ නොපවතින හේතුවක්. C හි තනි පිටවීම විශිෂ්ටයි, නමුත් C ++ වලින් ඔබට කිසිවක් මිලට නොගන්නේ එබැවිනි.
පීටර්චෙන්

7

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


6

එය රඳා පවතියි.

එකවරම පරීක්ෂා කිරීම සඳහා පැහැදිලිව පෙනෙන මළ අවසානයක් තිබේ නම් ඉක්මනින් ආපසු පැමිණීම, එමඟින් ඉතිරි ශ්‍රිතය අර්ථ විරහිත වනු ඇත. *

ශ්‍රිතය වඩාත් සංකීර්ණ නම් සහ වෙනත් ආකාරයකින් පිටවීමේ ස්ථාන තිබිය හැකි නම් නැවත ලබා ගැනීමේ + තනි ප්‍රතිලාභයක් සකසන්න (කියවීමේ හැකියාව පිළිබඳ ගැටළුව).

* මෙය බොහෝ විට නිර්මාණ ගැටලුවක් දැක්විය හැකිය. ඔබේ කේතයන් බොහොමයක් බාහිර / පරාමිති තත්වයක් හෝ ඉතිරි කේතය ක්‍රියාත්මක කිරීමට පෙර පරීක්ෂා කර බැලිය යුතු බව ඔබ සොයා ගන්නේ නම්, එය බොහෝ විට අමතන්නා විසින් හැසිරවිය යුතු දෙයකි.


6
බෙදාගත හැකි කේත ලිවීමේදී මගේ මන්ත්‍රය වන්නේ "කිසිවක් උපකල්පනය නොකරන්න. කිසිවෙකු විශ්වාස නොකරන්න" යන්නයි. ඔබ සැමවිටම ඔබගේ යෙදවුම් සහ ඔබ යැපෙන ඕනෑම බාහිර තත්වයක් වලංගු කළ යුතුය. කවුරුහරි ඔබට නරක දත්ත ලබා දී ඇති නිසා යමක් දූෂිත වීමට වඩා ව්‍යතිරේකයක් විසි කිරීමට වඩා හොඳය.
ටීඑම්එන්

MTMN: හොඳ කරුණක්.
බොබී මේස

2
මෙහි ඇති ප්‍රධාන කරුණ නම්, OO හි ඔබ ව්‍යතිරේකයක් විසි කිරීම මිස ආපසු නොයාමයි . බහුවිධ ප්‍රතිලාභ නරක විය හැකිය, බහු ව්‍යතිරේක විසි කිරීම අනිවාර්යයෙන්ම කේත සුවඳක් නොවේ.
මයිකල් කේ

2
Ic මයිකල්කේ: පශ්චාත් කොන්දේසිය සපුරා ගත නොහැකි නම් ක්‍රමයක් ව්‍යතිරේකයක් විය යුතුය. සමහර අවස්ථාවන්හිදී, ක්‍රමයක් ආරම්භයෙන් පිටවිය යුත්තේ ශ්‍රිතය ආරම්භ වීමටත් පෙර පශ්චාත් තත්ත්වය සපුරා ඇති බැවිනි. නිදසුනක් ලෙස, පාලක ලේබලයක් වෙනස් කිරීම සඳහා යමෙක් "පාලක ලේබලය සකසන්න" ක්‍රමයක් ඉල්ලුවහොත් Fred, කවුළුවේ ලේබලය දැනටමත් Fredපවතින අතර පාලකයේ නම වර්තමාන තත්වයට සැකසීම නැවත ඇඳීමට බල කරයි (සමහර අවස්ථාවල එය ප්‍රයෝජනවත් විය හැකි වුවත්) අතේ ඇති එකෙහි කරදරකාරී වන්න), පැරණි සහ නව නම් ගැලපෙන්නේ නම්, කලින්-පිටවීමේ කුලක නාම ක්‍රමය තිබීම සාධාරණ ය.
සුපර් කැට්

3

If භාවිතා කරන්න

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

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

ඩෙල්ෆි විශේෂිත ...

මට කිසිදු සාක්ෂියක් නොමැති වුවද ඩෙල්ෆි ක්‍රමලේඛකයින් සඳහා මෙය හොඳ ක්‍රමලේඛ පුහුණුවක් බව මගේ මතකයේ තිබේ. පෙර-D2009, අපි අගය ආපසු පරමාණුක ආකාරයෙන් නැහැ, අපි exit;සහ result := foo;හෝ අපි ව්යතිරේක විසි විය.

ඔබට ආදේශ කිරීමට සිදු වූයේ නම්

if (true) {
 return foo;
} 

සදහා

if true then 
begin
  result := foo; 
  exit; 
end;

ඔබගේ සෑම කාර්යයකම ඉහළින්ම සිටින බව දැකීමෙන් ඔබට අසනීප විය හැකිය

if false then 
begin
  result := bar;

   ... 
end
else
   result := foo;

exitසම්පූර්ණයෙන්ම වළකින්න .


2
නව ඩෙල්ෆිස් සමඟ, එය කෙටියෙන් කිව හැක්කේ if true then Exit(foo);මම බොහෝ විට තාක්‍ෂණය මුලින් හෝ පිළිවෙලින් ආරම්භ resultකිරීමට භාවිතා කරන අතර පසුව සියලු දෝෂ තත්වයන් පරික්ෂා කර බලා එකක් හමු වුවහොත් පමණි. සාර්ථකත්වයේ අවස්ථාව පසුව (සාමාන්‍යයෙන්) ක්‍රමයේ අවසානයේ යම් තැනකට සකසා ඇත. nilFALSEExit;result
ජෙන්ස්


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

2

මම පහත ප්‍රකාශය සමඟ එකඟ වෙමි:

මම පුද්ගලිකව ආරක්ෂක වගන්තිවල රසිකයෙක් (දෙවන උදාහරණය) එය ශ්‍රිතයේ ඉන්ඩෙන්ටින් අඩු කරයි. සමහර අය ඒවාට අකමැති නිසා එය ශ්‍රිතයෙන් ප්‍රතිලාභ ලකුණු කිහිපයක් ලබා දෙයි, නමුත් එය ඔවුන් සමඟ වඩා පැහැදිලි යැයි මම සිතමි.

සිට ගෙන stackoverflow මේ ප්රශ්නය .


+1 ආරක්ෂක වගන්ති සඳහා. නම් (තත්ත්වය = අසත්ය) නැවත නම් ආපසු විරුද්ධ ලෙස (තත්ත්වය!): ද මම ධනාත්මක නැඹුරු මුර උදා කැමති
JustinC

1

මම මේ දිනවල මුල් ප්‍රතිලාභ භාවිතා කරන්නේ අන්තයටම ය. මම මෙය ලියමි

self = [super init];

if (self != nil)
{
    // your code here
}

return self;

පරිදි

self = [super init];
if (!self)
    return;

// your code here

return self;

නමුත් එය ඇත්ත වශයෙන්ම වැදගත් නොවේ. ඔබේ කාර්යයන්හි කූඩු මට්ටම් එකක් හෝ දෙකකට වඩා තිබේ නම්, ඒවා බිඳ දැමිය යුතුය.


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

1

මම ලිවීමට කැමතියි:

if(someCondition)
{
    SomeFunction();
}

2
eww. එය පූර්ව වලංගු කිරීමක්ද? නැතහොත් එය වලංගු කිරීම සඳහා කැපවූ මෙහතොඩ් එකක DoSomeFunctionIfSomeConditionතිබේද?
STW

මෙය ඔබගේ ගැටළු වෙන් කරන්නේ කෙසේද?
justkt

2
ශ්‍රිතය ක්‍රියාත්මක කිරීම (එහි පරායත්තතා තර්කනය) බාහිර කිරීම මගින් ඔබ සංසරණය උල්ලං are නය කරයි.
ටීඑම්එන්

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

2
රොබට් සී. මාටින් "පිරිසිදු කේතය" තුළ යෝජනා කරන විලාසය මෙයයි. ශ්‍රිතයක් කළ යුත්තේ එක් දෙයක් පමණි. කෙසේ වෙතත්, "ක්‍රියාත්මක කිරීමේ රටාවන්" තුළ, කෙන්ට් බෙක් යෝජනා කරන්නේ, OP හි යෝජනා කර ඇති විකල්ප දෙකෙන්, දෙවැන්න වඩා හොඳ බවය.
ස්කොට් විට්ලොක්

1

ඔබ මෙන්, මම සාමාන්‍යයෙන් පළමුවැන්න ලියමි, නමුත් අන්තිම එකට කැමතියි. මට කැදැලි චෙක්පත් ගොඩක් තිබේ නම් මම සාමාන්‍යයෙන් දෙවන ක්‍රමයට ප්‍රතික්‍රියා කරමි.

දෝෂ හැසිරවීම චෙක්පතෙන් ඉවතට ගෙන යන්නේ කෙසේදැයි මම කැමති නැත.

if not error A
  if not error B
    if not error C
      // do something
    else handle error C
  else handle error B
else handle error A

මම මේකට කැමතියි:

if error A
  handle error A; return
if error B
  handle error B; return
if error C
  handle error C; return

// do something

0

මුදුනේ ඇති කොන්දේසි "පූර්ව කොන්දේසි" ලෙස හැඳින්වේ. තැබීමෙන් if(!precond) return;, ඔබ සියලු පූර්ව කොන්දේසි දෘශ්‍යමය වශයෙන් ලැයිස්තුගත කරයි.

විශාල "if-else" බ්ලොක් භාවිතා කිරීමෙන් ඉන්ඩෙන්ට් ඉහළට වැඩි විය හැකිය (මට 3 මට්ටමේ ඉන්ඩෙන්ට්ස් පිළිබඳ උපුටා දැක්වීම අමතක විය).


2
කුමක්ද? ඔබට ජාවා හි ඉක්මනින් ආපසු යා නොහැකිද? සී #, වී.බී. එබැවින් 'තදින් ටයිප් කළ භාෂාවන්' විශේෂාංගය නොමැති බවට චෝදනා නොකරන්න. stackoverflow.com/questions/884429/…
ps2goat

-1

ප්‍රකාශ කුඩා නම් තබා ගැනීමට මම කැමැත්තෙමි.

එබැවින්, අතර තෝරා ගැනීම:

if condition:
   line1
   line2
    ...
   line-n

හා

if not condition: return

line1
line2
 ...
line-n

මම ඔබ කලින් විස්තර කළ දේ තෝරා ගනිමි.

මතක තබා ගන්න, මම කලින් ලැබෙන ප්‍රතිලාභ හෝ වෙනත් කිසිවක් ගැන තැකීමක් නොකරමි, මම ඇත්තටම කැමතියි කේතය සරල කිරීමට, ප්‍රකාශයන්ගේ සිරුරු කෙටි කිරීමට යනාදිය.

කැදැල්ල නම් සහ තිබේ නම් සහ ඒවා භයානක වුවත් , ඒවා ඕනෑම වියදමකින් වළකින්න.


-2

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


-2

මම ක්‍රියාකාරී මට්ටමින් අසාර්ථක වේගයෙන් පුහුණු වෙමි. එය කේතය ස්ථාවර හා පිරිසිදුව තබා ගනී (මට සහ මා සමඟ වැඩ කළ අයට). ඒ නිසා මම සෑම විටම වේලාසනින් ආපසු එනවා.

බොහෝ විට පරීක්ෂා කරන ලද කොන්දේසි සඳහා, ඔබ AOP භාවිතා කරන්නේ නම් එම චෙක්පත් සඳහා අංශ ක්‍රියාත්මක කළ හැකිය.

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.