پرش به محتوا

ویکی‌پدیا:کدنویسی پیشرفتۀ الگو

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

بعضی از تکنیک‌های کدنویسی پیشرفتۀ الگو برای بهبود نمایش و ویرایش الگو‌ها در ویکی‌پدیا وجود دارد. همچنین بعضی تاکتیک‌های اشکال‌زدایی پارامترهای الگو در زبان نشانه‌گذاری مدیاویکی وجود دارد. اگر امکانش وجود داشته باشد، بهتر است از پودمان‌های لوآ استفاده شود.

اشکال‌های زیادی مرتبط با مشکل در طرز رفتار ناشیانه با بعضی ویژگی‌های زبان نشانه‌گذاری است که منجر به خطا در کد می‌شود. فرانویسه‌های نامتناظر یکی از منابع اصلی خطا هستند. برای مثال کدنویسی {{1}}} به‌جای {{{1}}} باعث می‌شود تا این کد به‌صورت {{1}} } عمل کند و نتیجۀ فراخوانی الگو 1 + "}" شود.

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

محدود شدن سطح‌های تودرتو به ۴۰ تا

[ویرایش]

در یک تک الگو، محدودیت تودرتویی ۴۰ عبارت تودرتو است، مثل ۴۰ تا "if-then-else-if...". در ۴۱ اُمین کلیدواژه "if" ممکن است یک پیام به‌صورت: "محدودۀ تودرتویی از حد مجاز فراتر رفته است" ظاهر شود. با این حال، اگر تودرتویی از سطوح ۴۰ فراتر نرود، یک الگو می‌تواند شامل صدها عبارت if و شاخه‌های switch باشد، اما همۀ تودرتوها درون همدیگر نیستند.

سال‌های سال است که بعضی از الگوها محاسبات پیچیدۀ تودرتوی با عمقی فراتر از ۲۳ سطح شامل می‌شوند. همچنین، سال‌های سال است، که بعضی از الگوها صدها عبارت if دربردارند، که همه تودرتوها فقط تکی نیستند، بلکه عبارت بزرگی مثل این: if-then-else-else-else-else-else... هم است.

قالب‌بندی‌های-ویکی‌گونه مدیاویکی عبارت‌های درون #if

[ویرایش]

یک موضوعی که پردازش الگوها را تکمیل می‌کند، برای پارامترها، قالب‌بندی-ویکی‌گونه محتواهای پارامتر هنگامی که درون if های منطقی (مثل #if یا #ifeq) یا (lc:, lcfirst:, uc:, ucfirst:) است. از می ۲۰۱۲، تجزیه‌گر نشانه‌گذاری مدیاویکی هنوز قالب‌بندی-ویکی‌گونه محتوای پارامترها هنگامی که درون عبارت‌های #if قرار دارد، می‌باشد (اما بیرون نه). این بدین معنی است که پارامترهای دارای فاصله، نقطه‌ویرگول، دونقطه (":") یا نشان پوند ("#") می‌تواند مقادیرشان تغییر دهند هنگامی که درون عبارت‌های if قرار گیرند. بنابراین، برای نمونه، یک پارامتر {{{4}}} هنگامی که بیرون #if است می‌توان به‌صورت متفاوت از درون {{#ifeq:{{{1}}}=0|{{{4}}} ...}} به نمایش درآید. بدترین حالت هنگامی است که پارامتر ۴ دارای یک نقطه‌ویرگول باشد، که قالب‌بندی رها شده تا به خط عنوان پررنگ-نقطه‌ویرگولی قدیمی تبدیل شود.

آزمایش ۱: {{#اگر:{{{4|}}}|{{{4|;}}} <== بله، نقطه‌ویرگول|خیر، ۴=خالی}}
آزمایش ۲: {{#اگر:{{{4|;}}}|{{{4|;}}} <== بله، نقطه‌ویرگول|خیر، ۴=خالی}}
آزمایش ۱: خیر، ۴=خالی
آزمایش ۲:
<== بله، نقطه‌ویرگول
<== نمونه‌ای جدا از عنوان-نقطه‌ویرگولی

در هر صورت مشکلاتی در عبارت‌های نشانه‌گذاری #if، #ifexpr، #ifeq و #switch رخ می‌دهد. اگر در هر کدام از عبارت‌های then/else پارامتر به وسیلۀ متنی از پیش جایگزین شده باشد، پس قالب‌بندی-ویکی‌گونه درون پارامترها روی نمی‌دهد.

آزمایش ۳: {{#ifexpr:{{{1|7}}}=7|<b></b>{{{4|;}}} برابر ۷ است|۷ نیست}}
آزمایش ۴: {{#ifexpr:{{{1|7}}} < 9|{{{4|#}}} کمتر از ۹ است|نیست<۹}}
آزمایش ۵: {{#ifexpr:{{{1|7}}} < 9|&#32;{{{4|;}}} کمتر از ۹ است|نیست<۹}}
آزمایش ۶: "{{#ifexpr:{{{1|7}}} < 9|&#32;{{{4|;}}} کمتر از ۹ است|نیست<۹}}"
آزمایش ۳: ; برابر ۷ است
آزمایش ۴:
  1. کمتر از ۹ است
آزمایش ۵: # کمتر از ۹ است
آزمایش ۶: " # کمتر از ۹ است"

در آزمایش ۴، علامت پوند "#" آغازین باعث شماره‌دار شدن خودکار خط (با "۱." تورفته) می‌شود. موقعیت داشتن یک نقطه‌ویرگول، ویرگول یا "#" آغازین ممکن است نسبتاً نادر باشد، اما این صرفاً جهت یادآوری است: برای نمایش صحیح محتوای پارامتر یک الگو، سعی کنید یک پارامتر خارج از شروع هر عبارتی if نمایش دهید، یا متن دیگری قبل از پارامتر درون if منطقی نمایش دهید، یا در غیراینصورت برای بعضی نتایج بدجور آماده شوید هنگامی که یک پارامتر قالب‌بندی-ویکی‌گونه برای نمایش درون if منطقی دارد.

اگر نتیجۀ #if و غیره، برای قالب‌بندی شدن تو نرفته است، از &#35;، &#58; و &#59; به‌جای #، : و ; استفاده کنید، نتیجۀ #if و غیره به خوبی کار خواهد کرد.

آزمایش ۷: {{#ifexpr:{{{1|7}}} < 9|{{{4|&#35;}}} کمتر از ۹ است|نیست<۹}}
آزمایش ۷: # کمتر از ۹ است

اشکال‌زدایی

[ویرایش]

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

به عنوان یک مرورکلی از گزینه‌های موجود، درنظر بگیرید:

  • بادقت در غلط‌گیری کد دردساز تلاش کنید، "{{" را با "}}" تطبیق دهید. (استفاده از نشانگر دستور Equazcion برای نت‌پد++ درنظر بگیرید)
  • یک بخش الگو را به پنجرۀ-ویرایش صفحۀ-آزمایشی، برای اشکال‌زدایی رونویسی کنید.
  • یک بخش الگو را به بالای صفحۀ الگو، برای اشکال‌زدایی رونویسی کنید.
  • یک الگو را دوباره سازماندهی کنید به‌طوری که هر بخش بیشتر تقسیم شود.

راهبرد اصلی: جدا کردن بخش‌های کد برای اشکال‌زدایی است.

بعدش، آزمایش هر بخش از کد است، که خیلی اهمیت دارد. چند ضرب‌المثل‌ قدیمی است شما باید به آنها توجه کنید:

  • اگر آزمایش نشده، پس کار نمی‌کنه.
  • شما می‌توانید انتظار چیزی که بازرسی می‌کنید را داشته باشید. (ادواردز دمینگ)

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

پیش‌فرض‌گذاری پارامترها در عبارت‌ها یا #if منطقی

[ویرایش]

هنگام توسعۀ بخش‌هایی از نشانه‌گذاری که از پارامترهای الگو استفاده می‌کنند، همیشه سعی کنید هر پارامتر را با مقدار پیش‌فرض تنظیم کنید، مخصوصاً در کدنویسی درون عبارت‌ها یا #if منطقی:

  • {{#expr: 109.75 / {{{1|1}}} }} ← پیش‌فرض {۱} به‌‌صورت ۱ صفر نیست.
  • {{#ifeq: {{{answer|y}}}|y|show yes}}

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

اگر به این پارامترها مقدار پیش‌فرض نداده شده باشد، پس آن بخش‌های کد در طی ویرایش-پیش‌نمایش، هنگام ویرایش کردن الگو را نمی‌توان آزمایش کرد. هر پارامتر بدون مقدار پیش‌فرض، یک متن سه-آکولادی حرفی می‌شود (مثل ۷ نویسۀ بی کم و زیاد: {{{x}}})، و پارامترهای غیر-پیش‌فرض‌گذاری شده در عبارت‌ها یا #if منطقی، در طی ویرایش-پیش‌نمایش کردن صفحۀ الگو، نمی‌توانند ارزیابی شوند.

خطاهای رایج کدنویسی

[ویرایش]

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

  • آکولادهای بسته خیلی کم: یک خطای رایج گذاشتن فقط ۲ آکولاد-بسته دور یک پارامتر شماره‌ای یا نامی مثل {{{1}} است. داشتن فقط ۲ آکولاد-بسته }} ممکن است که پارامتر به‌صورت یک الگو با نام "Template:1" عمل کند (با یک آکولاد "{" تنها قبل از آن آمده است).
  • توضیحات باز نشده: فراموش کردن گذاشتن <!-- در آغاز یک توضیح HTML می‌تواند باعث نتایج ناجوری، بدون پیام خطا شود. فراموش کردن علامت تعجب هم خیلی رایج است: <-- باید <!-- شود.
  • توضیحات بسته نشده: فراموش کردن گذاشتن --> در انتهای یک توضیح HTML می‌تواند باعث نتایج عجیب و غریبی، بدون پیام خطا شود.
  • جا افتادن دونقطه یا "#" در "#ifexpr:": فراموش کردن گذاشتن "#" یا دونقطه برای "#ifexpr:" یا "#expr:" می‌تواند نتایج بدجوری تولید کند، هنگامی که به زیرالگوهای دیگر گذرانیده می‌شود.
با جا افتادن دونقطه به متن حرفی تبدیل می‌شود: {{#ifexpr {{{1|y}}}=0|then zero|else not}}

توجه کنید که این خطاهای رایج را می‌توان به آسانی با یک بررسی‌کننده دستور مشخص کرد. مثل خطایی که آکولادهای ۳ تایی-۲ تایی ممکن است دردسر درست کند: {{{size|180px}} در تلاش برای گذراندن 180px به‌عنوان پارامتر به‌صورت "{Template:Size" عمل می‌کند چون فقط ۲ آکولاد-انتهایی دارد.

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

تلاش کنید که ابتدا موارد بالا را به‌صورت یک بازبینه، یا به‌عنوان نوعی چک‌آپ-سلامتی برای الگو درنظر بگیرید.

خیلی از مشکلات ترسناک واقعاً فقط با ۱-دقیقه تعمیر دستور زبان حل می‌شوند.

نمونه‌هایی از الگوهای خیلی بزرگ

[ویرایش]

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

قالب‌گر مبدأ-پانویس، الگو:یادکرد/هسته، یک قالب استاندارد شده‌ای را نمایش می‌دهد، که به‌صورت چندین الگوی بسته‌بندی شده که صدها پارامتر را می‌گذرانند درخواست می‌کند، که هسته منطقی الگو ۶۲۱ پارامتر را، در عبارت‌های نشانه‌گذاری شرطی، بررسی می‌کند.

کمی برنامه‌نویسی امتحان کنید

[ویرایش]

صفحۀ ویژه:گسترش الگوها بعضی ویکی‌متن را می‌گیرد و هرچیزی را در در دو آکولادها باشد را به‌طور بازگشتی گسترش می‌دهد: الگو‌ها، توابع تجزیه‌گر مثل {{#if:...}}، و متغییرها مثل {{CURRENTDAY}}

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

[ویرایش]