دومین دغدغه مشترک در مورد تمام اشیای مجموعه Intl این است: «متدها دقیقاً چه چیزی را برمیگردانند؟» پاسخ به این سوال، فراتر از مشخص کردن ساختار یا نوع دادهی بازگشتی، کمی دشوار است؛ زیرا هیچ استاندارد و مشخصات فنی سختگیرانهای (Normative specification) وجود ندارد که بگوید خروجی دقیقاً و کاراکتر به کاراکتر باید چه باشد! در بیشتر مواقع، نتیجهی یک متد در سیستم شما یکنواخت و پایدار است، اما خروجی کار میتواند بین موتورهای جاوااسکریپت مختلف (حتی برای یک لوکال کاملاً یکسان) متفاوت باشد؛ این تغییرات در خروجی، کاملاً بر اساس طراحیِ این ابزار است و استاندارد زبان جاوااسکریپت هم اجازه آن را داده است.
حتی ممکن است خروجی چیزی نباشد که شما انتظارش را دارید! برای مثال، رشته متنی که توسط متد format() برگردانده میشود، ممکن است در دل خود از «فاصلههای نشکن» (Non-breaking spaces) استفاده کرده باشد یا با «کاراکترهای کنترلی دوجهته» (Bidirectional control characters - برای مدیریت متون راستچین و چپچین) احاطه شده باشد.
⚠️ یک قانون طلایی: شما هرگز نباید نتایج حاصل از متدهای
Intlرا در کدهای خود با ثابتهای هاردکد شده (Hardcoded constants) مقایسه کنید؛ خروجی این متدها فقط و فقط باید برای نمایش به کاربران استفاده شوند.
قطعاً این پاسخ ممکن است برای یک توسعهدهنده چندان رضایتبخش نباشد؛ چرا که اکثر برنامهنویسان مایلند کنترل کاملی روی شکل ظاهری خروجی برنامه داشته باشند یا حداقل مطمئن شوند کاربر با یک خروجی بیمعنی و عجیب غافلگیر نمیشود. اگر میخواهید کدهای خود را به صورت دستی یا خودکار (تستهای اتوماتیک) تست کنید، این ۳ راهنما را همیشه به یاد داشته باشید:
اگر سایت شما مجهز به دکمه تغییر زبان است و از لیست ثابتی از زبانها پشتیبانی میکند، این کار برای شما بسیار راحتتر خواهد بود. اما اگر سیستم را رها کردهاید تا از هر زبانی که کاربر ترجیح میدهد استفاده کند، بهتر است چند زبان رایج در بین کاربران خود را برای تست انتخاب کنید؛ اما همیشه در گوشه ذهن داشته باشید که چیزی که کاربران مختلف میبینند، ممکن است متفاوت باشد. شما معمولاً میتوانید ترجیحات زبان کاربر را در تنظیمات ابزار تست (Test Runner) خود یا با ماک کردن (Mocking) متدهای سازنده Intl شبیهسازی کنید.
از آنجا که APIهای مجموعه Intl به طور مستقیم توسط خودِ موتور جاوااسکریپت (JS Engine) پیادهسازی میشوند، رفتار آنها وابسته به مرورگر است. به عنوان مثال، شما باید انتظار داشته باشید که محیط Node.js و مرورگر Chrome خروجی کاملاً یکسانی داشته باشند (چون هر دو از موتور V8 استفاده میکنند)، اما مرورگر Firefox (که از موتور SpiderMonkey استفاده میکند) ممکن است خروجی متفاوتی به شما تحویل دهد! با اینکه احتمالاً همه این موتورها از پایگاه دادهی استاندارد CLDR استفاده میکنند، اما معمولاً دادههای آن را به روشهای متفاوتی پیشپردازش میکنند. حتی برخی تنظیمات خاص کامپایل مرورگرها (مثلاً تنظیماتی که برای کاهش حجم نصب مرورگر اعمال میشوند) میتوانند روی اینکه چه لوکالها و گزینههایی پشتیبانی شوند، تأثیر بگذارند.
این یعنی شما نباید فرضیات خود را به صورت دستی در بخش Expect تست بنویسید؛ مثلاً نوشتن خطی مثل expect(result).toBe("foo") اشتباه است. در عوض، برای تست این موارد باید از تستهای مبتنی بر اسنپشات (Snapshot Testing) استفاده کنید، یا اینکه دقیقاً همان رشته متنی را که در اولین اجرای موفقیتآمیز تست تولید شده است، کپی کرده و در کد تست خود قرار دهید.
مستندات این بخش هم با نکات بسیار کلیدی درباره معماری موتورهای جاوااسکریپت به پایان رسید! با این توضیحات، بخشهای پایه و کلیاتِ مفاهیم شیء Intl تمام شد.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript