ارجاع چرخشی
این مقاله نیازمند ویکیسازی است. لطفاً با توجه به راهنمای ویرایش و شیوهنامه، محتوای آن را بهبود بخشید. (فوریه ۲۰۱۳) |
![]() | این مقاله نیازمند بررسی توسط یک متخصص است. لطفاً پارامتر دلیل یا بحث در این الگو را برای مشخصکردن مشکل مقاله استفاده کنید.(سپتامبر ۲۰۱۴) |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Circular_Reference.svg/220px-Circular_Reference.svg.png)
ارجاع چرخشی یک سری از ارجاعات است که آخرین شی به اولین اشاره میکند که نتیجهاش یک حلقهٔ بستهاست
در زبان
[ویرایش]یک ارجاع دایرهای نباید با یک استدلال غلط به اشتباه گرفته شود با آرگومان دایرهای. اگرچه یک ارجاع دایرهای اغلب غیر مفید و بدون اطلاعات را نشان میدهد، مثل دو ورودی در صفحه اول کتاب به یکدیگر اشاره میکند و آن ضروری نیست که یک ارجاع چرخشی بدون استفاده است. در دیکشنریها به عنوان مثال باید همیشه در نهایت یک ارجاع چرخشی از همه کلمات در یک دیکشنری باشند که در عبارت دیگر تعریف شده، اما یک دیکشنری با این حال یک مرجع مفید باقی میماند. جملاتی که شامل ارجاعات دایره هستند میتوانند هنوز معنیدار باشند:
- برادرش به او یک بچه گربه داد و خواهرش به خاطر آن از او تشکر کرد
این چرخشی است اما بدون معنی نیست. در واقع میتوان گفت که ارجاع به خود لازم است در نتیجه قانون عدم تناقض ارسطو، یک اصل موضوع اساسی فلسفی. در این دیدگاه بودن خود ارجاعی، منطق و ریاضیات نشدنی میشوند، یا حداقل سودمندی وجود ندارد.
در تجارت
[ویرایش]گاهی پشتیبانی بیجا از نقشههای تجاری نتیجهاش ارجاع چرخشی خواهد شد. برای نمونه:
- زهره به پس دادن ماشین لباسشویی معیوبش نیاز دارد، چرا که آن کار نمیکند. او توسط علی مسئول خدمات پس از فروش راهنمایی شد تا به شاهرخ مسئول خدمات بازگشت و تعویض گزارش دهد. شاهرخ به زهره میگوید تا به مهران گزارش دهد. مهران به زهره میگوید تا با علی صحبت کند.
تمامی ارجاعات در این مثال بیارزش هستند زیرا هیچیک از آنها درخواست زهره را برآورده نمیکند. زهره به هر فردی که ارجاع داده شدهاست آن فرد زهره را به شخص دیگری حواله میکند و در نهایت او به شخصی که اول با او تماس گرفته بود ارجاع داده میشود.
در برنامهنویسی کامپیوتر
[ویرایش]ارجاع چرخشی ممکن است مشاهده شود در برنامهنویسی کامپیوتر وقتی که یک قطعه کد نیاز نتیجه از دیگری است اما کد به نتیجه از اولی نیاز دارد. به عنوان مثال:
تابع A زمان آخرین غروب بر اساس تاریخ فعلی را نشان میدهد. تابع B تعداد دفعاتی که ماه در مدار زمین میچرخد را از آخرین باری که تابع B نامیده میشد را محاسبه میکند. تابع B میپرسد تابع C چندبار است. تابع C نمیداند اما میتواند بهدستآورد با فراخوانی تابع A برای بهدست آوردن زمان آخرین غروب.
مجموعه کامل از توابع در حال حاضر بیارزش هستند چون هیچکدام از آنها نمیتوانند هیچگونه اطلاعات مفیدی را برگردانند. این امر منجر به آن چیزی میشود که از لحاظ فنی به آن Livelock میگویند. همچنین در صفحات گسترده وقتی که دو سلول به نتیجه یکدیگر نیاز داشته باشند. به عنوان مثال، اگر مقدار سلول A1 را با اضافه کردن ۵ به مقدار سلول B1 بتوان بهدستآورد و مقدار سلول B1 را بتوان با افزودن ۳ به سلول A1 بهدستآورد، هیچ مقداری نمیتواند محاسبه شود. (حتی در صورتی که مشخصات A1:B1+5 و B1:A1-5 وجود دارد، هنوز یک ارجاع چرخشی وجود دارد کمکی نمیکند. به عنوان مثال A1=3,B1=-۲ هر دو فرمول را برآورده میکند و همچنین بینهایت مقدار ممکن A1,B1 وجود دارد که میتواند آن دو را برآورده کند)
ارجاع چرخشی نشان میدهد که یک مشکل بزرگ در محاسبات است. یک بنبست زمانی اتفاق میافتد که دو یا چند فرایند منتظر یکدیگرند تا منبع را آزاد کند. بیشتر پایگاه دادهها مثل Oracle و SQL Serever اجازه ارجاع چرخشی را نمیدهند زیرا معمولاً مشکلی وجود دارد با حذف یک سطر از جدول وابستگی از سطر دیگری از جدول دیگری وجود دارد. (کلید خارجی) از اسناد و مدارک فنی در مایکروسافت: محدودیتهای کلید خارجی نمیتواند برای ایجاد خود ارجاعی یا محدودیتهای کلید خارجی چرخشی مورد استفاده قرار گیرد.
برای اوراکل و PostgreSQL مشکل به روزرسانی یک ارجاع چرخشی میتواند با تعریف کلید متناظر خارجی به عنوان deferrable حل شود مشاهده CREATETABLE برای مثال محدودیت PostgreSQL و DEFERRABLE برای اوراکل. در این مورد محدودیت که در پایان معامله نه در آن زمان که بیانیه DDL اجرا شدهاست بررسی میشود. برای به روزرسانی ارجاعات دایرهای دو گزاره میتوانند در یک معامله صادر شوند که هر دو منابع هنگامی که معامله متعهد است برآورده شدهاست. فقط پیوندهای درونی پشتیبانی میشوند و با مقایسه ستون از جداول مختلف مشخص شدهاند. پیوندهای چرخشی پوشش داده نشدهاند. پیوند چرخشی یک پرس و جوی SQL است که سه یا بیشتر از سه جدول باهم را در یک مدار لینک میکند. اوراکل با استفاده از اصطلاح Cyclic به تعیین یک ارجاع چرخشی پرداختهاست.
تمایز باید با فرایندهای حاوی یک ارجاع چرخشی بین آنهایی که بیشمارند و آنهایی که محاسبات تکراری با خروجی نهایی دارند، باشند. دوم ممکن است در صفحه گستردههایی مجهز نشدهاند تا رسیدگی کند آنها را، اما با این وجود هنوز منطقاً معتبر است.
ارجاعات چرخشی در صفحه گسترده
[ویرایش]ارجاع چرخشی در صفحه گسترده میتواند به عنوان یک تکنیک خیلی مفید برای حل معادلات ضمنی مانند معادله Colebrook و بسیاری دیگر استفاده شود، که در غیر اینصورت، حل آنها از از روشهای الگوریتم نیوتن-رافسون در VBA یا استفاده از ماکروها ممکن است بسیار خستهکننده باشد.