නරක ක්‍රමලේඛන භාවිතයන් `බිඳීම 'සහ' දිගටම කරගෙන යාම 'ද?


206

මගේ ලොක්කා නරක ක්‍රමලේඛකයින් භාවිතා කරන බව breakසහ continueලූපවල සඳහන් කරයි.

මම ඒවා නිතරම භාවිතා කරන්නේ ඒවා අර්ථවත් වන බැවිනි; දේවානුභාවයෙන් ඔබට පෙන්වන්නම්:

function verify(object) {
    if (object->value < 0) return false;
    if (object->value > object->max_value) return false;
    if (object->name == "") return false;
    ...
}

මෙහි ඇති කාරණය නම්, පළමුව ශ්‍රිතය කොන්දේසි නිවැරදි දැයි පරික්ෂා කර සත්‍ය ක්‍රියාකාරිත්වය ක්‍රියාත්මක කිරීමයි. IMO ද ලූප සමඟ අදාළ වේ:

while (primary_condition) {
    if (loop_count > 1000) break;
    if (time_exect > 3600) break;
    if (this->data == "undefined") continue;
    if (this->skip == true) continue;
    ...
}

මම හිතන්නේ මෙය කියවීම පහසු කරයි & debug; නමුත් මමත් අවාසියක් දකින්නේ නැහැ.


2
කුමන දේ කරන්නේද යන්න අමතක කිරීමට බොහෝ දේ අවශ්‍ය නොවේ.

58
නැහැ. ඒවා භාවිතා කළ යුත්තේ කවදාදැයි දැන ගැනීම යතුරයි. ඒවා මෙවලම් පෙට්ටියේ ඇති මෙවලම් වේ. ඔවුන් පැහැදිලි සහ සංක්ෂිප්ත කේතයක් සපයන විට ඔබ ඒවා භාවිතා කරයි.
orj

69
මෙම ශෛලීය කේතීකරණ ක්‍රමයට මගේ සහයෝගය තදින්ම ප්‍රකාශ කළ නොහැක. මෙම ප්‍රවේශයට වඩා බහුවිධ කැදැලි කොන්දේසි බෙහෙවින් නරක ය. මම සාමාන්‍යයෙන් කේතීකරණ විලාසය ගැන සටන්කාමී නොවෙමි, නමුත් මෙය මට බොහෝ දුරට ගනුදෙනුවක්.
එමිල් එච්

10
නිසැකවම ඔබේ ලොක්කා කේතයක් ලියන්නේ නැත. ඔහු එසේ කළා නම්, සියලු වචන (ඔව්, පවා goto) සමහර අවස්ථාවල ප්‍රයෝජනවත් බව ඔහු දැන ගනු ඇත .
sakisk

59
නරක ක්‍රමලේඛකයින් විවේකයක් භාවිතා කරන අතර ඉදිරියට යාම හොඳ ක්‍රමලේඛකයින් එසේ නොකරන බවක් අදහස් නොවේ. නරක ක්‍රමලේඛකයින් භාවිතා කරන්නේ නම් සහ එසේ වේ.
mouviciel

Answers:


255

වාරණයක් ආරම්භයේ දී භාවිතා කරන විට, පළමු චෙක්පත් සිදු කළ පරිදි, ඒවා පූර්ව කොන්දේසි ලෙස ක්‍රියා කරයි, එබැවින් එය හොඳයි.

බ්ලොක් මැද භාවිතා කරන විට, යම් කේතයක් වටා, ඒවා සැඟවුණු උගුල් මෙන් ක්‍රියා කරයි, එබැවින් එය නරක ය.


6
L හිමිකම් පෑම: පිටවීමේ ස්ථාන කිහිපයක් ඇති ඕනෑම පුරුද්දක් දුර්වල සාධක සහිත පුරුද්දක් යැයි තර්ක කළ හැකිය. නිසි සාධක සහිත පුරුද්දක් කළ යුත්තේ එක් දෙයක් සහ එක් දෙයක් පමණි.
bit-twiddler

81
@ bit-twiddler: මෙය ඉතා C-ish මානසිකත්වයකි. තාවකාලික විචල්යයක් පසුව වෙනස් කළ හැකිය, එබැවින් මෙහි සිට පේළි 20 ක් පහළට පහළින් පරෙස්සමින් සකස් කළ ප්රති result ලය මකා දැමිය හැකිය. කෙසේ වෙතත් ක්ෂණික ප්‍රතිලාභයක් (හෝ කැඩීම හෝ ඉදිරියට යාම) අතිශයින්ම පැහැදිලිය: මට දැන් කියවීම නැවැත්විය හැක්කේ එය තවදුරටත් පහළට වෙනස් කළ නොහැකි බව මා දන්නා බැවිනි . එය මගේ කුඩා මොළයට හොඳයි, ඇත්ත වශයෙන්ම කේතය හරහා ගමන් කිරීම පහසු කරයි.
මැතිව් එම්.

17
AtMatthieu මම එකඟයි. වාරණයේ අරමුණ තෘප්තිමත් වන ප්‍රති result ලයක් ඔබට ලැබුණු විට බ්ලොක් එකකින් පිටවන්න.
ඉවාන් ප්ලේස්

9
@ bit-twiddler - තනි-පිටවීමේ ලක්ෂ්‍ය මූලධර්මය තනි වගකීම්-මූලධර්මයෙන් වෙන් වේ. පරීක්ෂා කිරීම සැමවිටම තනි වගකීමක් ලෙස ක්‍රියා කිරීමෙන් වෙන්වන බව මම එකඟ නොවෙමි. ඇත්ත වශයෙන්ම "තනි වගකීම" සෑම විටම මට ආත්මීය යෙදුමක් ලෙස පහර දෙයි. නිදසුනක් වශයෙන්, චතුරස්රාකාර විසඳුමක දී, වෙනස් කොට සැලකීම ගණනය කිරීම වෙනම වගකීමක් විය යුතුද? නැතහොත් සමස්ත චතුරස්රාකාර සූත්‍රය තනි වගකීමක් විය හැකිද? මම තර්ක කරන්නේ එය වෙනස් කොට සැලකීම සඳහා ඔබට වෙනම භාවිතයක් තිබේද යන්න මත රඳා පවතින බවය - එසේ නොමැතිනම් එය වෙනම වගකීමක් ලෙස සැලකීම අතිරික්තය.
ස්ටීව් 314

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

90

ව්‍යුහාත්මකව ප්‍රිය කරන විවිධ භාවිතයන් පිළිබඳව සාකච්ඡා කරන ඩොනල්ඩ් නූත්ගේ 1974 පුවත්පත් ව්‍යුහගත ක්‍රමලේඛනය ප්‍රකාශන වෙත ගොස් ඔබට කියවිය හැකිය go to. ඒවාට සමාන breakහා continueප්‍රකාශ ඇතුළත් වේ (එහි ඇති බොහෝ භාවිතයන් go toවඩා සීමිත ඉදිකිරීම් දක්වා වර්ධනය කර ඇත). ඔබේ ලොක්කා නුත් නරක ක්‍රමලේඛකයෙකු ලෙස හැඳින්විය හැකිද?

(උදාහරණ පොලී මට ලබා දී ඇත. සාමාන්යයෙන්, breakසහ continueඑක් ඇතුළු වීම හා කේතය ඕනෑම කෑල්ලක් එක් කලහොත්, සහ පුද්ගලයා ඒ ආකාරයේ ද බහු මත ගෙඩිත් වැනි අය විසින් අප්රිය returnප්රකාශ.)


8
තනි පිවිසුම් හා පිටවීමේ ස්ථාන ලබා ගැනීම සඳහා කාර්යයන් හා ක්‍රියා පටිපාටිවලට කැමති බොහෝ දෙනා හැදී වැඩුණේ පැස්කල් මත ය. පැස්කල් යනු මම ඉගෙන ගත් පළමු භාෂාව නොවේ, නමුත් එය අද දක්වා මම කේත සැකසෙන ආකාරය කෙරෙහි ප්‍රබල බලපෑමක් ඇති කළේය. මගේ ජාවා කේතය කියවීම කොතරම් පහසුදැයි මිනිසුන් නිතරම අදහස් දක්වයි. එයට හේතුව මම පිටවීමේ ස්ථාන කිහිපයක් මෙන්ම කේත සමඟ ප්‍රකාශයන් අන්තර් සම්බන්ධ කිරීම මග හැරීමයි. ක්‍රමවේදයක භාවිතා වන සෑම දේශීය විචල්‍යයක්ම ක්‍රමයේ ඉහළින්ම ප්‍රකාශ කිරීමට මම උපරිම උත්සාහයක් දරමි. ක්‍රමවේදයන් සාරාංශගතව තබා ගැනීමට මට බල කිරීමෙන් මෙම ක්‍රියාව කේත රම්බල් කිරීමෙන් වළක්වයි.
bit-twiddler

5
පැස්කල්ට කූඩු කාර්යයන් ද තිබුණි. කියන්න ...
ෂෝග් 9

6
මට මතක ඇති පරිදි, අතීතයේ දී, කාර්යයන් වලදී බහු ප්‍රතිලාභ ප්‍රකාශ වලට මිනිසුන් අකමැති වීමට ප්‍රධාන හේතුව වූයේ නිදොස් කරන්නන් ඒවා නිසි ලෙස හසුරුවා නොතිබීමයි. ශ්‍රිතයක් අවසානයේ බ්‍රේක්පොයින්ට් එකක් තැබීම සැබෑ වේදනාවක් වූ නමුත් කලින් ප්‍රකාශයක් නිසා ඔබ එය කිසි විටෙකත් පහර දුන්නේ නැත. වර්තමානයේ මම භාවිතා කරන සෑම සම්පාදකයෙකුටම එය තවදුරටත් ගැටළුවක් නොවේ.
ඩන්ක්

28
@ bit-twiddler: මට ඒ ගැන එතරම් විශ්වාස නැත. මම අදටත් පැස්කල් භාවිතා කරන අතර, සාමාන්‍යයෙන් මම සලකන්නේ "තනි පිවිසුම් තනි පිටවීමක්" හෝ අවම වශයෙන් එහි තනි පිටවීමේ කොටස, භාණ්ඩ සංස්කෘතික වැඩසටහන් ලෙසය. මම සලකා Break, Continueසහ Exitමගේ උපකරණ කට්ටලය මෙවලම් ලෙස, කේතය අනුගමනය කිරීම පහසු කරවන තැන මම ඒවා භාවිතා කරමි, එය කියවීමට අපහසු වන තැන ඒවා භාවිතා නොකරන්න.
මේසන් වීලර්

2
@ bit-twiddler: ඒ සඳහා ආමෙන්. ඔබ තිරය මතට පහසුවෙන් ගැලපෙන බ්ලොක් වලට බැසගත් පසු, පිටවීමේ ස්ථාන බොහෝ කරදරකාරී වන බව මම එකතු කරමි.
ෂොග් 9

46

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

ඔබේ ක්‍රියාකාරිත්වය දිගු නම් සහ ඔබට බහු කැදැලි ලූප තිබේ නම් මෙය යම් අර්ථයක් ලබා දෙයි. කෙසේ වෙතත්, ඔබේ කාර්යයන් කෙටි විය යුතු අතර, ඔබ ලූප සහ ඒවායේ සිරුරු ඔවුන්ගේම කෙටි කාර්යයන් සඳහා ඔතා තිබිය යුතුය. සාමාන්‍යයෙන්, ශ්‍රිතයකට තනි පිටවීමේ ලක්ෂ්‍යයක් ඇති කර ගැනීමට බල කිරීම ඉතා සංක්ෂිප්ත තර්කනයකට හේතු විය හැක.

ඔබේ ක්‍රියාකාරිත්වය ඉතා කෙටි නම්, ඔබට තනි පුඩුවක් තිබේ නම්, හෝ නරකම කැදැලි දෙකක් තිබේ නම්, සහ ලූප ශරීරය ඉතා කෙටි නම්, a breakහෝ a continueකරන්නේ කුමක්ද යන්න ඉතා පැහැදිලිය . බහුවිධ returnප්‍රකාශයන් කරන්නේ කුමක්ද යන්නත් පැහැදිලිය .

රොබට් සී. මාටින් විසින් "පිරිසිදු කේතය" සහ මාටින් ෆෝලර් විසින් "ප්‍රතිනිර්මාණය කිරීම" යන කරුණු වලදී මෙම ගැටළු විසඳනු ලැබේ.


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

2
Ik මිහායිල්: චක්‍රීය සංකීර්ණතාව සාමාන්‍යයෙන් ශ්‍රී ලංකා ඔලිම්පික් කමිටුව සමඟ දැඩි ලෙස සම්බන්ධ වී ඇති අතර එයින් අදහස් කරන්නේ “දිගු කාර්යයන් ලිවීමෙන් තොරව” උපදෙස් සරල කළ හැකි බවයි.
ජෝන් ආර්. ස්ට්‍රෝම්

3
තනි පිටවීමේ ස්ථානයක් පිළිබඳ අදහස පුළුල් ලෙස වැරදියට අර්ථකථනය කර ඇත. වරෙක, කාර්යයන් සඳහා ඔවුන්ගේ ඇමතුම ආපසු ලබා දිය යුතු නොවීය. ඔවුන්ට වෙනත් ස්ථානයකට ආපසු යා හැකිය. එකලස් කිරීමේ භාෂාවෙන් මෙය බහුලව සිදු විය. ෆෝට්රාන්ට මේ සඳහා විශේෂ ඉදිකිරීමක් තිබුණි; ඔබට ඇම්පියර්සෑන්ඩ් වලට පෙර ප්‍රකාශන අංකයකින් සමත් විය හැකි CALL P(X, Y, &10)අතර, දෝෂයක් ඇති වුවහොත්, එම ඇමතුම වෙත ආපසු යාම වෙනුවට ශ්‍රිතයට එම ප්‍රකාශය පාලනය කළ හැකිය.
kevin cline

නිදසුනක් ලෙස ලුවා සමඟ දැක ඇති පරිදි කෙවින්ක්ලයින්.
ක්වික්ස් - මොනිකා

1
jcjsimon ඔබට එය ලැබුණා. කාර්යයන් පමණක් කුඩා විය යුතුය. පන්ති ද කුඩා විය යුතුය.
ඩීමා

44

නරක ක්‍රමලේඛකයින් නිරපේක්ෂව කථා කරයි (සිත් මෙන්). හොඳ ක්‍රමලේඛකයින් හැකි පැහැදිලි විසඳුම භාවිතා කරයි ( අනෙක් සියල්ල සමාන වේ ).

විවේකය සහ නිතර භාවිතා කිරීම කේතය අනුගමනය කිරීම දුෂ්කර කරයි. නමුත් ඒවා ප්‍රතිස්ථාපනය කිරීමෙන් කේතය අනුගමනය කිරීම වඩාත් අපහසු වේ නම් එය නරක වෙනසක් වේ.

ඔබ දුන් ආදර්ශය නිසැකවම බිඳීම් සහ අඛණ්ඩව ප්‍රතිස්ථාපනය කළ යුතු තත්වයකි.


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

9
ඔබ යෝජනා කළ ආදේශන කේතයේ උදාහරණයක් කුමක්ද? ආරක්ෂක ප්‍රකාශ සඳහා එය තරමක් සාධාරණ උදාහරණයක් යැයි මම සිතුවෙමි.
simgineer

මට පෙනෙන පරිදි "හැකි පැහැදිලි විසඳුම" සෑම විටම ... හැකි ද? “පැහැදිලි” විසඳුමක් නොතිබුණේ කෙසේද? නමුත් එවිට, මම නිරපේක්ෂයෙකු නොවේ, එබැවින් සමහර විට ඔබ නිවැරදිය.

comnocomprende මට විශ්වාස නෑ ඔයා මොනවද කරන්නේ කියලා. මෙහි ඇති “හැකි” හොඳම විසඳුම නොපවතින බවක් අඟවන්නේ නැත - එම පරිපූර්ණ, අවසාන පැහැදිලිකම පමණක් දෙයක් නොවේ. එය ආත්මීයයි.
මතෙව්

25

හැසිරීම පහසුවෙන් පුරෝකථනය කළ නොහැකි නිසා බොහෝ අය සිතන්නේ එය නරක අදහසක් බවයි. ඔබ කේතය කියවන විට සහ while(x < 1000){}x> = 1000 වන තෙක් එය ක්‍රියාත්මක වනු ඇතැයි ඔබ සිතන්නේ නම් ... නමුත් මැද විවේක තිබේ නම් එය සත්‍යයක් නොවේ, එබැවින් ඔබට ඔබේ විශ්වාස කළ නොහැක ලූප් ...

මිනිසුන් GOTO ට අකමැති එකම හේතුව එයයි: නිසැකවම, එය හොඳින් භාවිතා කළ හැකිය, නමුත් එය දේවභක්තික ස්පැගටි කේතයට ද හේතු විය හැක, එහිදී කේතය අහඹු ලෙස කොටසේ සිට අංශයට පැනේ.

මට නම්, මම එක කොන්දේසියකට වඩා වැඩි ගණනක් බිඳ දැමූ ලූපයක් කිරීමට යන්නේ නම්, මම පිටතට යාමට while(x){}අවශ්‍ය වූ විට X ව්‍යාජ ලෙස ටොගල් කරන්නෙමි. අවසාන ප්‍රති result ලය සමාන වනු ඇති අතර, කේතය කියවන ඕනෑම කෙනෙකුට X හි අගය වෙනස් කළ දේවල් දෙස වඩාත් සමීපව බැලීමට දැන ගත හැකිය.


2
+1 ඉතා හොඳින් පවසා ඇති අතර +1 (මට තවත් දෙයක් කළ හැකි නම්) while(notDone){ }ප්‍රවේශය සඳහා.
FrustratedWithFormsDesigner

5
මිහායිල්: විවේකය පිළිබඳ ගැටළුව නම්, ලූපය සඳහා වන අවසාන කොන්දේසිය කිසි විටෙකත් එක තැනක සරලව ප්‍රකාශ නොකිරීමයි. එමඟින් ලූපයෙන් පසු පශ්චාත් තත්වය පුරෝකථනය කිරීම අපහසු වේ. මෙම සුළු සිද්ධියේදී (> = 1000) එය දුෂ්කර නොවේ. බොහෝ නම්-ප්‍රකාශ සහ විවිධ මට්ටම්වල කූඩු එකතු කිරීම, ලූපයේ පශ්චාත් තත්වය තීරණය කිරීම ඉතා අපහසු වනු ඇත.
එස්.ලොට්

එස්.ලොට් නියපොතු හිසට තදින් පහර දුන්නේය. පුනරාවර්තනය පාලනය කරන ප්‍රකාශනයට නැවත නැවත ක්‍රියා කිරීම සඳහා සපුරාලිය යුතු සෑම කොන්දේසියක්ම ඇතුළත් විය යුතුය.
bit-twiddler

8
වෙනුවට break;සමග x=false;ඔබගේ කේතය වඩා පැහැදිලි කරන්නේ නැහැ. එම ප්‍රකාශය සඳහා ඔබ තවමත් ශරීරය සෙවිය යුතුය. ඔබ තව දුරටත් පහළට x=false;නොපැමිණෙන බව පරීක්ෂා කර බැලිය යුතුය x=true;.
Sjoerd

15
මිනිසුන් "මම x දකින අතර මම y යැයි උපකල්පනය කරමි, නමුත් ඔබ z කළහොත් එම උපකල්පනය" මම සිතන්නේ නැඹුරු "එබැවින් එම මෝඩ උපකල්පනය නොකරන්න" යනුවෙනි. බොහෝ අය එය සරල කරනු ඇත්තේ "මා දුටු විට while (x < 1000)එය 1000 වතාවක් ධාවනය වනු ඇතැයි මම සිතමි". හොඳයි, තියෙනවා බොහෝ හේතු ඇයි පවා නම් බොරු බව, xමුලින් ශුන්ය වේ. නිදසුනක් ලෙස, xලූපය තුළ එක් වරක් හරියටම වැඩි කරන ලද අතර වෙනත් ආකාරයකින් වෙනස් නොකළේ කවුද? ඔබගේ උපකල්පනය සඳහා වුවද, යමක් සැකසීමෙන් x >= 1000ලූපය අවසන් වනු ඇතැයි අදහස් නොකෙරේ - තත්වය පරීක්ෂා කිරීමට පෙර එය නැවත පරාසයට සකසා ගත හැකිය.
ස්ටීව් 314

16

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

කොසරාජුගේ පාලන ව්‍යුහයන්ගේ ධූරාවලිය නමින් පරිගණක විද්‍යා ප්‍රති result ලයක් ඇත, එය 1973 තරම් and ත අතීතයේ සිට 1974 සිට ගොත් පිළිබඳ නූත්ගේ (තවත්) ප්‍රසිද්ධ පුවත්පතේ සඳහන් වේ. (මෙම නුත් පත්‍රය දැනටමත් ඩේවිඩ් තෝර්න්ලි විසින් නිර්දේශ කර ඇත. .) එස්. රාඕ කොසරාජු 1973 දී ඔප්පු කළ දෙය නම්, අතිරේක විචල්‍යයන් හඳුන්වා නොදී n ට වඩා අඩු බිඳීම් ගැඹුර සහිත වැඩසටහන් වලට ගැඹුර n හි බහු මට්ටමේ බිඳීම් ඇති සියලුම වැඩසටහන් නැවත ලිවිය නොහැකි බවයි . නමුත් එය හුදු න්‍යායාත්මක ප්‍රති .ලයක් පමණක් යැයි කියමු. (අමතර විචල්‍යයන් කිහිපයක් එකතු කරන්න ?! ඔබේ ලොක්කා සතුටු කිරීම සඳහා ඔබට එය කළ හැකිය ...)

මෘදුකාංග ඉංජිනේරු දෘෂ්ටි කෝණයකින් වඩා වැදගත් වන්නේ 1995 දී එරික් එස්. රොබට්ස් විසින් ලූප් පිටවීම් සහ ව්‍යුහගත වැඩසටහන්කරණය: විවාදය නැවත විවෘත කිරීම ( http://cs.stanford.edu/people/eroberts/papers/SIGCSE- 1995 / LoopExits.pdf ). තමාට පෙර සිටි අය විසින් කරන ලද ආනුභවික අධ්‍යයන කිහිපයක් රොබට්ස් සාරාංශ කරයි. නිදසුනක් ලෙස, CS101 වර්ගයේ සිසුන් කණ්ඩායමක් අරාවෙහි අනුක්‍රමික සෙවුමක් ක්‍රියාත්මක කරන ශ්‍රිතයක් සඳහා කේත ලිවීමට ඉල්ලා සිටි විට, අධ්‍යයනයේ කතුවරයා පහත සඳහන් පරිදි, පිටවීම සඳහා විවේකයක් / ආපසු / ගොටෝ භාවිතා කළ සිසුන් ගැන මූලද්රව්යය සොයාගත් විට අනුක්රමික සෙවුම් ලූපය:

වැරදි විසඳුමක් ඉදිරිපත් කළ [මෙම විලාසය] භාවිතා කරමින් වැඩසටහනකට උත්සාහ කළ තනි පුද්ගලයෙකු මට තවම හමු වී නැත.

රොබට්ස් ද එසේ පවසයි:

ෆෝ ලූපයෙන් පැහැදිලි ප්‍රතිලාභයක් ලබා නොගෙන ගැටලුව විසඳීමට උත්සාහ කළ සිසුන්ට වඩා හොඳ ප්‍රති ared ල ලැබුණි: මෙම උපාය මාර්ගයට උත්සාහ කළ සිසුන් 42 දෙනාගෙන් හත් දෙනෙකු පමණක් නිවැරදි විසඳුම් ජනනය කිරීමට සමත් විය. එම අගය 20% ට වඩා අඩු සාර්ථකත්ව අනුපාතයක් නියෝජනය කරයි.

ඔව්, ඔබ CS101 සිසුන්ට වඩා පළපුරුදු විය හැකිය, නමුත් විවේක ප්‍රකාශය භාවිතා නොකර (හෝ ඒ හා සමානව ලූප මැදින් ආපසු පැමිණීම / ගොටෝ), අවසානයේදී ඔබ කේතයක් ලියනු ඇත නාමික වශයෙන් මනාව ව්‍යුහගතව තිබියදී අමතර තර්කනය අනුව හිසකෙස් ඇති බව ඔබේ ලොක්කාගේ කේතීකරණ විලාසය අනුගමනය කිරීමට උත්සාහ කරන අතරතුර යමෙකු, බොහෝ විට ඔබ විසින්ම තාර්කික දෝෂ ඇති කරන විචල්‍යයන් සහ කේත අනුපිටපත් කිරීම.

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


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

9

මෙම නරක භාවිතයන්ගෙන් එකක් හෝ භාවිතා කිරීම ගැන මම නොසිතමි, නමුත් එකම ලූපයක් තුළ ඒවා ඕනෑවට වඩා භාවිතා කිරීම මඟින් ලූපයේ භාවිතා වන තර්කනය ගැන නැවත සිතා බැලිය යුතුය. ඒවා අරපිරිමැස්මෙන් භාවිතා කරන්න.


:) ඔව්, මා විසින් සපයන ලද උදාහරණය සංකල්පීය ය
මිහායිල්

7

ඔබ දුන් ආදර්ශයට විවේකයක් හෝ ඉදිරියට යාමට අවශ්‍ය නැත:

while (primary-condition AND
       loop-count <= 1000 AND
       time-exec <= 3600) {
   when (data != "undefined" AND
           NOT skip)
      do-something-useful;
   }

ඔබේ උදාහරණයේ ඇති පේළි 4 සමඟ ඇති මගේ 'ගැටලුව' නම්, ඒවා සියල්ලම එකම මට්ටමක පවතින නමුත් ඒවා වෙනස් දේ කරයි: සමහර බිඳීම්, සමහරක් දිගටම ... ඔබ එක් එක් පේළිය කියවිය යුතුය.

මගේ කැදැලි ප්‍රවේශය තුළ, ඔබ වඩාත් ගැඹුරට යන විට, කේතය වඩාත් 'ප්‍රයෝජනවත්' වේ.

එහෙත්, ගැඹුරින් ඔබ ලූපය නැවැත්වීමට හේතුවක් සොයා ගනී නම් (ප්‍රාථමික තත්වය හැර), විවේකයක් හෝ නැවත පැමිණීම එහි භාවිතය සඳහා හේතු වේ. ඉහළ මට්ටමේ තත්වයේදී පරීක්ෂා කළ යුතු අතිරේක ධජයක් භාවිතා කිරීමට වඩා මම කැමතියි. විවේකය / ආපසු පැමිණීම වඩාත් සෘජු ය; එය තවත් විචල්‍යයක් සැකසීමට වඩා අභිප්‍රාය ප්‍රකාශ කරයි.


+1 නමුත් ඇත්ත වශයෙන්ම ඔබේ <සැසඳීම් <=OPs විසඳුමට
අනුරූප

3
බොහෝ අවස්ථාවන්හීදී, යමෙකු ප්‍රවාහ පාලනය කිරීම සඳහා විවේකයක් / ප්‍රතිලාභයක් භාවිතා කිරීමට තරම් ගැඹුරු නම්, කෙනෙකුගේ ක්‍රියාකාරිත්වය / ක්‍රමය ඉතා සංකීර්ණ වේ.
bit-twiddler

6

"නරකකම" රඳා පවතින්නේ ඔබ ඒවා භාවිතා කරන ආකාරය මත ය. ඇල්ගොරිතමයක් නැවත ප්‍රතිනිර්මාණය කිරීමෙන් සුරැකිය නොහැකි චක්‍රයන් ඉතිරි කරන විට මම සාමාන්‍යයෙන් ලූප ඉදිකිරීම් වල විවේක භාවිතා කරමි. නිදසුනක් ලෙස, නිශ්චිත දේපලක වටිනාකමක් ඇති අයිතමයක් සත්‍ය ලෙස සකසා ඇති එකතුවක් හරහා පාපැදි පැදීම. ඔබ දැනගත යුතු සියල්ල නම්, එක් අයිතමයක් මෙම දේපල සත්‍ය ලෙස සකසා ඇත්නම්, ඔබ එම ප්‍රති result ලය ලබා ගත් පසු, නිසි පරිදි ලූපය අවසන් කිරීම සඳහා විවේකයක් හොඳයි.

විවේකයක් භාවිතා කිරීමෙන් කේතය කියවීමට පහසු නොවනු ඇත, සැලකිය යුතු ආකාරයකින් සැකසීමේදී චක්‍ර ධාවනය කිරීමට හෝ සුරැකීමට කෙටි නොවේ නම්, ඒවා භාවිතා නොකිරීම වඩාත් සුදුසුය. මා අනුගමනය කරන ඕනෑම කෙනෙකුට මගේ කේතය පහසුවෙන් බැලීමට සහ සිදුවන්නේ කුමක්දැයි සොයා ගැනීමට හැකි බව සහතික කර ගැනීමට හැකි සෑම විටම මම "අඩුම පොදු හරයට" කේත කිරීමට නැඹුරු වෙමි (මම මෙය සැමවිටම සාර්ථක නොවේ). අමුතු පිවිසුම් / පිටවීමේ ස්ථාන හඳුන්වා දෙන නිසා විවේක එය අඩු කරයි. අනිසි ලෙස භාවිතා කිරීමෙන් ඔවුන්ට "ගොටෝ" ප්‍රකාශය මෙන් හැසිරිය හැකිය.


මම කරුණු දෙකටම එකඟයි! ඔබගේ දෙවන කරුණ තරම් - මගේ මුල් ලිපිය ඉංග්‍රීසි මෙන් කියවන නිසා එය අනුගමනය කිරීම පහසු යැයි මම සිතමි. ඔබට 1 නම් ප්‍රකාශයේ කොන්දේසි සංයෝජනයක් තිබේ නම්, සත්‍යය ක්‍රියාත්මක කිරීමට නම් කුමක් සිදුවිය යුතුද යන්න වටහා ගැනීම පාහේ තේරුම් ගැනීමකි.
මිහායිල්

Ik මිහායිල්: ඔබ ලබා දුන් සාම්පල නිශ්චිත යථාර්ථවාදය සඳහා ටිකක් පරාර්ථකාමී ය. මා දකින පරිදි, එම සාම්පල පැහැදිලි, සංක්ෂිප්ත, කියවීමට පහසුය. බොහෝ ලූප එවැනි නොවේ. බොහෝ ලූපවලට ඔවුන් ක්‍රියා කරන වෙනත් තර්කනයක් ඇති අතර වඩාත් සංකීර්ණ කොන්දේසි ඇත. මෙම අවස්ථා වලදී කඩාවැටීම / ඉදිරියට යාම හොඳම භාවිතය නොවන්නේ එය කියවීමේදී තර්කනය මඩ කරන බැවිනි.
ජොයෙල් ඊතර්ටන්

4

නියත වශයෙන්ම නැත ... ඔව් භාවිතය gotoනරක ය, මන්ද එය ඔබගේ වැඩසටහනේ ව්‍යුහය පිරිහීමට ලක්වන අතර පාලන ප්‍රවාහය තේරුම් ගැනීම ද දුෂ්කර ය.

නමුත් ප්රකාශ භාවිතය කැමති breakසහ continueමේ දින පරම අවශ්ය සියලු නරක වැඩසටහන් පුහුණු ලෙස සැලකුවේ නැත.

ද භාවිතා දී පාලනය ගලා අවබෝධ කර ගැනීමට අපහසු නොවන බව breakසහ continue. වැනි නිර්මාණය කරන දී switchමෙම breakප්රකාශය පරම අවශ්ය වේ.


2
මම 1981 දී ප්‍රථම වරට සී ඉගෙන ගත් දා සිට "දිගටම" භාවිතා කර නොමැත. එය අනවශ්‍ය භාෂා ලක්ෂණයකි, මන්ද අඛණ්ඩ ප්‍රකාශය මඟ හරින කේතය කොන්දේසි සහිත පාලන ප්‍රකාශයකින් ඔතා තැබිය හැකිය.
bit-twiddler

13
මගේ කේතය ඊතල කේතයක් නොවන බවට වග බලා ගන්නා බැවින් එම අවස්ථා වලදී දිගටම භාවිතා කිරීමට මම කැමැත්තෙමි. ගොටෝ වර්ගයේ ප්‍රකාශයන්ට වඩා මම ඊතල කේතයට වෛර කරමි. මම එය කියවූයේ, "මෙම ප්‍රකාශය සත්‍ය නම්, මෙම ලූපයේ ඉතිරි කොටස මඟ හැර ඊළඟ ක්‍රියාවලිය සමඟ ඉදිරියට යන්න." එය ලූපයක් සඳහා ආරම්භයේදීම ඉතා ප්‍රයෝජනවත් වේ (ලූප අතර අඩු ප්‍රයෝජනවත් වේ).
jsternberg

stjsternberg ජයග්‍රහණය සඳහා! :-)
නොටින් ලැයිස්තුව

3

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

අර්ධ වශයෙන්, මෙම දුෂ්කරතාවයෙන් පිළිබිඹු වන්නේ ඔබේ කේතය පිළිබඳව සංකල්පමය වශයෙන් තර්ක කිරීමට හැකි වීමයි.

අවංකවම, ඔබේ දෙවන කේතය පැහැදිලි නැත. එය කරන්නේ කුමක්ද? දිගටම 'ඉදිරියට' යනවාද, නැතහොත් එය 'ඊළඟ' ලූපයද? මට අදහසක් නැහැ. අවම වශයෙන් ඔබේ පළමු උදාහරණය පැහැදිලි ය.


කළමනාකරු ඒවා භාවිතා කිරීමට බැඳී සිටින ව්‍යාපෘතියක මා වැඩ කරන විට, එහි භාවිතය මතක තබා ගැනීම සඳහා මට ගැලීම් සටහනක් භාවිතා කිරීමට සිදු වූ අතර පිටවීමේ මාර්ග කිහිපයක් වඩාත් අවුල් සහගත කේතයක් බවට පත් කළේය ...
umlcat

ඔබේ “අවංක” ප්‍රකාශය සින්ටැක්ටික් ය - “ඊළඟ” යනු අශෝභන දෙයකි; සාමාන්‍ය භාෂාවන් "දිගටම කරගෙන යන්න" යන්නෙහි තේරුම "මෙම ලූපය මඟහරින්න" යන්නයි
මිහායිල්

Ik මික්, සමහර විට "මෙම ක්‍රියාවලිය මඟහරින්න" වඩා හොඳ විස්තරයක් වනු ඇත. ඇත්ත වශයෙන්ම, ආචාර්ය අයි.එම්. පෙඩන්ටික්
පීට් විල්සන්

Ik මිහායිල්: ෂුවර්. නමුත් යමෙකු භාෂා ගණනාවකින් වැඩ කරන විට, භාෂා අතර වාක්‍ය ඛණ්ඩය පොදු නොවන විට එය දෝෂ වලට තුඩු දිය හැකිය.
පෝල් නේතන්

නමුත් ගණිතය වැඩසටහන්කරණය නොවේ . කේතය ගණිතයට වඩා ප්‍රකාශිත ය. මම ලබා තනි ඇතුළත් / තනි-පිටවීමේ ගැලීම් හොදින් සලකනව, බලන්න මොකක්ද වියදම් (උදා:. විවේකයක් / නැවත කේතය වඩා හොඳ ඉටු කිරීමට හැකි) දී ඇති වෙන්න පුළුවන් ද?
ඉවාන් ප්ලේස්

3

මම ඔබේ දෙවන කේත ස්නිපටය ආදේශ කරමි

while (primary_condition && (loop_count <= 1000 && time_exect <= 3600)) {
    if (this->data != "undefined" && this->skip != true) {
        ..
    }
}

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


මම එකඟ නොවූ විට, "ඇත්ත වශයෙන්ම මෙය කියවීමට පහසු යැයි මම සිතමි" මෙය ඉහත කේතය හා සමාන අරමුණක් ඉටු කරයි. මම මේ දක්වා කෙටි පරිපථ ක්‍රියාකරුවෙකු ලෙස 'බිඳීම' ගැන කිසි විටෙකත් නොසිතුවෙමි. “සාමාන්‍යයෙන් ඔබේ ලූප සඳහා කොන්දේසි එම ලූප තත්වයන් තුළම අඩංගු විය යුතුය”, ලූප් අර්ථ දැක්වීමේදී කොන්දේසිගත තර්කනය ඇතුළත් කිරීමට ක්‍රමයක් නොමැති බැවින් ඔබ පුරෝකථන ලූපයක් සැකසීමේදී ඔබ කරන්නේ කුමක්ද?
ඉවාන් ප්ලේස්

මෙම තත්ත්වය @Evan වෙත අදාළ නොවේ foreachමේක එකතුවක් සෑම අයිතමය වඩාත් කැපීපෙනේ ඇත ලෙස පුඩුවක්. ඒ forපුඩුවක් එය කොන්දේසි අවසන් වන්නේ නැහැ යුතු බව හා සමාන වේ. ඔබට කොන්දේසි සහිත අවසාන ලක්ෂ්‍යයක් අවශ්‍ය නම් ඔබ whileලූපයක් භාවිතා කළ යුතුය.
එල් රොනෝකෝ

1
@Evan නමුත්, මා ඔබගේ අදහස් බලන්න එපා - එනම් 'ඔබ foreach ලූපය ඉවත් බිඳ දැමීම සඳහා අවශ්ය නම් කුමක් ද?' ' - හොඳයි, එහි එක් විය යුතු breakඋපරිම කම්බියක් සිට මගේ මතය.
එල් රොනොකෝ

2

මම ඔබේ ලොක්කා සමඟ එකඟ නොවෙමි. සඳහා නිසි ස්ථාන ඇත breakහා continueභාවිතා කිරීමට. ඇත්ත වශයෙන්ම නවීන ක්‍රමලේඛන භාෂාවන්ට ව්‍යතිරේකයන් සහ ව්‍යතිරේක හැසිරවීම් හඳුන්වා දීමට හේතුව නම් ඔබට සෑම ගැටලුවක්ම සාධාරණ ලෙස භාවිතා කළ නොහැකි structured techniquesවීමයි.

පැත්තක සටහනක මට මෙහි ආගමික සාකච්ඡාවක් ආරම්භ කිරීමට අවශ්‍ය නැති නමුත් ඔබේ කේතය මේ ආකාරයෙන් කියවිය හැකි පරිදි ප්‍රතිව්‍යුහගත කළ හැකිය:

while (primary_condition) {
    if (loop_count > 1000) || (time_exect > 3600) {
        break;
    } else if ( ( this->data != "undefined") && ( !this->skip ) ) {
       ... // where the real work of the loop happens
    }
}

තවත් පැත්තක සටහනක

මම ( flag == true )දැනටමත් කොන්දේසි සහිතව භාවිතා කිරීමට අකමැතියි, මන්ද විචල්‍යය දැනටමත් බූලියන් නම්, ඔබ බූලියන් වල වටිනාකමට අවශ්‍ය පිළිතුර ඇති විට සිදුවිය යුතු අතිරේක සංසන්දනයක් ඔබ හඳුන්වා දෙයි - ඇත්ත වශයෙන්ම ඔබේ සම්පාදකයාට එය විශ්වාස කළ නොහැකි නම් එම අමතර සංසන්දනය දුරස් කරන්න.


මම අවුරුදු ගාණක් තිස්සේ මේ ප්‍රශ්නය ඇහුවා. ඔබගේ මාර්ගය ('if (ධජය) {...}') වඩා දැඩි වන අතර සමහර විට එය 'වෘත්තීය' හෝ 'විශේෂ expert' ලෙස පෙනේ. එහෙත්, ඔබ දන්නවා, බොහෝ විට එයින් අදහස් කරන්නේ ඉදිකිරීම් වල තේරුම සිහිපත් කිරීම සඳහා පා er කයෙකුට / නඩත්තු කරන්නෙකුට කෙටියෙන් බාධා කළ යුතු බවයි; සහ පරීක්ෂණයේ හැඟීම ගැන සහතික වන්න. දැනට, මම 'if (flag == true) {...}' භාවිතා කරන්නේ එය වඩා හොඳ ලියකියවිලි ලෙස පෙනෙන නිසාය. ලබන මාසයේ? ක්වීන් සබ්?
පීට් විල්සන්

2
Et පීට් - මෙම පදය දැඩි නොව අලංකාරය . ඔබට අවශ්‍ය සියල්ල වොෆ්ල් කළ හැකිය, නමුත් පා booleanwhat කයාට / නඩත්තු කරන්නාට කුමක් දැයි නොතේරෙන බවට හෝ දැඩි / අලංකාර පාරිභාෂිතයේ තේරුම කුමක් දැයි ඔබ කනස්සල්ලට පත්ව සිටී නම්, සමහර විට ඔබ වඩා හොඳ නඩත්තු කරන්නන් බඳවා ගැනීම වඩා හොඳය ;-)
Zeke Hansell

Et පීට්, ජනනය කළ කේතය පිළිබඳ මගේ ප්‍රකාශය වෙනුවෙන් මම පෙනී සිටිමි. ප්‍රකාශනයේ බූලියන් අගය තක්සේරු කිරීමට පෙර ධජයක් නියත අගයකට සංසන්දනය කිරීමෙන් ඔබ තවත් එක් සංසන්දනයක් කරමින් සිටී. එය තිබිය යුතු ප්‍රමාණයට වඩා අමාරු කරන්නේ ඇයි, ධජ විචල්‍යයට දැනටමත් ඔබට අවශ්‍ය අගය ඇත!
Zeke Hansell

+1 හොඳ රැකියාවක්. කලින් උදාහරණයට වඩා බොහෝ අලංකාරයි.
ඉවාන් ප්ලේස්

2

මම ඔබේ ලොක්කා සමඟ එකඟ වෙමි. ඉහළ චක්‍රීය සංකීර්ණතාවයකින් යුත් ක්‍රම නිපදවන බැවින් ඒවා නරක ය. එවැනි ක්රම කියවීමට අපහසු වන අතර පරීක්ෂා කිරීමට අපහසු වේ. වාසනාවකට පහසු විසඳුමක් තිබේ. ලූප් බොඩි වෙනම ක්‍රමයකට නිස්සාරණය කරන්න, එහිදී “ඉදිරියට” “ආපසු” යයි. "නැවත පැමිණීම" වඩා හොඳ වන්නේ "ආපසු" ගිය පසු එය අවසන් වී ඇති හෙයිනි - ප්‍රාදේශීය රාජ්‍යය ගැන කරදරයක් නැත.

"බිඳීම" සඳහා ලූපය වෙනම ක්‍රමයකට උකහා ගන්න, "විවේකය" වෙනුවට "ආපසු" යන්න.

උපුටා ගත් ක්‍රමවලට තර්ක විශාල සංඛ්‍යාවක් අවශ්‍ය නම්, එය පන්තියක් උපුටා ගැනීම සඳහා ඇඟවීමකි - එක්කෝ ඒවා සන්දර්භය වස්තුවකට එකතු කරන්න.


0

මම හිතන්නේ එය ගැටළුවක් වන්නේ බහුවිධ වළලු තුළ ගැඹුරින් කූඩු කළ විට පමණි. ඔබ කුමන ලූපයකට කැඩී ඇත්දැයි දැන ගැනීම දුෂ්කර ය. දිගටම කරගෙන යාමද දුෂ්කර විය හැකිය, නමුත් මම සිතන්නේ සැබෑ වේදනාව පැමිණෙන්නේ විවේකයෙන් - තර්කනය අනුගමනය කිරීමට අපහසු විය හැකිය.


2
ඇත්ත වශයෙන්ම, ඔබ නිසියාකාරව ඉන්ඩෙන්ට් කර ඇත්දැයි බැලීමට පහසුය, එම ප්‍රකාශවල අර්ථ නිරූපණය අභ්‍යන්තරීකරණය කර ඇති අතර නිදිමත නොවේ.

eldelnan - එය බොහෝ උපකල්පන;)
davidhaskins

2
ඔව්, විශේෂයෙන් අන්තිමයා.
මයිකල් කේ

හොඳයි, කෙසේ වෙතත් බැරෑරුම් ක්‍රමලේඛනය සඳහා # 1 අවශ්‍ය වේ, # 2 ක්‍රමලේඛකයා ලෙස හඳුන්වන සියල්ලන්ගෙන් අපේක්ෂා කළ යුතු අතර # 3 පොදුවේ බෙහෙවින් ප්‍රයෝජනවත් වේ;)

සමහර භාෂා (මා දන්නා ස්ක්‍රිප්ටින් පමණි) සහාය දක්වයි break 2; අනෙක් අය සඳහා, තාවකාලික බූල් කොඩි භාවිතා කරන බව මම අනුමාන කරමි
මිහායිල්

0

පහත දැක්වෙන උදාහරණයේ දී මෙන් වෙස්වළාගත් ගොටෝ ලෙස ඒවා භාවිතා නොකරන තාක් කල්:

do
{
      if (foo)
      {
             /*** code ***/
             break;
      }

      if (bar)
      {
             /*** code ***/
             break;
      }
} while (0);

මම ඔවුන් සමඟ හොඳින්. (නිෂ්පාදන කේතයේ දැක්වෙන උදාහරණය, ​​මෙහ්)


කාර්යයන් නිර්මාණය කිරීම සඳහා මෙවැනි අවස්ථා සඳහා ඔබ නිර්දේශ කරනවාද?
මිහායිල්

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

ඔහ්, මම එකඟයි, මම ඇසුවේ ඔබ එය කරන්නේ කෙසේද යන්නයි :) පරිගණක විද්‍යා scientists යන් එය නැවත නැවතත් කරයි
මිහායිල්

0

මම මේ විලාසිතාවන්ටවත් කැමති නැහැ. මෙන්න මම කැමති දේ:

function verify(object)
{
    if not (object->value < 0) 
       and not(object->value > object->max_value)
       and not(object->name == "") 
       {
         do somethign important
       }
    else return false; //probably not necessary since this function doesn't even seem to be defined to return anything...?
}

returnශ්‍රිතයක් නවතා දැමීමට භාවිතා කිරීමට මම ඇත්තටම කැමති නැත . එය අපයෝජනයක් ලෙස දැනේ return.

භාවිතා breakකිරීම සැමවිටම කියවීමට පැහැදිලි නැත.

වඩා හොඳ තවමත් විය හැකිය:

notdone := primarycondition    
while (notDone)
{
    if (loop_count > 1000) or (time_exect > 3600)
    {
       notDone := false; 
    }
    else
    { 
        skipCurrentIteration := (this->data == "undefined") or (this->skip == true) 

        if not skipCurrentIteration
        {
           do something
        } 
        ...
    }
}

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

(ඉහත කේත සියල්ලම ව්‍යාජ කේත වේ)


11
මා ඉහත ටයිප් කළ දෙයට වඩා මට්ටම් 3 ක කැදැල්ලට ඔබ කැමතිද?
මිහායිල්

Ik මිහායිල්: ඔව්, නැතහොත් මම තත්වයේ ප්‍රති result ලය විචල්‍යයකට පවරමි. breakසහ තර්කනයට වඩා තේරුම් ගැනීම මට පහසු ය continue. අසාමාන්‍ය ලෙස ලූපයක් අවසන් කිරීම අමුතු බවක් දැනෙන අතර මම එයට කැමති නැත.
FrustratedWithFormsDesigner

1
හාස්‍යයට කරුණක් නම්, ඔබ මගේ කොන්දේසි වැරදියට කියවා ඇත. continueක්‍රියාකාරීත්වය මඟ හැරීම ඊළඟ ලූපයට යන්න; "
ution ාතනය

Ik මිහායිල්: අහ්. මම එය බොහෝ විට භාවිතා නොකරන අතර එය කියවන විට, අර්ථයෙන් මම ව්‍යාකූල වෙමි. මම එයට අකමැති තවත් හේතුවක්. : P යාවත්කාලීන කිරීමට මට විනාඩියක් දෙන්න ...
FrustratedWithFormsDesigner

7
ඕනෑවට වඩා කැදැල්ල කියවීමේ හැකියාව විනාශ කරයි. සමහර විට, විවේකයෙන් වැළකීම / ඉදිරියට යාම ඔබේ කොන්දේසිගත පරීක්ෂණ වලදී ඔබේ තර්කනය හරවා යැවීමේ අවශ්‍යතාවය හඳුන්වා දෙයි, එමඟින් ඔබේ කේතය කරන්නේ කුමක්ද යන්න වැරදි ලෙස අර්ථකථනය කිරීමට හේතු විය හැකිය - මම දැන් කියමි
Zeke Hansell

0

නැත. එය ගැටළුවක් විසඳීමට ක්‍රමයක් වන අතර එය විසඳීමට වෙනත් ක්‍රම තිබේ.

බොහෝ වර්තමාන ප්‍රධාන ධාරාවේ භාෂා (ජාවා, .නෙට් (සී # + වීබී), පීඑච්පී, ඔබේම දෑ ලියන්න) ලූප මඟ හැරීම සඳහා "බිඳීම" සහ "දිගටම" භාවිතා කරන්න. ඔවුන් දෙදෙනාම "ව්‍යුහගත ගොටෝ (ය)" වාක්‍ය.

ඔවුන් නොමැතිව:

String myKey = "mars";

int i = 0; bool found = false;
while ((i < MyList.Count) && (not found)) {
  found = (MyList[i].key == myKey);
  i++;   
}
if (found)
  ShowMessage("Key is " + i.toString());
else
  ShowMessage("Not found.");

ඔවුන් සමග:

String myKey = "mars";

for (i = 0; i < MyList.Count; i++) {
  if (MyList[i].key == myKey)
    break;
}
ShowMessage("Key is " + i.toString());

"බිඳීම" සහ "ඉදිරියට" කේතය කෙටි වන අතර සාමාන්‍යයෙන් "වාක්‍ය" සඳහා "හෝ" හෝ "පුරෝකථනය" වාක්‍ය බවට හැරෙන බව සලකන්න.

මෙම අවස්ථා දෙකම කේතීකරණ විලාසය පිළිබඳ කාරණයකි. මම ඒවා භාවිතා නොකිරීමට කැමැත්තෙමි , මන්ද වාචික විලාසය මට කේතය වැඩි පාලනයක් ලබා ගැනීමට ඉඩ සලසයි.

මම ඇත්ත වශයෙන්ම, සමහර ව්‍යාපෘතිවල වැඩ කරමි, එහිදී එම වාක්‍ය භාවිතා කිරීම අනිවාර්ය විය.

සමහර සංවර්ධකයින් සිතන්නේ ඔවුන් නෙක්සරිලි නොවන බවයි, නමුත් උපකල්පිතයි, අපට ඒවා ඉවත් කිරීමට සිදු වූවා නම්, අපට "අතර" සහ "අතරතුර" ඉවත් කිරීමට සිදු වේ ("පැස්කල් යාලුවනේ)";

නිගමනය, මම ඒවා භාවිතා නොකිරීමට කැමති වුවද, මම හිතන්නේ එය විකල්පයක් මිස නරක ක්‍රමලේඛ පුහුණුවක් නොවේ.


අච්චාරු වීම ගැන කණගාටුයි, නමුත් ඔබේ දෙවන උදාහරණය යතුර සොයාගත නොහැකි වූ විට ප්‍රතිදානය අස්ථානගත වී ඇත (එබැවින් ඇත්ත වශයෙන්ම එය එතරම් කෙටි බව පෙනේ).
FrustratedWithFormsDesigner

2
පළමු උදාහරණය ක්‍රියාත්මක වන්නේ ලැයිස්තුවේ අවසාන යතුර නම් පමණක් බව සඳහන් නොකල යුතුය.
මිහායිල්

UstFrustratedWithFormsDesigner හරියටම. එම ක්‍රමය වඩාත් සුදුසු වන්නේ මන්දැයි දැක්වීමට මම පර්පවුස් පැළඳ සිටියෙමි ;-)
umlcat

කෙසේ වෙතත්, ඔබට විවිධ අර්ථකථන සහිත චර්යාවන් දෙකක් තිබේ; එබැවින් ඒවා තර්කානුකූලව සමාන නොවේ.
bit-twiddler

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

0

මම විරුද්ධ continueහා breakප්‍රතිපත්තිමය වශයෙන් නොවේ, නමුත් මම සිතන්නේ ඒවා ඉතා පහත් මට්ටමේ ඉදිකිරීම් වන අතර ඒවා බොහෝ විට ඊටත් වඩා හොඳ දෙයක් මගින් ප්‍රතිස්ථාපනය කළ හැකිය.

මම මෙහි නිදසුනක් ලෙස C # භාවිතා කරමි, එකතුවක් හරහා නැවත කියවීමට අවශ්‍ය අවස්ථාව සලකා බලන්න, නමුත් අපට අවශ්‍ය වන්නේ යම් පුරෝකථනයක් ඉටු කරන මූලද්‍රව්‍යයන් පමණක් වන අතර උපරිම පුනරාවර්තන 100 කට වඩා වැඩි ප්‍රමාණයක් කිරීමට අපට අවශ්‍ය නැත.

for (var i = 0; i < collection.Count; i++)
{
    if (!Predicate(item)) continue;
    if (i >= 100) break; // at first I used a > here which is a bug. another good thing about the more declarative style!

    DoStuff(item);
}

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

foreach (var item in collection.Where(Predicate).Take(100))
    DoStuff(item);

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

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


-1

කේත සම්පුර්ණ කිරීම භාවිතා කිරීම පිළිබඳ හොඳ අංශයක් gotoසහ සාමාන්‍ය හෝ ලූප වලින් බහු ප්‍රතිලාභ ඇත.

පොදුවේ එය නරක පුරුද්දක් නොවේ. breakනැතහොත් continueඊළඟට කුමක් සිදුවේදැයි හරියටම කියන්න. මම මේකට එකඟයි.

විවිධ gotoප්‍රකාශ භාවිතා කිරීමේ වාසි පෙන්වීමට ස්ටීව් මැක්කොනෙල් (කේත සම්පුර්ණ කතුවරයා) ඔබ හා සමාන උදාහරණ භාවිතා කරයි .

කෙසේ වෙතත්, අධික ලෙස භාවිතා කිරීම breakහෝ continueසංකීර්ණ හා හඳුනාගත නොහැකි මෘදුකාංගයකට තුඩු දිය හැකිය.

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.