අවිනිශ්චිත මෙහෙයුමක් යනු කුමක්ද?
Answers:
පරිගණනයේදී, අයිඩෙම්පොටෙන්ට් මෙහෙයුමක් යනු එකම ආදාන පරාමිතීන් සමඟ එක් වරකට වඩා හැඳින්වුවහොත් අමතර බලපෑමක් ඇති නොවන එකකි. නිදසුනක් ලෙස, කට්ටලයකින් අයිතමයක් ඉවත් කිරීම කට්ටලයේ අනන්යතා මෙහෙයුමක් ලෙස සැලකිය හැකිය.
ගණිතයේ දී, idempotent මෙහෙයුමක් යනු f (f (x)) = f (x) . නිදසුනක් ලෙස, abs()
ශ්රිතය අනන්යතාවයෙන් යුක්ත වන්නේ abs(abs(x)) = abs(x)
සියල්ලන්ටම යx
.
ගණිතමය අර්ථ දැක්වීමේ x යනු වස්තුවක තත්වය නිරූපණය කරන බව සලකා බැලීමෙන් මෙම තරමක් වෙනස් අර්ථ දැක්වීම් සමථයකට පත් කළ හැකි අතර f යනු එම වස්තුව විකෘති කළ හැකි මෙහෙයුමකි. උදාහරණයක් ලෙස, පයිතන්set
සහ එහි discard
ක්රමය සලකා බලන්න . මෙම discard
ක්රමය මඟින් මූලද්රව්යයක් කට්ටලයකින් ඉවත් කරන අතර මූලද්රව්යය නොපවතී නම් කිසිවක් නොකරයි. නිසා:
my_set.discard(x)
එකම මෙහෙයුම දෙවරක් සිදු කිරීමට හරියටම සමාන බලපෑමක් ඇත:
my_set.discard(x)
my_set.discard(x)
අයිඩෙම්පොටෙන්ට් මෙහෙයුම් බොහෝ විට ජාල ප්රොටෝකෝල සැලසුම් කිරීමේදී භාවිතා කරනු ලැබේ, එහිදී මෙහෙයුමක් සිදු කිරීම සඳහා ඉල්ලීමක් අවම වශයෙන් එක් වරක්වත් සිදු වන බවට සහතික වන නමුත් එක් වරකට වඩා සිදු විය හැකිය. මෙහෙයුම අනර්ථකාරී නම්, මෙහෙයුම දෙවරක් හෝ වැඩි ගණනක් සිදු කිරීමෙන් කිසිදු හානියක් සිදු නොවේ.
වැඩි විස්තර සඳහා අයිඩම්පොටෙන්ස් පිළිබඳ විකිපීඩියා ලිපිය බලන්න .
ඉහත පිළිතුරට මීට පෙර වැරදි සහ නොමඟ යවන උදාහරණ කිහිපයක් තිබුණි. පහත අදහස් දැක්වීම් 2014 අපේ්රල් මාසයට පෙර ලියා ඇත්තේ පැරණි සංශෝධනයකට ය.
set
උදාහරණයේ දී, සැකසූ වස්තුවට පැහැදිලිවම රාජ්යයක් ඇති අතර සමහර ප්රබල මෙහෙයුම් ද ඉදිරිපත් කරයි discard
.
discard
ප්රතිලාභ වටිනාකමින් රාජ්යය ඇතුළත් කිරීමෙන් අස්ථායි ආකාරයකින් ක්රියාත්මක කළ හැකිය : discard([my_set, x]) = [my_new_set, x]
. එබැවින් ඔබට කළ හැකිය discard(discard([my_set, x]))
. බව සටහන [my_new_set, x]
වේ එක් තර්කයක් සහ එහි වර්ගය 2-tuple වේ.
discard(x)
දෙවන කාලය පළමු වරට එය ඉල්ලා සමාන බලපෑමක් ඇති වනු ඇත: මෙම කට්ටලය තවදුරටත් අඩංගු වනු ඇත x
. පරමාදර්ශීභාවය ගණනය කිරීම යනු පද්ධතියක ශක්තිමත් බව පිළිබඳව ය. දේවල් අසාර්ථක විය හැකි බැවින් (උදා: ජාල ඇනහිටීම්), අසමත් වීමක් අනාවරණය වූ විට, ඔබ සුවය ලබන්නේ කෙසේද? පහසුම ප්රකෘතිය වන්නේ එය නැවත සිදු කිරීම පමණි, නමුත් එය ක්රියාත්මක වන්නේ එය නැවත සිදු කිරීම නිෂ් id ල නම් පමණි. උදා discard(x)
: අවිනිශ්චිත, නමුත් pop()
එසේ නොවේ. ඒ සියල්ල දෝෂ ප්රකෘතිමත් වීමකි.
අවිනිශ්චිත මෙහෙයුමක් අත්තනෝමතික වාර ගණනක් පුනරාවර්තනය කළ හැකි අතර ප්රති result ලය එය එක් වරක් පමණක් සිදු වූවාක් මෙනි. අංක ගණිතයේ දී, අංකයකට ශුන්ය එකතු කිරීම අනන්යතාවයෙන් යුක්ත වේ.
"RESTful" වෙබ් සේවාවන්හි සන්දර්භය තුළ Idempotence ගැන බොහෝ දේ කතා කෙරේ. වෙබ් අන්තර්ගතයට වැඩසටහන් ලබා දීම සඳහා REST උපරිම වශයෙන් HTTP භාවිතා කිරීමට උත්සාහ කරන අතර සාමාන්යයෙන් එය සකසා ඇත්තේ SOAP මත පදනම් වූ වෙබ් සේවාවන්ට වෙනස්වය, එය HTTP ඉල්ලීම් සහ ප්රතිචාර තුළ දුරස්ථ ක්රියා පටිපාටි ඇමතුම් ශෛලියේ සේවාවන් උමං කරයි.
REST වෙබ් යෙදුමක් "සම්පත්" (ට්විටර් පරිශීලකයෙකු හෝ ෆ්ලිකර් රූපයක් වැනි) ලෙස සංවිධානය කරන අතර එම සම්පත් නිර්මාණය කිරීම, යාවත්කාලීන කිරීම, කියවීම සහ මකා දැමීම සඳහා POST, PUT, GET, සහ DELETE යන HTTP ක්රියා පද භාවිතා කරයි.
REST හි වැදගත්කම වැදගත් කාර්යභාරයක් ඉටු කරයි. ඔබට REST සම්පතක් නිරූපණය කළහොත් (උදා: Flickr වෙතින් jpeg රූපයක් ලබා ගන්න), සහ මෙහෙයුම අසාර්ථක වුවහොත්, මෙහෙයුම සාර්ථක වන තුරු ඔබට නැවත නැවතත් GET නැවත කළ හැකිය. වෙබ් සේවයට, රූපය කොපමණ වාරයක් උපයා ඇත්ද යන්න ගැටළුවක් නොවේ. ඒ හා සමානව, ඔබ ඔබේ ට්විටර් ගිණුම් තොරතුරු යාවත්කාලීන කිරීම සඳහා RESTful වෙබ් සේවාවක් භාවිතා කරන්නේ නම්, වෙබ් සේවාවෙන් තහවුරු කිරීමක් ලබා ගැනීම සඳහා ඔබට අවශ්ය තරම් වාර ගණනක් නව තොරතුරු ඉදිරිපත් කළ හැකිය. එය දහස් වාරයක් PUT-ing එක වරක් PUT-ing හා සමාන වේ. ඒ හා සමානව REST සම්පතක් දහස් වාරයක් මකා දැමීම සමාන වේ. සන්නිවේදන දෝෂ වලට ඔරොත්තු දෙන වෙබ් සේවාවක් තැනීම අයිඩෙම්පොටෙන්ස් පහසු කරයි.
වැඩිදුර කියවීම: රිචඩ්සන් සහ රූබි විසින් රෙස්ට්ෆුල් වෙබ් සේවා (අනන්යතාවය 103-104 පිටුවේ සාකච්ඡා කෙරේ), සහ රෝයි ෆීල්ඩින්ගේ REST පිළිබඳ ආචාර්ය උපාධි නිබන්ධනය . පන්දු රැකීමේ දී idempotence ගැන කතා කරන HTTP 1.1 ක කතුවරයෙකු වන, නේවාසික විදේශ ව්යවහාර මුදල්-2616, විය 9.1.2 කොටස .
ඔබ කොපමණ වාරයක් මෙහෙයුම ඇමතූවත්, ප්රති result ලය සමාන වේ.
truncate
සහ delete
.
Idempotence යන්නෙන් අදහස් කරන්නේ එක් වරක් මෙහෙයුමක් යෙදීම හෝ කිහිප වතාවක් යෙදීමෙන් එකම බලපෑමක් ඇති බවයි.
උදාහරණ:
සඳහා පිරිසිදු කටයුතු (කිසිදු අතුරු සමග කටයුතු), පසුව idempotency බව f (x) එයින් ගම්ය = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... x හි සියලුම අගයන් සඳහා
සඳහා අතුරු ආබාධ සමඟ කටයුතු , idempotency තවද, කිසිදු අමතර අතුරු ආබාධ පළමු යෙදීමෙන් පසුව සිදුවන බවයි. ඔබ කැමති නම් ශ්රිතයට අතිරේක “සැඟවුණු” පරාමිතියක් ලෙස ලෝකයේ තත්වය සලකා බැලිය හැකිය.
ඔබට සමගාමී ක්රියා සිදු වෙමින් පවතින ලෝකයක, ඔබ සිතූ මෙහෙයුම් අශෝභන ලෙස නතර වී ඇති බව ඔබට පෙනී යනු ඇත (නිදසුනක් ලෙස, වෙනත් උදාහරණයකට ඉහත උදාහරණයේ ඇති බූලියන් ධජයේ වටිනාකම සැකසිය නොහැක). මූලික වශයෙන් ඔබ සමගාමී හා විකෘති තත්වයක් ඇති සෑම අවස්ථාවකම, අනන්යතාවය පිළිබඳව වඩාත් හොඳින් සිතා බැලිය යුතුය.
ශක්තිමත් පද්ධති ගොඩනැගීමේදී Idempotency බොහෝ විට ප්රයෝජනවත් දේපලකි. නිදසුනක් ලෙස, ඔබට තෙවන පාර්ශවයකින් අනුපිටපත් පණිවිඩයක් ලැබීමේ අවදානමක් තිබේ නම්, පණිවිඩ හසුරුවන්නා ක්රියා විරහිත මෙහෙයුමක් ලෙස ක්රියා කිරීම ප්රයෝජනවත් වන අතර එමඟින් පණිවිඩයේ බලපෑම එක් වරක් පමණක් සිදු වේ.
f(x) = f(f(x))
, ඔබ අදහස් කරන්නේ f(x){return x+1;}
එය පිරිසිදු ශ්රිතයක් නොවේද? මන්ද f(x) != f(f(x))
: f(1)
2 ක් f(2)
ලබා දෙන අතර 3 ලබා දෙයි.
f(x) = f(f(x))
බවයි. @GregHewgill සඳහන් කළ පරිදි, මෙම අර්ථ දැක්වීම අර්ථවත් කිරීම සඳහා, ඔබ x
වස්තුවක් ලෙසත්, වස්තුවේ f
තත්වය විකෘති කරන මෙහෙයුමක් ලෙසත් සලකා බැලිය යුතුය (එනම්: ප්රතිදානය f
විකෘති වේ x
).
අවිනිශ්චිත මෙහෙයුමක් මඟින් ඔබ එකම පරාමිතීන් තුළ සමත් වුවහොත්, ඔබ එය කිහිප වතාවක් ඇමතුවද, එකම තත්වයේ ප්රති result ලය ලබා දෙයි.
අවිනිශ්චිතතාවය පෙන්නුම් කරන සැබෑ භාවිත නඩුවක් ඉවත දැමීමට අවශ්ය විය. ජාවාස්ක්රිප්ට් හි, ඔබ ආදර්ශ පංති සමූහයක් නිර්වචනය කරන බව පවසන්න (එම්වීසී ආකෘතියේ මෙන්). මෙය බොහෝ විට ක්රියාත්මක කරන ආකාරය ක්රියාකාරීව මේ හා සමාන දෙයකට සමාන වේ (මූලික උදාහරණය):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
එවිට ඔබට මෙවැනි නව පන්ති අර්ථ දැක්විය හැකිය:
var User = model('user');
var Article = model('article');
නමුත් ඔබ User
පන්තිය හරහා යාමට උත්සාහ කරන්නේ නම්model('user')
කේතයේ වෙනත් තැනක සිට එය අසාර්ථක වනු ඇත:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
ඒ දෙක User
ඉදිකිරීම්කරුවන් වෙනස් වනු ඇත. එනම්,
model('user') !== model('user');
එය මුග්ධ බවට පත් කිරීම සඳහා , ඔබ මේ ආකාරයෙන් හැඹිලි යාන්ත්රණයක් එකතු කරනු ඇත:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
හැඹිලි එකතු කිරීමෙන්, ඔබ කළ සෑම අවස්ථාවකම model('user')
එය එකම වස්තුවක් වනු ඇත, එබැවින් එය අනර්ථකාරී ය. නිසා:
model('user') === model('user');
Idempotent operation යනු ප්රති application ලය වෙනස් නොකර කිහිප වතාවක් යෙදිය හැකි මෙහෙයුමක්, ක්රියාවක් හෝ ඉල්ලීමක්, එනම් ආරම්භක යෙදුමෙන් ඔබ්බට පද්ධතියේ තත්වය.
උදාහරණ (WEB APP CONTEXT):
හැඳුනුම්පත: එක හා සමාන ඉල්ලීම් කිහිපයක් කිරීම එකම ඉල්ලීමක් කිරීමට සමාන බලපෑමක් ඇති කරයි. ඊමේල් පණිවිඩ පද්ධතියක පණිවිඩයක් විවෘත කර දත්ත ගබඩාවේ "විවෘත" ලෙස සලකුණු කර ඇත. කෙනෙකුට පණිවිඩය බොහෝ වාරයක් විවෘත කළ හැකි නමුත් මෙම නැවත නැවත ක්රියාවෙන් සිදුවන්නේ එම පණිවිඩය “විවෘත” තත්වයට පත්වීමයි. මෙය අනර්ථකාරී මෙහෙයුමකි. සම්පතට නොගැලපෙන තොරතුරු (පද්ධතියේ තත්වය) භාවිතා කරමින් පළමු වරට යමෙකු සම්පතක් වෙත යාවත්කාලීන කිරීමක් කළ විට, සම්පත යාවත්කාලීන වන විට පද්ධතියේ තත්වය වෙනස් වේ. යමෙක් එකම යාවත්කාලීනයක් සම්පතකට නැවත නැවත ලබා දෙන්නේ නම්, යාවත්කාලීනයේ ඇති තොරතුරු සෑම PUT මත දැනටමත් පද්ධතියේ ඇති තොරතුරු සමඟ ගැලපෙනු ඇති අතර පද්ධතියේ තත්වයට කිසිදු වෙනසක් සිදු නොවේ. එකම තොරතුරු සහිත පුනරාවර්තන PUTs අනර් are ය:
NON-IDEMPOTENT: මෙහෙයුමක් සෑම විටම එකම වෙනසක් පරිශීලකයාට තැපැල් කිරීම වැනි තත්වයේ වෙනසක් ඇති කරයි නම්, එහි ප්රති new ලයක් ලෙස සෑම විටම නව පණිවිඩයක් දත්ත ගබඩාවේ යවා ගබඩා කර තබයි, අපි කියන්නේ මෙහෙයුම NON-IDEMPOTENT බවයි.
NULLIPOTENT: දත්ත සමුදායේ කිසිදු වෙනසක් නොමැතිව වෙබ් පිටුවක තොරතුරු ප්රදර්ශනය කිරීම වැනි මෙහෙයුමකට අතුරු ආබාධ නොමැති නම් (වෙනත් වචන වලින් කිවහොත් ඔබ කියවන්නේ දත්ත සමුදාය පමණි), අපි කියන්නේ මෙහෙයුම NULLIPOTENT බවයි. සියලුම GETs ශුන්ය විය යුතුය.
පද්ධතියේ තත්වය ගැන කතා කරන විට, අපි පැහැදිලිවම නොසලකා හැරීම හා රෝග විනිශ්චය වැනි හානිකර හා නොවැළැක්විය හැකි බලපෑම් නොසලකා හරිමු.
Idempotent Operations: කිහිප වතාවක් ක්රියාත්මක කළහොත් අතුරු ආබාධ නොමැති මෙහෙයුම්.
උදාහරණය : දත්ත
සම්පතකින් අගයන් ලබාගෙන එය මුද්රණය කරයි,
අනන්ය නොවන මෙහෙයුම්: කිහිප වතාවක් ක්රියාත්මක කළහොත් යම් හානියක් සිදු කරන මෙහෙයුම්. (ඔවුන් සමහර අගයන් හෝ තත්වයන් වෙනස් කරන විට)
උදාහරණය: බැංකු ගිණුමකින් ඉවත් වන මෙහෙයුමක්
තරමක් සවිස්තරාත්මක හා තාක්ෂණික පිළිතුරු. සරල අර්ථ දැක්වීමක් එක් කිරීම පමණි.
Idempotent = නැවත ධාවනය කළ හැකි
නිදසුනක් ලෙස,
Create
එක් වරකට වඩා ක්රියාත්මක කළ හොත් එය ක්රියාත්මක නොවී දෝෂයකින් තොරව ක්රියාත්මක වන බවට සහතික නොවේ. නමුත් මෙහෙයුමක් තිබේ CreateOrUpdate
නම් එය නැවත ධාවනය කිරීමේ හැකියාව (Idempotency) සඳහන් කරයි.
කට්ටලයක් හරහා අනර්ථකාරී මෙහෙයුමක් එහි සාමාජිකයන් එක් වරක් හෝ වැඩි ගණනක් යොදන විට නොවෙනස්ව පවතී.
එය නිරපේක්ෂ (x) වැනි ඒකීය ක්රියාවක් විය හැකිය අතර x යනු ධන නිඛිල සමූහයකට අයත් වේ. මෙහි නිරපේක්ෂ (නිරපේක්ෂ (x)) = x.
එය තමන් සමඟ කට්ටලයක් ඒකාබද්ධ කිරීම වැනි ද්විමය මෙහෙයුමක් විය හැකිය සැමවිටම එකම කට්ටලය නැවත ලබා දෙනු ඇත.
චියර්ස්
සෑම නවවන ප්රති result ලයක්ම 1 වන ප්රති .ලයේ වටිනාකමට ගැලපෙන ප්රතිදානයක් ලැබෙනු ඇත. උදාහරණයක් ලෙස -1 හි නිරපේක්ෂ අගය 1. යනු -1 හි නිරපේක්ෂ වටිනාකමෙහි නිරපේක්ෂ අගය 1. යනු 1 හි නිරපේක්ෂ වටිනාකමෙහි නිරපේක්ෂ වටිනාකම 1. සහ එසේ ය.
මෙයද බලන්න: පුනරාවර්තනය භාවිතා කිරීමට ඉතා මෝඩ කාලයක් වන්නේ කවදාද?
අවිනිශ්චිත මෙහෙයුමක් අවබෝධ කර ගැනීම සඳහා හොඳ උදාහරණයක් වන්නේ දුරස්ථ යතුරක් සහිත මෝටර් රථයක් අගුළු දැමීමයි.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
අවිනිශ්චිත මෙහෙයුමක්. ඔබ ධාවනය කරන සෑම අවස්ථාවකම කිසියම් අතුරු ආබාධයක් lock
තිබුනද, ඇස් ඇරීම වැනි, ඔබ කොපමණ වාරයක් අගුලු දැමීමේ ක්රියාවලිය ධාවනය කළද, මෝටර් රථය තවමත් එකම අගුලු දමා ඇත.
මගේ 5 සී: ඒකාබද්ධ කිරීමේ හා ජාලකරණයේ දී අනන්යතාවය ඉතා වැදගත් වේ. සැබෑ ජීවිතයෙන් උදාහරණ කිහිපයක්: සිතන්න, අපි ඉලක්ක පද්ධතියට දත්ත ලබා දෙන්නෙමු. පණිවිඩ මාලාවක් මඟින් දත්ත ලබා දෙනු ලැබේ. 1. නාලිකාව තුළ අනුක්රමය මිශ්ර වුවහොත් කුමක් සිදුවේද? (ජාල පැකේජ සෑම විටම කරන පරිදි :)). ඉලක්කගත පද්ධතිය අවිනිශ්චිත නම්, ප්රති result ලය වෙනස් නොවේ. ඉලක්කගත පද්ධතිය අනුපිළිවෙලෙහි නිවැරදි අනුපිළිවෙල මත රඳා පවතී නම්, අප විසින් ඉලක්කගත අඩවියේ සමානකම් ක්රියාත්මක කළ යුතු අතර එමඟින් නිවැරදි අනුපිළිවෙල යථා තත්වයට පත් වේ. 2. පණිවිඩ අනුපිටපත් තිබේ නම් කුමක් සිදුවේද? ඉලක්ක පද්ධතියේ නාලිකාව කාලෝචිත ලෙස පිළිගන්නේ නැත්නම්, ප්රභව පද්ධතිය (හෝ නාලිකාවම) සාමාන්යයෙන් පණිවිඩයේ තවත් පිටපතක් යවයි. එහි ප්රති As ලයක් ලෙස අපට ඉලක්කගත පද්ධති පැත්තේ අනුපිටපත් පණිවිඩයක් ලබා ගත හැකිය. ඉලක්කගත පද්ධතිය අවිනිශ්චිත නම්, එය එය බලා ගන්නා අතර ප්රති result ලය වෙනස් නොවේ. ඉලක්කගත පද්ධතිය අවිනිශ්චිත නොවේ නම්, අප විසින් නාලිකාවේ ඉලක්කගත පද්ධති පැත්තේ අඩුකිරීම් ක්රියාත්මක කළ යුතුය.
කෙටියෙන් කිවහොත් , අයිඩෙම්පොටෙන්ට් මෙහෙයුම් යනු ඔබ කොපමණ වාරයක් අයිඩම්පොටෙන්ට් මෙහෙයුම් ක්රියාත්මක කළද විවිධ ප්රති results ල නොලැබෙන බවයි.
නිදසුනක් ලෙස, එච්ටීටීපී හි පිරිවිතරයේ අර්ථ දැක්වීම අනුව, GET, HEAD, PUT, and DELETE
අවිනිශ්චිත මෙහෙයුම් වේ; කෙසේ වෙතත් POST and PATCH
එසේ නොවේ. සමහර විට POST
එය ප්රතිස්ථාපනය වන්නේ එබැවිනි PUT
.
නැවත උත්සාහ කරන්න-ආරක්ෂිතයි.
සාමාන්යයෙන් පරිගණක විද්යාවේ එහි තේරුම තේරුම් ගැනීමට ඇති පහසුම ක්රමයයි.
Idempotent operations are often used in the design of network protocols
මෙහි ආශ්රිත උදාහරණයක් ඇති බව පවසන බැවින් ** GET සේවාදායකයේ කිසිවක් වෙනස් කිරීමට නොසිතයි, එබැවින් GET යනු අද්විතීය ය. HTTP / servlet සන්දර්භය තුළ, එයින් අදහස් වන්නේ එකම ඉල්ලීම negative ණාත්මක ප්රතිවිපාක නොමැතිව දෙවරක් කළ හැකි බවයි. ** POST අනර්ථකාරී නොවේ.