پرش به محتوا

ویکی‌پدیا:اجتناب از محدودیت عمق گسترش مدیاویکی

از ویکی‌پدیا، دانشنامهٔ آزاد

این انشا به مشکلات پیرامون «محدودیت عمق گسترش» در نسخهٔ ۱٫۱۶ نرم‌افزار مدیاویکی به‌واسطهٔ استفادهٔ تودرتویی از الگوها و تابع {{#اگر:}} می‌پردازد. در طول سال‌های ۲۰۰۹ تا ۲۰۱۶، محدودیت استفادهٔ تودرتو تنها برابر با ۴۰ سطح از تابع اگر-پس-وگرنه (یا الگوهای تودرتو) بود که از درون الگوهای دیگر فراخوانی می‌شدند. بدتر از آن، الگویی که خود تراگنجانش می‌شود، نمی‌تواند حاوی بیش از ۲۰ سطح از الگوهای تودرتو باشد.[۱] این محدودیت شدید تا حدی محدود است که برخی الگوها هنگام احضار از درون سایر الگوهای حجیم، نمی‌توانند به‌درستی عمل کنند. به این خطر توجه کنید: در صورتی که از محدودیت عمق گذر شود، تمامی الگوها نمی‌میرند، اما در عوض، به‌سادگی نتیجه‌ای نادرست (از باقی‌ماندهٔ الگوها) را تولید می‌کنند و به‌گونه‌ای به کار خود ادامه می‌دهند که گویی هیچ اتفاقی نیافتاده است. محدودیت‌های فنی عمق گسترش در این صفحه‌ها توضیح داده شده‌اند:

m:Help:Expansion depth و m:Help:Expansion#Expansion depth limit، در وبگاه meta.wikimedia.org

این محدودیت‌ها برای خنثی کردن اثر حمله‌های محروم‌سازی از سرویس (DoS) که به‌واسطهٔ الگوهای بسیار حجیم یا پیچیده ایجاد می‌شوند، انتخاب شده‌اند.

آنچه تحت تأثیر قرار نمی‌گیرد: معمولاً الگوهای حجیم را می‌توان به‌همراه یکدیگر و بدون رسیدن به این محدودیت در متن یک مقاله احضار کرد. نگرانی اصلی مربوط به زمان استفاده از الگوهای حجیم در داخل یک جعبهٔ اطلاعات یا در عمقی بیشتر در درون کدهای الگوهای دیگر (هنگام ویرایش یک الگوی حجیم) است. استفاده از الگوهای حجیم در کنار یکدیگر در یک بند از یک مقاله به‌ندرت ایجاد مشکل می‌کند.

کاهش عمق گسترش: سطوح تودرتو در داخل الگوهای حجیم را می‌توان با بازنویسی برخی از توابع اگر-پس-وگرنه به‌شکل اگر-پس-اگر-پس-اگر-پس غیر تودرتو، یا با استفاده از تابع {{#گزینه:}} در خارج از تابع اگر-پس، کاهش داد. در برخی موارد، خودداری از به‌کار بردن سایر الگوها در یک الگو نیز می‌تواند تعداد سطوح تودرتو را کاهش دهد: در حالی که استفاده از تابع {{#اگرحساب:}} عمق را به میزان یک سطح افزایش می‌دهد، احضار یک الگوی دیگر که حاوی تابع {{#اگرحساب:}} باشد عمق را به میزان ۲ سطح افزایش می‌دهد. قرار دادن یک مقدار پیش‌فرض در یک پارامتر منجر به افزایش سطوح تودرتویی نمی‌شود: {{{1}}} و {{{1|۷۸٫۵}}} هر دو در سطح صفر (0) از ساختار تودرتویی قرار دارند.

بررسی محدودیت کنونی گسترش

[ویرایش]

محدودیت کنونی (با فرض این که ۲۰ سطح از الگوها به‌صورت تودرتو و مستقیم در این صفحه فراخوانده شوند) را می‌توان به‌واسطهٔ نمونهٔ زندهٔ زیر، که به‌طور مکرر الگو:1x را برای آزمایش سطوح چندگانه به‌شکل تودرتو قرار می‌دهد، شبیه‌سازی کرد:

 * ۲۰ الگوی تودرتو:
  {{1x|{{1x|{{1x|{{1x|{{1x| {{1x|{{1x|{{1x|{{1x|{{1x
 |{{1x|{{1x|{{1x|{{1x|{{1x| {{1x|{{1x|{{1x|{{1x|{{1x
 |'''سطح ۲۰ در اینجا'''.
 }}}} }}}} }}}} }}}} }}}}
 }}}} }}}} }}}} }}}} }}}}
  • ۲۰ الگوی تودرتو:
  سطح ۲۰ در اینجا.
   
   

در مقابل، نمونهٔ زیر با بیش از ۲۰ الگوی تودرتو، مانند الگوهای بیش از حد تودرتو در طول سال‌های ۲۰۰۹ تا ۲۰۱۶، مشکل‌ساز خواهد شد:

  • ۲۱ الگوی تودرتو:
{{صفحه از حداکثر عمق بسط دادن تجاوز کرد|سطح ۲۱ در اینجا.}}

کاهش میزان تودرتویی اگر-پس

[ویرایش]

در درون یک الگو، میزان تودرتویی الگوها را می‌توان با انتقال هر عبارت «اگر» به خارج از یک عبارت «اگر» دیگر، یا با ترکیب این تابع با شرط‌های مرکب نظیر «#اگرحساب:|الف=ب and ج=د...» به‌جای داشتن یک #اگرحساب تودرتو در درون یک تابع #اگرحساب خارجی، کاهش داد. با این حال، باید دقت داشت که هنگام تغییرمکان تودرتویی هر تابع #اگرمساوی یا #اگرحساب، تأثیر کلی آن منطق تغییر نکند.

فرایند آزمایش تغییرات را می‌توان با کپی کردن بخشی از کد برای ویرایش (و اشکال‌زدایی) به‌طور جداگانه، تسریع کرد. راه آسان‌تر آن است که در خلال فرایند ویرایش-پیش‌نمایش، بخشی از کد را به ابتدای صفحهٔ الگو کپی کنید یا این که یک صفحهٔ خالی نظیر صفحهٔ تمرین خودتان را ویرایش کنید، بخش مورد نظر از کد را برای بررسی کاربردهای مکرر با مقدارهای مختلف تنظیم‌شده به‌عنوان پیش‌فرض برای پارامترها، در طول فرایند ویرایش-پیش‌نمایش در آن کپی کنید.

به‌عنوان مثال، یک مجموعهٔ تودرتوی ۳ سطحی متشکل از ۳ تابع #اگرحساب را می‌توان به توالی ۳ کاربرد جداگانهٔ تابع #اگرحساب کاهش داد:

۳ تابع #اگرحساب تودرتوی اولیه:
{{#اگرحساب: {{{1}}}*3 = 12.6| برابر با 12.6
  |{{#اگرحساب: {{{1}}}*3 = 27.3| برابر با 27.3
    |{{#اگرحساب: {{{1}}}*3 > 57| بزرگ‌تر از 57}}
  }}
}}
کاهش‌یافته به ۳ #اگرحساب: جداگانه
{{#اگرحساب: {{{1}}}*3 = 12.6| برابر با 12.6}}{{
  #اگرحساب: {{{1}}}*3 = 27.3| برابر با 27.3}}{{
  #اگرحساب: {{{1}}}*3 > 57| بزرگ‌تر از 57}}

به‌طور جایگزین، برای بررسی برابری یک پارامتر با برخی مقدارهای خاص می‌توان از تابع #گزینه: استفاده کرد:

استفاده از #گزینه برای مقدارهای برابر، به‌علاوهٔ تابع #اگرحساب:
{{#گزینه: {{#حساب: {{{1}}}*3 }}
  | 12.6 = برابر با 12.6 | 27.3 = برابر با 27.3 | #پیش‌فرض = 
}}{{#اگرحساب: {{{1}}}*3 > 57| بزرگ‌تر از 57}}

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

به‌طور کلی، مجموع ۱۰ سطح از عمق گسترش را می‌توان قابل قبول در نظر گرفت، اما محدودیت‌های خاص به تکرر استفاده از یک الگو در الگوهای حجیم بستگی خواهند داشت. میزان نیاز به بازنویسی برای کاهش سطوح تودرتویی، به احتمال استفاده از یک الگو در ترکیب با سایر الگوهایی بستگی دارد که دارای حالت‌های گسترش حجیم با چندین سطح تودرتویی هستند.

در بیشتر سیستم‌های رایانه‌ای، چنین شکلی از تودرتوسازی توابع اگر-پس محدود به ۱۰۰ سطح، یا در بعضی موارد نامحدود است و از این رو بسیاری از افراد دارای پیش‌زمینهٔ ذهنی از مسائل مرتبط با رایانه، هنگامی که متوجه می‌شوند تجزیه‌کنندهٔ نرم‌افزار مدیاویکی این شکل از تودرتوسازی را در سال‌های ۲۰۰۹ تا ۲۰۲۴ به‌شدت و صرفاً به عمق ۴۰ سطحی محدود کرده است، متعجب خواهند شد.

کاهش یک فرمول ریاضی

[ویرایش]

همان‌طور که پیش از گفته شد، تابع تجزیه‌گر {{#حساب:...}} همانند {{آرایش‌عدد:...}} ۱ سطح از عمق گسترش را مصرف می‌کند. بنابراین، یک عمل محاسباتی که در آن ویرگول‌ها حذف می‌شوند، مقدارهایی در هم ضرب می‌شوند و سپس ویرگول‌ها دوباره به آن اضافه می‌شوند دارای عمق تودرتویی ۳ سطحی خواهد بود:

  • {{آرایش‌عدد: {{#حساب: 5* {{آرایش‌عدد:21,001|R}} }} }} ← ۱۰۵٬۰۰۵

حذف آرایش‌عدد عمق را ۱ سطح کاهش می‌دهد: در بسیاری موارد، حذف ویرگول از اعداد اجتناب‌ناپذیر است و از آرایش‌عدد به‌شکل {{آرایش‌عدد:21,001|R}} برای حذف هرگونه ویرگول در عدد استفاده می‌شود، اما در بدترین حالت می‌توان کاربر را به وارد کردن عدد بدون ویرگول ملزم کرد و به این ترتیب، عمق گسترش را به‌واسطهٔ حذف آرایش‌عدد به میزان ۱ سطح کاهش داد.

ترکیب گسترش تودرتویی عمق را ۱ سطح کاهش می‌دهد: در موارد نادر، پیش می‌آید که یک عمل محاسباتی حاوی یک عمل محاسباتی تودرتوی دیگر باشد. بازنویسی هر دو محاسبه به شکلی که هر دو در یک تابع {{#حساب}} استفاده کنند، منجر به کاهش عمق گسترش به میزان ۱ سطح خواهد شد:

  • {{#حساب: 10 * {{#حساب: 2 + 3}} }} ← 50
  • {{#حساب: 10 * (2 + 3) }} ← 50

استفاده از پرانتز «( )» این امکان را فراهم می‌کند که در یک محاسبه با استفاده از {{#حساب}}، هر فرمول در سایر فرمول‌ها ترکیب شده و تنها ۱ سطح از عمق گسترش را مصرف کند.

الگوهای حجیم دارای محدودیت

[ویرایش]

از آنجا که الگوی مورد استفاده در این بخش برای شبیه‌سازی مشکل اکنون از لوآ استفاده می‌کند و منجر به ایجاد مشکل نمی‌شود، برای این بخش نیاز به نمونه‌ای جدید است.


نتایج نادرست بدون پیام هشدار

[ویرایش]

از آنجا که الگوی مورد استفاده در این بخش برای شبیه‌سازی مشکل اکنون از لوآ استفاده می‌کند و منجر به ایجاد مشکل نمی‌شود، برای این بخش نیاز به نمونه‌ای جدید است.


الگوهای طراحی‌شده برای منطق غیر تودرتو

[ویرایش]

خوشبختانه بسیاری از الگوهای پرکاربرد می‌توانند به‌شکلی نوشته شوند که منطق اگر-پس موجود در آن‌ها به‌شکل غیر تودرتو درآید یا از کاربرد تعداد زیادی از الگوهای تعبیه‌شده در آن‌ها اجتناب شود. در زیر نمونه‌ای از یکی از به‌صرفه‌ترین الگوهای موجود آمده است:

  • {{str_left|str|n}}: استخراج n نویسه از انتهای رشته

این الگو به‌طور ویژه به‌شکلی طراحی شده که از کمترین سطح منطق اگر-پس تودرتویی استفاده کند و از کاربرد تعداد زیادی از الگوهای تعبیه‌شده در آن اجتناب شود.

افراد نسبتاً کمی متوجه مشکل می‌شوند

[ویرایش]

از آنجا که تمام افراد فعال در ویکی‌پدیا در چارچوب محدودیت‌های نرم‌افزار مدیاویکی آموزش ندیده‌اند، حتی بعضی از مدیران نیز ممکن است از این موضوع که منطق اگر-پس تودرتویی محدودیتی را برای استفاده از الگوها در داخل سایر الگوهای حجیم ایجاد می‌کند، آگاه نباشند. در نتیجه بسیاری از افراد تاکنون تلاش کرده‌اند الگوهایی را به‌شکلی بنویسند که گویی در حال نوشتن یک نرم‌افزار رایانه‌ای برای سامانه‌های رایانه‌ای مدرن هستند و عموماً آگاه نبوده‌اند که در حالی که سایر نرم‌افزارهای رایانه‌ای می‌توان از ۳۰۰ سطح یا حتی در برخی موارد بی‌نهایت سطح تودرتویی استفاده کرد، در مدیاویکی محدودیتی ۴۰ سطحی برای منطق تودرتویی وجود دارد.

جستارهای وابسته

[ویرایش]

یادداشت‌ها

[ویرایش]