پادکرد

**پادکرد (Undo)** یک تکنیک تعاملی است که در بسیاری از برنامه‌های رایانه‌ای پیاده‌سازی شده است. این تکنیک آخرین تغییر انجام شده در سند را پاک می‌کند و آن را به حالت قدیمی‌تر برمی‌گرداند. در برخی برنامه‌های پیشرفته‌تر، مانند پردازش گرافیکی ، پادکرد آخرین فرمان انجام شده در فایل در حال ویرایش را خنثی می‌کند. با امکان پادکرد، کاربران می‌توانند بدون ترس از اشتباه کردن، کاوش و کار کنند، زیرا به آسانی می‌توان آنها را پادکرد کرد.

انتظارات از فرمان undo به آسانی قابل درک است: داشتن یک عملکرد قابل پیش‌بینی و شامل شدن تمام فرمان‌ها "قابل پادکرد".  معمولاً فرمان undo تا زمانی که کاربر تمام عملیات اجرا شده را پادکرد نکند، در دسترس است. اما برخی از اقدامات وجود دارند که در فهرست پادکرد ذخیره نمی‌شوند و بنابراین نمی‌توان آنها را پادکرد کرد. به عنوان نمونه، *ذخیره فایل* قابل پادکرد نیست، اما در فهرست در صف قرار می‌گیرد تا نشان دهد که اجرا شده است. عمل دیگری که معمولاً ذخیره نمی‌شود و بنابراین قابل پادکرد نیست، *پیمایش* یا *انتخاب* است. 

فرمان redo عمل undo را برعکس می‌کند یا بافر را به حالت جدیدتری می‌برد. (یا: برعکس عمل undo، عمل **redo** است.)

اجزای رایج قابلیت پادکرد، *فرمان‌های* هستند که بدست کاربر اجرا شده‌اند، *بافر(های) تاریخچه* که اقدامات تکمیل‌شده را ذخیره می‌کنند، *مدیر پادکرد/بازانجام* برای کنترل بافر تاریخچه، و *رابط کاربری* برای تعامل با کاربر. 

در بیشتر برنامه‌های گرافیکی برای بیشتر سامانه عامل‌های رایج (مانند مایکروسافت ویندوز ، لینوکس و BSDها )، میانبر صفحه کلید برای فرمان undo، Ctrl+Z یا Alt+Backspace و میانبر برای redo، Ctrl+Y یا Ctrl + Shift +Z است. در بیشتر برنامه‌های macOS، میانبر برای فرمان undo، Command -Z و میانبر برای redo، Command - Shift -Z است. در همه پلتفرم‌ها، می‌توان از طریق منوی Edit نیز به توابع undo/redo دسترسی پیدا کرد.

## تاریخچه
توانایی پادکرد یک عملیات در رایانه، چندین بار به طور مستقل و در پاسخ به نحوه کاربری مردم از رایانه اختراع شد. 

سامانه بازیابی و ویرایش فایل، که از سال ۱۹۶۸ در دانشگاه براون توسعه یافت، گزارش شده است که نخستین سامانه مبتنی بر رایانه است که دارای ویژگی "پادکرد" بوده است.

وارن تیتلمن تا سال ۱۹۷۱ یک *دستیار برنامه‌نویس را* به عنوان بخشی از BBN-LISP با یک تابع Undo توسعه داد. 

ماروین زلکوویتز در پایان‌نامه دکترای خود (اجرای برگشت‌پذیر به عنوان یک ابزار تشخیصی) در سال ۱۹۷۱ در دانشگاه کرنل، مفهوم اجرای برگشت‌پذیر را پیشنهاد کرد که اساساً یک پادکرد است. آلن ام. دیویس در پایان‌نامه دکترای خود (یک سامانه تحلیل تعاملی برای خطاهای زمان اجرا) در دانشگاه ایلینوی در اوربانا-شمپین در سال ۱۹۷۵، مفهوم زلکوویتز را گسترش داد تا نشان دهد که چگونه پادکرد چند سطحی (یعنی اجرای برگشت‌پذیر چند لایه‌ای) می‌تواند برای اشکال‌زدایی برنامه‌های نرم‌افزاری کاربری شود.

ویرایشگر نوشتار Xerox PARC Bravo در سال ۱۹۷۴ یک فرمان Undo داشت. یک گزارش تحقیقاتی در سال ۱۹۷۶ بدست لنس ای. میلر و جان سی. توماس از آی‌بی‌ام با عنوان « *مسائل رفتاری در کاربری از سامانه‌های تعاملی»* ،  اشاره کرد که «بسیار مفید خواهد بود که به کاربران اجازه داده شود حداقل فرمان بلافاصله قبل را (با صدور یک فرمان ویژه «undo») «پس بگیرند».  برنامه‌نویسان مرکز تحقیقاتی Xerox PARC میانبر صفحه کلید Ctrl-Z را به فرمان undo اختصاص دادند، که به یک ویژگی حیاتی ویرایشگرهای نوشتار و پردازشگرهای واژه در دوران رایانه‌های شخصی تبدیل شد. در سال ۱۹۸۰، لری تسلر از Xerox PARC کار خود را در شرکت اپل رایانه آغاز کرد. در آنجا، او و بیل اتکینسون از وجود یک فرمان undo به عنوان یک قطعه استاندارد در اپل لیزا حمایت کردند. اتکینسون توانست توسعه‌دهندگان نرم‌افزار کاربردی لیزا را متقاعد کند که یک سطح واحد از undo و redo را در نظر بگیرند، اما در لابی کردن برای سطوح چندگانه ناموفق بود.&#x5B;*[[ویکی‌پدیا:نیازمند منبع|<span title="This claim needs references to reliable sources. (October 2018)">نیازمند منبع</span>]]*&#x5D; وقتی اپل جانشین لیزا، مکینتاش ، را معرفی کرد، تصریح کرد که همه برنامه‌های استاندارد باید شامل «واگرد» به عنوان نخستین فرمان در منوی «ویرایش» باشند، که تا به امروز به عنوان استاندارد در مک‌او‌اس و ویندوز باقی مانده است.

فرمان‌های پادکرد چند لایه‌ای در دهه ۱۹۸۰ معرفی شدند و به کاربران اجازه می‌دادند مجموعه‌ای از اقدامات را، نه فقط آخرین اقدام، به عقب برگردانند.  EMACS و سایر ویرایشگرهای صفحه نمایش اشتراکی، قبل از نرم‌افزار رایانه شخصی، این قابلیت را داشتند. CygnusEd نخستین ویرایشگر نوشتار Amiga با ویژگی پادکرد/دوباره نامحدود بود. AtariWriter ، یک برنامه پردازش واژه که در سال ۱۹۸۲ معرفی شد، دارای ویژگی پادکرد بود. NewWord، یکی دیگر از برنامه‌های پردازش واژه که بدست NewStar در سال ۱۹۸۴ منتشر شد، دارای فرمان پادکرد حذف بود. VisiWord شرکت آی‌بی‌ام نیز دارای فرمان پادکرد حذف بود.

## مدل‌های Undo و Redo
مدل‌های پادکرد (undo) را می‌توان به صورت خطی یا غیرخطی طبقه‌بندی کرد. مدل پادکرد غیرخطی را می‌توان به زیرگروه‌های مدل اسکریپت، مدل us&r، مدل سه‌گانه و پادکرد گزینشی طبقه‌بندی کرد.

برخی از ویژگی‌های رایج مدل‌ها عبارتند از:

* *ویژگی اجرای پایدار:* یک حالت به صورت فهرستی مرتب از فرمان‌ها نمایش داده می‌شود. این بدان معناست که یک فرمان «همیشه در حالتی که پس از اجرای اولیه به آن رسیده است، پادکرد می‌شود.»
* *اجرای پایدار ضعیف:* این بدان معناست که اگر undo اجرا شود، تمام فرمان‌های که به فرمان undo وابسته هستند، وابسته به آن فرمان undo می‌شوند.
* *ویژگی نتیجه پایدار:* این ویژگی معنای مشابهی با *ویژگی اجرای پایدار* دارد، با این تفاوت که فهرست فرمان‌ها را نشان می‌دهد. فهرست مرتب شده فرمان‌ها شامل فرمان‌های است که اجرا شده‌اند، نه فقط فرمان‌ها.
* *جابجایی‌پذیر:* این بدان معناست که حالت حاصل پس از پادکرد و انجام مجدد دو فرمان مختلف، زمانی که آنها به ترتیب معکوس اجرا شوند، یکسان است.
* *ویژگی پادکرد حداقلی:* این ویژگی بیان می‌کند که «عملیات پادکرد فرمان C فقط فرمان C و تمام فرمان‌ها کوچکتر از C که به C وابسته هستند را خنثی می‌کند.»

### پادکرد خطی
پادکرد خطی با یک پشته ( ساختار داده آخرین ورودی، نخستین خروجی (LIFO)) پیاده‌سازی می‌شود که تاریخچه‌ای از همه‌ی فرمان‌ها اجرا شده را ذخیره می‌کند. وقتی یک فرمان نو افزون می‌شود، به بالای پشته افزون می‌شود. بنابراین، تنها آخرین فرمان اجرا شده را می‌توان خنثی کرد و از تاریخچه حذف کرد. پادکرد را می‌توان تا زمانی که تاریخچه خالی نباشد، تکرار کرد.

#### مدل خطی محدود
مدل خطی محدود، مدلی توسعه‌یافته از مدل پادکرد خطی است. این مدل *، ویژگی اجرای پایدار* توصیف‌شده در بالا برای پادکرد خطی را برآورده می‌کند، زیرا این مدل در صورتی که فرمانی در حالی انجام شود که فهرست تاریخچه شامل فرمان‌ها دیگری باشد، این ویژگی را حفظ نمی‌کند. مدل خطی محدود، فهرست تاریخچه را قبل از اضافه شدن فرمان جدید پاک می‌کند. اما محدودیت‌های دیگری نیز موجود است. به عنوان نمونه، اندازه فهرست تاریخچه می‌تواند محدود شود یا وقتی به اندازه تعریف‌شده‌ای رسید، نخستین فرمان اجرا شده از فهرست حذف می‌شود.

### پادکرد ناخطی
تفاوت اصلی بین پادکرد خطی و پادکرد غیرخطی، امکان پادکرد فرمان‌ها اجرا شده به ترتیب دلخواه بدست کاربر است. آنها این شانس را دارند که به جای آخرین فرمان، فرمانی را از فهرست انتخاب کنند. برای مدل غیرخطی، زیرکلاس‌هایی وجود دارند که این مدل را پیاده‌سازی می‌کنند.

#### مدل اسکریپت
مدل اسکریپت، اقدامات کاربر را به عنوان ویرایش اسکریپتی از فرمان‌ها مدیریت می‌کند. فهرست تاریخچه فرمان‌ها اجرا شده به صورت «به عنوان یک اسکریپت تفسیر می‌شود، اثر یک پادکرد (undo) به گونه‌ای تعریف می‌شود که گویی عمل پادکرد شده هرگز در وهله اول رخ نداده است.» در نتیجه پادکرد، وضعیت باید به گونه‌ای باشد که گویی فرمان پادکرد شده هرگز اجرا نشده است. یکی از معایب این مدل این است که کاربر باید ارتباط بین فرمان پادکرد شده و وضعیت فعلی را بداند تا از عوارض جانبی جلوگیری کند. یکی از این موارد می‌تواند به عنوان نمونه تکرار باشد. مشکلات دیگر این است که اگر «فرمان‌ها بعدی در حالت متفاوتی نسبت به حالت اولیه خود در رابط‌های دستکاری مستقیم اجرا شوند، این تفسیر مجدد از عمل اصلی کاربر همیشه واضح یا به خوبی تعریف شده نیست.»

#### مدل US&R
ویژگی خاص این مدل این است که گزینه‌ی رد کردن یک فرمان را دارد. این بدان معناست که می‌توان از انجام مجدد یک فرمان صرف نظر کرد. فرمانی که رد می‌شود به عنوان رد شده علامت‌گذاری می‌شود اما حذف نمی‌شود. هنگامی که فرمان‌ها جدید اجرا می‌شوند، فهرست تاریخچه حفظ می‌شود، بنابراین ترتیب فرمان‌ها اجرا شده را می‌توان با آن تکرار کرد. این ترتیب را می‌توان از طریق یک درخت تاریخچه که یک نمودار جهت‌دار است توصیف کرد، "زیرا می‌توان فرمان‌ها را از شاخه‌ی دیگری که پیوندی در نمودار ایجاد می‌کند، به انجام مجدد ادامه داد". اگرچه مجموعه‌ی فرمان‌ها ساده و قابل فهم است، اما ساختار پیچیده با پرش و پیوند شاخه‌ها، زمانی که کاربر می‌خواهد بیش از یک مرحله را پادکرد کند، درک و به خاطر سپردن آن دشوار است.

#### مدل سه‌گانه
این مدل undo غیرخطی علاوه بر undo و redo، امکان چرخش نیز دارد. این مدل دارای ساختار داده‌ای مشابه مدل‌های فوق با یک فهرست تاریخچه و یک فهرست redo جداگانه است که شامل عملیات redo می‌شود. عملیات rotate آخرین فرمان فهرست redo را در جلوی خود قرار می‌دهد. از یک طرف، این بدان معناست که می‌توان فرمان بعدی که قرار است redo شود را با قرار دادن آن در جلو انتخاب کرد. از طرف دیگر، چرخش می‌تواند "برای انتخاب مکانی در فهرست redo که عملیات undo بعدی فرمان را در آن قرار می‌دهد" کاربری شود. بنابراین، فهرست redo نامرتب است. "برای undo یک فرمان جداگانه، کاربر باید تعدادی از مراحل را undo کند، فهرست redo را بچرخاند و سپس تعدادی از مراحل را redo کند." برای redo، فهرست باید چرخانده شود تا فرمان مورد نظر در بالا قرار گیرد.

### پادکرد گزینشی
یاکوبک و همکارانش می‌گویند که پادکرد گزینشی ویژگی‌ای است که یک مدل می‌تواند ارائه دهد، اما برای پادکرد گزینشی تعریف مشخصی وجود ندارد. نویسندگان توابعی را انتخاب کرده‌اند که یک مدل هنگام پشتیبانی از پادکرد گزینشی باید داشته باشد. باید بتوان "هر عمل اجرا شده در بافر تاریخچه را خنثی کرد. اقدامات مستقل از عملی که خنثی می‌شود باید دست نخورده باقی بمانند". درست مانند آن، انجام مجدد باید برای هر فرمان پادکرد شده امکان‌پذیر باشد. سومین تابع برای پادکرد گزینشی این است که "هیچ فرمانی نمی‌تواند به طور خودکار از بافر تاریخچه بدون درخواست مستقیم کاربر حذف شود." برای پادکرد گزینشی، پادکرد و انجام مجدد خارج از هر زمینه‌ای قابل اجرا هستند. سه مسئله اصلی وجود دارد. اول این است که فرمان‌ها پادکرد شده می‌توانند خارج از زمینه اصلی باشند. از این طریق می‌توان ارجاعات مرده‌ای وجود داشته باشد که باید مدیریت شوند. مسئله دوم این است که فرمان‌ها اصلاح شده را می‌توان خنثی کرد و بنابراین باید حل شود که کدام حالت پس از پادکرد ارائه خواهد شد. مسئله سوم، مشکلات دور انداختن فرمان‌ها است. فرمان undo گزینشی هیچ اشاره‌گری در فهرست‌ها ندارد، بنابراین این بدان معناست که هیچ فرمانی نباید از پشته حذف شود.

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

### برنامه چند کاربره
وقتی چندین کاربر می‌توانند همزمان یک سند را ویرایش کنند، به یک پادکرد چندکاربره نیاز است. پادکرد *سراسری* چندکاربره، آخرین اقدام انجام شده روی سند را صرف نظر از اینکه چه کسی ویرایش را انجام داده است، برمی‌گرداند. پادکرد *محلی* چندکاربره فقط اقدامات انجام شده بدست کاربر محلی را برمی‌گرداند، که نیاز به پیاده‌سازی پادکرد غیرخطی دارد.

در جایی که می‌توان از undo برای بازگشت به عقب در چندین ویرایش کاربری کرد، فرمان redo در طول تاریخچه اقدامات به جلو می‌رود. ایجاد یک ویرایش جدید معمولاً فهرست redo را پاک می‌کند. اگر از یک مدل redo شاخه‌ای کاربری شود، ویرایش جدید تاریخچه اقدامات را *شاخه‌ای می‌کند* .

تعداد اقدامات قبلی که می‌توانند پادکرد شوند، بسته به برنامه، نسخه و قابلیت‌های سخت‌افزاری یا نرم‌افزاری متفاوت است. برای نمونه، اندازه پیش‌فرض پشته پادکرد/بازانجام در Adobe Photoshop برابر با 20 است، اما کاربر می‌تواند آن را تغییر دهد. به عنوان نمونهی دیگر، قبلاً  نسخه‌های قبلی مایکروسافت پینت فقط اجازه می‌دادند تا سه ویرایش پادکرد شوند؛ نسخه معرفی‌شده در ویندوز ۷ این محدودیت را به ۵۰ افزایش داد.

ویژگی‌های ساده و تک ویرایشیِ پادکرد (undo) گاهی اوقات با در نظر گرفتن خود فرمان پادکرد به عنوان عملی که می‌توان آن را پادکرد کرد، «redo» را از بین می‌برند. این به عنوان مدل پادکرد معکوس شناخته می‌شود، زیرا کاربر می‌تواند با کاربری از فرمان پادکرد، بین دو حالت برنامه جابجا شود. این مدل استاندارد قبل از پذیرش گسترده پادکرد چند سطحی در اوایل دهه 1990 بود.

## پیاده‌سازی را پادکرد کنید
عمل Undo را می‌توان از طریق الگوهای مختلفی پیاده‌سازی کرد. رایج‌ترین الگوها، الگوی command و الگوی memento هستند.

### الگوی فرمان
الگوی فرمان (command pattern) یک الگوی طراحی نرم‌افزار است که اطلاعات حاصل از عملیات را در اشیاء فرمان (command objects) کپسوله‌سازی می‌کند. این بدان معناست که هر عملی در یک شیء ذخیره می‌شود. کلاس فرمان انتزاعی (abstract command class) یک عملیات اجرای انتزاعی (abstract execute operation) را پیاده‌سازی می‌کند، بنابراین هر شیء فرمان دارای یک عملیات اجرا (execut operation) است. برای پادکرد (undo) نیز باید یک عملیات اجرا نشده (unexecut operation) وجود داشته باشد که اثر فرمان اجرا شده را خنثی می‌کند و در یک فهرست تاریخچه (history list) ذخیره می‌شود. پادکرد (undo) و انجام مجدد (redo) به گونه‌ای پیاده‌سازی شده‌اند که هنگام فراخوانی فرمان اجرا یا پادکرد، فهرست به جلو و عقب اجرا شود. 

برای پادکرد یک مرحله‌ای، فقط فرمان اجرا شده ذخیره می‌شود. برخلاف پادکرد چند مرحله‌ای که نه تنها فهرست تاریخچه فرمان‌ها ذخیره می‌شود، بلکه تعداد سطوح پادکرد نیز با توجه به حدبیشتر طول فهرست قابل تعیین است. 

### الگوی یادگاری
با الگوی یادگاری، وضعیت داخلی یک شیء ذخیره می‌شود. شیء‌ای که وضعیت در آن ذخیره می‌شود، یادگاری نامیده می‌شود و از طریق مبدأ یادگاری سازماندهی می‌شود. این الگو یک یادگاری را برمی‌گرداند که با اطلاعات وضعیت فعلی، هنگام اجرای undo، مقداردهی اولیه شده است تا وضعیت قابل بررسی باشد. یادگاری فقط برای مبدأ قابل مشاهده است.

در الگوی یادگاری، مکانیزم پادکرد، متصدی (Caretaker) نامیده می‌شود. این مکانیزم مسئول نگهداری یادگاری‌ها است، اما هرگز محتوای آنها را تغییر نمی‌دهد. برای پادکرد، متصدی درخواست یک یادگاری از مبدأ می‌کند و سپس پادکرد را اعمال می‌کند. 

بخش عمده‌ای از مکانیزم پادکرد عملیات (undo) می‌تواند بدون وابستگی به برنامه‌های خاص یا کلاس‌های فرمان پیاده‌سازی شود. این شامل «مدیریت فهرست تاریخچه، پیمایشگر تاریخچه، ورودی‌های منو برای پادکرد و انجام مجدد و به‌روزرسانی ورودی‌های منو بسته به نام فرمان بعدی در دسترس» می‌شود. 

هر کلاس فرمانی یک متد do دارد که هنگام اجرای یک فرمان فراخوانی می‌شود. متد undo عملیات معکوس متد do را پیاده‌سازی می‌کند. برای پیاده‌سازی معکوس، چندین استراتژی مختلف وجود دارد.

* *چک پوینت کامل *':*** این بدان معناست که وضعیت کامل پس از اجرای یک فرمان ذخیره می‌شود. این ساده‌ترین پیاده‌سازی است، اما کارایی بالایی ندارد و بنابراین اغلب کاربری نمی‌شود.
* ''اجرای مجدد کامل:'' بنابراین، حالت اولیه ذخیره می‌شود و می‌توان از طریق «شروع با حالت اولیه و اجرای مجدد تمام فرمان‌ها از ابتدای تاریخچه» به هر حالت در فهرست تاریخچه دسترسی پیدا کرد. 
* ''ایست بازرسی جزئی ''':*** این پرکاربردترین استراتژی است. حالت تغییر یافته برنامه ذخیره می‌شود و با undo، بخشی از حالت به مقدار اولیه خود برمی‌گردد.
* *تابع معکوس:* تابع معکوس به اطلاعات وضعیت ذخیره شده نیاز ندارد. "برای نمونه، حرکت را می‌توان با حرکت دادن جسم به عقب به میزان نسبی معکوس کرد."  برای پادکرد گزینشی، اطلاعات کافی برای ذخیره وضعیت وجود ندارد.

## همچنین ببینید

* محاسبات برگشت‌پذیر
* بازگشت به عقب (مدیریت داده‌ها)
* آن‌دیلیت
* کنترل نسخه (فرمت فایل بومی)

## بنمایه‌ها

## پیوندهای بیرونی

* The Age of Undoing - Article about the linguistic history of Undo at The New York Times Magazine.
* Cascading undo control - a paper focused on what is cascading undo and how it might be presented to users
رده:معرفی‌شده‌های مرتبط با رایانه در ۱۹۶۸ (میلادی)
رده:ویژگی‌های ویرایشگر متن
رده:صفحه‌های با ترجمه بازبینی‌نشده