بعضی از تکنیکهای کدنویسی پیشرفتۀ الگو برای بهبود نمایش و ویرایش الگوها در ویکیپدیا وجود دارد. همچنین بعضی تاکتیکهای اشکالزدایی پارامترهای الگو در زبان نشانهگذاری مدیاویکی وجود دارد. اگر امکانش وجود داشته باشد، بهتر است از پودمانهای لوآ استفاده شود.
اشکالهای زیادی مرتبط با مشکل در طرز رفتار ناشیانه با بعضی ویژگیهای زبان نشانهگذاری است که منجر به خطا در کد میشود. فرانویسههای نامتناظر یکی از منابع اصلی خطا هستند. برای مثال کدنویسی {{1}}}
بهجای {{{1}}}
باعث میشود تا این کد بهصورت {{1}} }
عمل کند و نتیجۀ فراخوانی الگو 1 + "}" شود.
برای قالببندی-ویکیگونه محتوای پارامترها هنگامی که درون عبارتهای #اگر هستند، بعضی تفاوتها وجود دارد، اما هنگامی بیرون آن قرار دارند این تفاوتها وجود ندارد. الگوهایی که نیاز هست جانشانی شوند نیازمند هدایتپذیری ویژهای هستند. آماده کردن پیشفرض پارامترها یا نامهای مستعار پارامترها این مورد را به خوبی پوشش خواهد داد.
در یک تک الگو، محدودیت تودرتویی ۴۰ عبارت تودرتو است، مثل ۴۰ تا "if-then-else-if...". در ۴۱ اُمین کلیدواژه "if" ممکن است یک پیام بهصورت: "محدودۀ تودرتویی از حد مجاز فراتر رفته است" ظاهر شود. با این حال، اگر تودرتویی از سطوح ۴۰ فراتر نرود، یک الگو میتواند شامل صدها عبارت if و شاخههای switch باشد، اما همۀ تودرتوها درون همدیگر نیستند.
سالهای سال است که بعضی از الگوها محاسبات پیچیدۀ تودرتوی با عمقی فراتر از ۲۳ سطح شامل میشوند. همچنین، سالهای سال است، که بعضی از الگوها صدها عبارت if دربردارند، که همه تودرتوها فقط تکی نیستند، بلکه عبارت بزرگی مثل این: if-then-else-else-else-else-else... هم است.
یک موضوعی که پردازش الگوها را تکمیل میکند، برای پارامترها، قالببندی-ویکیگونه محتواهای پارامتر هنگامی که درون if های منطقی (مثل #if یا #ifeq) یا (lc:, lcfirst:, uc:, ucfirst:) است. از می ۲۰۱۲، تجزیهگر نشانهگذاری مدیاویکی هنوز قالببندی-ویکیگونه محتوای پارامترها هنگامی که درون عبارتهای #if قرار دارد، میباشد (اما بیرون نه). این بدین معنی است که پارامترهای دارای فاصله، نقطهویرگول، دونقطه (":") یا نشان پوند ("#") میتواند مقادیرشان تغییر دهند هنگامی که درون عبارتهای if قرار گیرند. بنابراین، برای نمونه، یک پارامتر {{{4}}} هنگامی که بیرون #if است میتوان بهصورت متفاوت از درون {{#ifeq:{{{1}}}=0|{{{4}}} ...}} به نمایش درآید. بدترین حالت هنگامی است که پارامتر ۴ دارای یک نقطهویرگول باشد، که قالببندی رها شده تا به خط عنوان پررنگ-نقطهویرگولی قدیمی تبدیل شود.
|
در هر صورت مشکلاتی در عبارتهای نشانهگذاری #if، #ifexpr، #ifeq و #switch رخ میدهد. اگر در هر کدام از عبارتهای then/else پارامتر به وسیلۀ متنی از پیش جایگزین شده باشد، پس قالببندی-ویکیگونه درون پارامترها روی نمیدهد.
|
در آزمایش ۴، علامت پوند "#" آغازین باعث شمارهدار شدن خودکار خط (با "۱." تورفته) میشود. موقعیت داشتن یک نقطهویرگول، ویرگول یا "#" آغازین ممکن است نسبتاً نادر باشد، اما این صرفاً جهت یادآوری است: برای نمایش صحیح محتوای پارامتر یک الگو، سعی کنید یک پارامتر خارج از شروع هر عبارتی if نمایش دهید، یا متن دیگری قبل از پارامتر درون if منطقی نمایش دهید، یا در غیراینصورت برای بعضی نتایج بدجور آماده شوید هنگامی که یک پارامتر قالببندی-ویکیگونه برای نمایش درون if منطقی دارد.
اگر نتیجۀ #if و غیره، برای قالببندی شدن تو نرفته است، از #، : و ; بهجای #، : و ; استفاده کنید، نتیجۀ #if و غیره به خوبی کار خواهد کرد.
|
به آسانی، با محافظت کردن از بخشهایی از کد که به احتمال زیاد خطا کدنویسی در آنجا رخ میدهد، میتوان خطاهای کدنویسی زیادی را اشکالزدایی کرد. غلطگیری خیلی بادقت، از روند منطقی بیشتر وقتها سریعترین روش تعمیر است، مثل بررسی کردن خطاهای دستور زبان رایج (بخش "خطاهای رایج کدنویسی" در زیر را ببینید). گاهی، یک بخشی از کد دردسرساز را میتوان به یک صفحۀ آزمایشی کوتاه رونویسی کرد، سپس بهطور جداگانه، در آنجا با روش ویرایش-پیشنمایش آزمایشش کرد. با این حال، اگر ویرایش در آن پنجرۀ صفحۀ-اضافی سخت به نظر میرسد، پس همینقدر کافیه، کد را به بالای صفحۀ الگوی کنونی رونویسی کنید. بهطور مشابه، کد یک الگو را در مراحل اولیه میتوان بهصورت چندین بخش توسعه داد، که هر کدام را میتوان بهطور جداگانه اشکالزدایی کرد، سپس درنهایت کنار هم قرارشان دهید، مثل بخشهای تودرتویی که if-then-else-if دارند.
به عنوان یک مرورکلی از گزینههای موجود، درنظر بگیرید:
راهبرد اصلی: جدا کردن بخشهای کد برای اشکالزدایی است.
بعدش، آزمایش هر بخش از کد است، که خیلی اهمیت دارد. چند ضربالمثل قدیمی است شما باید به آنها توجه کنید:
شاید گذاشتن یک نوع از نمونههای الگو در هر زیرصفحۀ توضیحات الگو، به پیدا کردن یک مشکل در هنگام توسعه کمک کند. با این حال برای برخی الگوهای پیچیده، در آن موقع صفحۀ بحث الگو، یا یک زیرصفحه ویژه مثل "/آزمایشی"، باید یک بخشی از نمونههای فراوان الگو برای نشان دادن گسترۀ ویژگیهای الگو داشته باشد.
هنگام توسعۀ بخشهایی از نشانهگذاری که از پارامترهای الگو استفاده میکنند، همیشه سعی کنید هر پارامتر را با مقدار پیشفرض تنظیم کنید، مخصوصاً در کدنویسی درون عبارتها یا #if منطقی:
{{#expr: 109.75 / {{{1|1}}} }}
← پیشفرض {۱} بهصورت ۱ صفر نیست.{{#ifeq: {{{answer|y}}}|y|show yes}}
اگر یک پارامتر خاص مقدار پیشفرض یکسانی روی کل صفحه داشته باشد، پس، برای هر مورد آزمایشی، برای تغییر مقدار پیشفرض به مقدار دیگری، با یک فرآیند رشتهای جستجو-جایگزینی سراسری، در یک ویرایشگر متنی، آن مقدار میتواند بهآسانی تغییر کند.
اگر به این پارامترها مقدار پیشفرض نداده شده باشد، پس آن بخشهای کد در طی ویرایش-پیشنمایش، هنگام ویرایش کردن الگو را نمیتوان آزمایش کرد. هر پارامتر بدون مقدار پیشفرض، یک متن سه-آکولادی حرفی میشود (مثل ۷ نویسۀ بی کم و زیاد: {{{x}}}
)، و پارامترهای غیر-پیشفرضگذاری شده در عبارتها یا #if منطقی، در طی ویرایش-پیشنمایش کردن صفحۀ الگو، نمیتوانند ارزیابی شوند.
خطاهای رایج کدنویسی گوناگونی وجود دارند، که هنگام پردازش الگوها باعث مشکل خواهند شد. برای کمک در اشکالزدایی، هنگامی که یک الگو عملکردش عجیب و غریب به نظر میرسد، موارد زیر را میتوان بهصورت یک بازبینه استفاده کرد:
{{{1}}
است. داشتن فقط ۲ آکولاد-بسته }}
ممکن است که پارامتر بهصورت یک الگو با نام "Template:1" عمل کند (با یک آکولاد "{" تنها قبل از آن آمده است).<!--
در آغاز یک توضیح HTML میتواند باعث نتایج ناجوری، بدون پیام خطا شود. فراموش کردن علامت تعجب هم خیلی رایج است: <--
باید <!--
شود.-->
در انتهای یک توضیح HTML میتواند باعث نتایج عجیب و غریبی، بدون پیام خطا شود.{{#ifexpr {{{1|y}}}=0|then zero|else not}}
توجه کنید که این خطاهای رایج را میتوان به آسانی با یک بررسیکننده دستور مشخص کرد. مثل خطایی که آکولادهای ۳ تایی-۲ تایی ممکن است دردسر درست کند: {{{size|180px}}
در تلاش برای گذراندن 180px بهعنوان پارامتر بهصورت "{Template:Size" عمل میکند چون فقط ۲ آکولاد-انتهایی دارد.
بازهم، همیشه بهعنوان اولین مرحله، اول خطاهای رایج را بررسی کنید، که میتواند از تلۀ زمانی برای "خطاهای پیچیدهای" که هرگز وجود ندارد جلوگیری کند. یادتان باشد: زبان نشانهگذاری مدیاویکی بهشدت مستعد-خطا است، پس به همین خاطر است که خطاهای کدنویسی اتفاق میافتد، و به همین دلیل است که:
خیلی از مشکلات ترسناک واقعاً فقط با ۱-دقیقه تعمیر دستور زبان حل میشوند.
وقتی برای اجرای فرآیندهای خیلی-پیچیده، یا پیچیده، تلاش میکنید، ممکن است یک ترس غریزی وجود داشته باشد که الگوی به اندازه کافی نمیتواند بزرگ باشد. با این حال، چندین سال است که، الگوهای خیلی بزرگی روی ویکیپدیا در حال اجرا هستند، برای نمونه:
قالبگر مبدأ-پانویس، الگو:یادکرد/هسته، یک قالب استاندارد شدهای را نمایش میدهد، که بهصورت چندین الگوی بستهبندی شده که صدها پارامتر را میگذرانند درخواست میکند، که هسته منطقی الگو ۶۲۱ پارامتر را، در عبارتهای نشانهگذاری شرطی، بررسی میکند.
صفحۀ ویژه:گسترش الگوها بعضی ویکیمتن را میگیرد و هرچیزی را در در دو آکولادها باشد را بهطور بازگشتی گسترش میدهد: الگوها، توابع تجزیهگر مثل {{#if:...}}، و متغییرها مثل {{CURRENTDAY}}