مفهوم Idempotent در توسعهٔ نرم افزار

در پروسهٔ توسعهٔ نرم افزار زمانی که یه سری کار ها به صورت تکرار انجام بشه و هیچ اتفاقی در اون زمان نیفته به اصلاح میگن این سرویس  

هست

برای درک بیشتر این قضیه فک کنید ما در  php  با توابع  time() داریم اخرین مقدار تایم استمپ رو چک میکنیم. این مقدار در لحظه عوض میشود پس این یک تابع  Idempotent نیست


 زمانی که چندین ریکوئست‌ مشابه تأثیری یکسان با تنها یکی از آن ریکوئست‌ها داشته باشد، گفته می‌شود که سرویس مذکور اصطلاحاً Idempotent است.


فرض کنید  ما یک سرویسی داریم که سایر کاربرها از آن استفاده میکنند. اگر در پروسه توسعه به اشتباه چندین بار یه مقدار رو به سمت سرور ارسال کنیم اما فقط با اولین درخواست نیاز مرتفع میشود. اینجاست که ما به عنوان توسعه دخده جلو درخواست های تکراری رو بگیریم.

منظور از یک ریکوئست Idempotent چیست؟


به طور کلی، چنانچه یک درخواست از جنس HTTP چندین و چند دفعه پشت سر هم فراخوانی شود، نتایج تمامی آن‌ها یکسان خواهد بود و درخواست‌های اضافی منجر به تغییر در وضعیت پاسخ‌های دریافتی نخواهند شد. به عبارتی،‌ خواه یک بار درخواستی را به سمت سرور ارسال کنیم و خواه چند بار، نتیجه یکسان خواهد بود تا جایی که می‌توان گفت نتیجهٔ یک ریکوئست موفقیت‌آمیز مستقل از تعداد دفعاتی است که آن ریئکوست اجرا می‌گردد.

با پیروی کردن از اصول توسعهٔ RESTful API، متدهایی از جنس PUT ،GET و DELETE به صورت خودکار Idempotent هستند اما این در حالی است که متد POST از این خصیصه برخوردار نیست که در ادامه این موضوع را بیشتر مورد بررسی قرار خواهیم داد.

معمولاً از متد POST به منظور ایجاد یک ریسورس جدید استفاده می‌شود و زمانی که یک ریکوئست از این جنس را چند بار پشت سر هم به سمت سرور ارسال می‌کنیم، به همان تعداد ریسورس جدید ایجاد می‌گردد و روی همین حساب هم می‌گوییم که این متد Idempotent نیست. در مقابل، متدهایی همچون OPTIONS ،HEAD ،GET و ... تحت هیچ عنوان وضعیت ریسورس را در سمت سرور تغییر نمی‌دهند بلکه صرفاً به منظور فراخوانی دیتا می‌توانند مورد استفاده قرار گیرند و به طور مثال تکرار چند درخواست از جنس GET منجر به تغییر روی دیتای ذخیره‌شده در سمت سرور نمی‌گردد.

متد PUT هم معمولاً به منظور آپدیت دیتا مورد استفاده قرار می‌گیرد و اگر N دفعه درخواستی از این جنس را فراخوانی کنیم، صرفاً اولین درخواست ارسالی به سمت سرور منجر به آپدیت ریسورس مد نظر شده و دیگر درخواست‌هایی که در ادامه ارسال می‌شوند (N-1) صرفاً منجر به اُورراید (بازنویسی) وضعیت ریسورس شده و در عمل منجر به تغییر چیزی نمی‌شوند و از همین روی هم می‌توان گفت که متد PUT نیز Idempotent است.

زمانی هم که متد DELETE را بارها تکرار کنیم، اولین ریکوئست منجر به حذف ریسورس شده و کد وضعیتی همچون 200 در معرض دیدمان قرار می‌گیرد و دیگر ریکوئست‌ها (N-1) منجر به دریافت پاسخ 404 می‌شوند چرا که دیگر چنین ریسورسی وجود ندارد که بخواهیم آن را حذف کنیم و از همین روی متد DELETE نیز Idempotent است.

نویسنده
پوریا سبحانلو

پوریا سبحانلو

سلام من پوریا هستم

چند سالی هست تو وب فعال هستم و برنامه نویسی میکنم

اوایل با php کار میکردم بعد ها سریع به پلتفرم های جاوا اسکریپت علاقه مند شدم و الان در حال یادگیری React هستم