بهترین روش نام‌گذاری ریسورسها در اندروید

نویسنده : سید ایوب کوکبی ۱۰ تیر ۱۳۹۷

بهترین روش نام‌گذاری ریسورسها در اندروید

احتمالاً بارها برایتان پیش آمده که زمان زیادی را صرف یافتن رشته‌‌ای درون فایل strings.xml یا پیدا کردن یک آیتم در میان drawableها کنید. معمولاً هر برنامه‌نویسی بخصوص آن دسته از توسعه‌دهندگانی که نظم و دیسیپلین کاری برایشان مهم است، سعی می‌کنند همان ب بسم‌الله تکلیفشان را با معماری پروژه، build، یکپارچه‌سازی مداوم (CI: Continues Integration) و … مشخص کنند. اگر چنین است که باید هم باشد آیا استراتژی خاصی برای نام‌گذاری ریسورسهایتان دارید؟ آن هم در دنیای برنامه‌نویسی اندروید که با نام‌گذاری الله‌بختکی حسابی وقت و انرژیتان گرفته می‌شود. این موضوع شاید برای پروژه‌های کوچک یا در شروع کار محسوس نباشد ولی همزمان با بزرگ شدن پروژه چهره‌ی خبیث خود را نشان می‌دهد!

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

در این مقاله روشی برای نام‌گذاری ریسورس‌ها معرفی می‌شود که از این ویژگی‌ها برخوردار است:

  • جستجوی آسان با قابلیت autocomplete
  • نام‌هایی منطقی و قابل پیش‌بینی
  • مرتب شدن ریسورس‌ها
  • ریسورهای strongly typed

این روش را جروین مولز در وبلاگش معرفی کرده است.

قاعده‌ی کلی

تمام ریسورس‌های اندروید را بر اساس این قاعده‌ی ساده نام‌گذاری می‌کنیم.

ابتدا هر یک از المان‌ها را بررسی کنیم:

WHAT: معرف نوع ریسورس است مثلاً MainActivity از نوع activity است.

WHERE: معرف جایی است که ریسورس منطقاً آن‌جاست. برای ریسورس‌هایی که در چندین صفحه‌ی مختلف قرار دارند از all استفاده می‌کنیم. مثلاً برای MainActivity از main استفاده می‌کنیم و برای ArticleDetailFragment از articledetail

DESCRIPTION: خب الان به یک صفحه‌ی مشخص مثلاً صفحه لاگین رسیدیم. برای هر یک از  ریسورس‌های آن صفحه نامی انتخاب می‌کنیم؛ مثلا title

SIZE: این بخش اختیاری است که بیشتر برای drawableها و dimensionها کاربرد دارد. برای این قسمت یا عددی مثلاً ۲۴p قرار دهید یا small, large و … .

بخوانید  پیش گفتار:چرا من باید برنامه نویس اندروید بشم؟!

به صورت خلاصه تمام چیزی که قصد توضیحش را دارم در چیت‌شیت یا برگ تقلب پایین خلاصه شده است.

چیت‌شیت نام‌گذاری ریسورسها در اندروید

نسخه‌ی کیفیت بالای این چیت‌شیت را می‌توانید دانلود کنید و به عنوان یک مرجع در اختیار داشته باشید.

مزایای این روش نام‌گذاری

۱- مرتب‌سازی ریسورس‌ها بر اساس صفحات برنامه

قسمت WHERE صفحه‌ای که ریسورس متعلق به آن است را مشخص می‌کند. اینطوری خیلی راحت با تایپ کردن صفحه‌ی مورد نظر مثلا main تمامی ریسورس‌های مرتبط مثل آی‌دی‌ها، drawableها، dimensionها و … توسط اتوکامپلت اندروید استودیو نمایش داده می‌شود. اگر ریسورسی متعلق به صفحه‌ی خاصی نبود و در همه‌ی صفحات امکان استفاده از آن بود پیشوند all را بکار می‌بریم.

۲- نام‌گذاری قوی ریسورس آی‌دی‌ها

بخش WHAT برای ریسورس آی‌دی‌ها، نام کلاسی که المان XML متعلق به آن هست را مشخص می‌کند. این کار فرایند cast کردن در متد ()findViewById را بسیار راحت می‌کند. مثلاً در تصویر بالا عنوان linearLayout_main_fragmentcontainer به سادگی می‌گوید من یک LinearLayout هستم. پس به راحتی می‌توانید نوع کلاسی که باید به آن Cast کنید را بفهمید.

۳- سازمان‌دهی بهتر ریسورس‌ها

اندروید استودیو در File Browser یا Project Navigator فایل‌ها را به صورت الفبایی نشان می‌دهد. این یعنی تمامی layoutها و drawableها بر حسب فیلد WHAT که ممکن است activity، fragment یا … باشند مرتب شوند و هر یک از این‌ها به نوبه‌ی خود بر حسب فیلد WHERE مرتب می‌شوند.

۴- اتوکامپلت کارآمدتر

از آنجایی که نام ریسورس‌ها اکنون قابل پیش‌بینی‌تر شده است، استفاده از ویژگی اتوکامپلت یا تکمیل خودکار برای یافتن آن‌ها ساده‌تر شده و تنها با وارد کردن بخش WHAT یا WHERE می‌توانید محدوده‌ی یافتن آی‌دی را باریک‌تر کرده تا به آیتم مورد نظر برسید.

۵- عدم تداخل اسامی

با پیروی از این شیوه‌ی نام‌گذاری دیگر تداخلی بین ریسورس‌های تکراری از صفحات مختلف وجود نخواهد داشت. ریسورس‌ها یا WHERE متفاوتی دارند یا در صورتی که مشترک بین چندین صفحه بودند پسوند all می‌گیرند.

۶- تمییزتر شدن نام ریسورس‌ها

در مجموع چنین نام‌گذاری منطقی باعث تمییزتر شدن فضای کاری پروژه‌های اندرویدی شما خواهد شد.

بخوانید  امنیت اپلیکیشن‌های اندرویدی را با این روش‌ها افزایش دهید

۷- پشتیبانی ابزارهای مختلف

ابزارهای مختلفِ اندروید استودیو نظیر lint، ریفکتورینگ و نمایش بصری ریسورس‌ها در نمای پروژه به صورت کامل از این روش نام‌گذاری پشتیبانی می‌کنند.

Layouts

از آنجایی که تعداد layoutهای مورد استفاده در یک صفحه چند عدد بیشتر نیست، بکار بردن همان دو بخش ابتدایی کافی است.

در layoutها بخش WHAT یکی از انواع زیر است:

چند مثال:

  • activity_main.xml: یک contentview برای MainActivity است.
  • fragment_articledetail.xml: حاوی ویوی ArticleDetailFragment است.
  • view_menu.xml: نشان‌دهنده‌ی Layoutای سفارشی است که توسط MenuView اینفلیت می‌شود.
  • item.article.xml: لی‌اوت مورد استفاده برای ArticleRecyclerView را مشخص می‌کند.
  • layout_actionbar_backbutton.xml: لی‌اوت مورد استفاده برای اکشن‌باری با دکمه‌ی backbutton را تعیین می‌کند.

Strings

برای نام‌گذاری رشته‌ها WHAT مفهومی ندارد بنابراین در دو حالت می‌توان نام‌گذاریشان کرد. یا بخش WHERE و به دنبالش توضیح:

یا اگر رشته عمومی بوده و در تمامی صفحات یا چندین صفحه‌ی مختلف استفاده می‌شود پسوند all را قرار می‌دهیم:

چند مثال:

  • articledetail_title: عنوان فرگمنت articledetail
  • feedback_explanation: شرح بازخورد برای FeedbackFragment
  • feedback_namehint: هینت مورد استفاده برای فیلد نام (name) در FeedbackFragment
  • all_done: رشته‌ی عمومی برای «انجام شد»

مسلماً WHERE برای تمامی ریسورس‌های واقع در یک ویوی مشخص یکسان است.

Drawables

برای Drawableها نیز بخش WHAT معنی خاصی ندارد؛ پس از آن استفاده نمی‌کنیم. در اینجا نیز نام‌گذاری مثل Stringها است با این تفاوت که از فیلد اختیاری SIZE نیز می‌توانیم استفاد کنیم. پس اگر drawable شما مختص یک صفحه‌ی خاص باشد از این قاعده استفاده کنید:

و اگر کاربردی عمومی در سراسر اپلیکیشن دارد از این قاعده استفاده کنید:

بخش SIZE همانطور که گفتم اختیاری است که می‌توانید سایز واقعی drawable مثلاً ۲۴dp را به کار برید یا از عبارت small، large و … استفاده کنید.

مثال:

  • articledetail_placeholder: یک placeholder برای ArticleDetailFragment
  • all_infoicon: آیکون سراسری info
  • all_infoicon_large: آیکون سراسری info در سایز بزرگ
  • all_infoicon_24dp: آیکون سراسری info در سایز ۲۴dp

IDs

برای نام‌گذاری IDها، بخش WHAT بیانگر کلاسی است که المان xml متعلق به آن است. بخش بعدی یعنی WHERE صفحه‌ای که ID متعلق به آن هست را نشان می‌دهد و در انتها نیز به صورت اختیاری و در صورتی که تعداد المان‌های مشابه زیاد است می‌توانید قسمت DESCRIPTION را هم اضافه کنید تا بین عناصر مختلف تمایز ایجاد کنید.

بخوانید  تجربیاتی ارزشمند از یک سِنیور دولوپر اندروید

مثال:

  • tablelayout_main: عنصر tablelayout در MainAcivity
  • imageview_menu_profile: تصویر پروفایل در MenuView سفارشی
  • textview_articledetail_title: تکست‌ویوی title در ArticleDetailFragment

Dimensions

معمولاً در برنامه‌ها تعداد معدودی dimension نیز تعریف می‌شود که در سراسر اپلیکیشن به دفعات از این دیمنشن‌ها استفاده می‌شود. در حالت پیش‌فرض همه‌ی dimensionها all هستند:

مگر خلاف آن ثابت شود که در چنین حالتی صفحه‌ی مورد نظر را مشخص می‌کنید و WHAT یکی از مقادیر موجود در جدول پایین است:

توجه داشته باشید که این لیست تنها تعدادی از WHATها را نشان می‌دهد. dimensionهای دیگری نیز برای rotation، scale و … وجود دارد که بیشتر در drawableها استفاده می‌شود.

چند مثال:

  • height_toolbar: ارتفاع همه‌ی تولبارها
  • keyline_listtext: عنصر listitem text با این keyline تنظیم می‌شود
  • textsize_medium: سایز متوسط همه‌ی رشته‌های متنی
  • size_menu_icon: اندازه آیکون‌های داخل منو
  • height_menu_profileimage: ارتفاع تصویر پروفایل در منو

محدودیت‌های این روش نام‌گذاری

۱- صفحات نیازمند نام‌گذاری یکتا هستند

برای جلوگیری از تداخل WHERE، ویوها باید نامی یکتا داشته باشند. بنابراین همزمان امکان استفاده از MainActivity و MainFragment وجود ندارد چرا که پیشوند Main دیگر مختص یک WHERE نیست.

۲- ریفکتورینگ پشتیبانی نمی‌شود

در هنگام ریفکتور کردن نام کلاس، نام ریسورس تغییری نمی‌کند. بنابراین اگر MainActivity را به ContentActivity تغییرنام دهید، activity_main به activity_content تغییر نمی‌یابد. امیدواریم گوگل روزی این قابلیت را به اندروید استودیو اضافه کند.

۳- هر نوع ریسورسی پشتیبانی نمی‌شود

روش پیشنهادی در حال حاضر از همه‌ی انواع ریسورس‌ها پشتیبانی نمی‌کند. برای تعدادی از ریسورس‌ها دلیلش این هست که کمتر استفاده می‌شوند و بسیار متنوع هستند (مثل raw یا asset ها). برای سایر ریسورس‌ها دلیلش تعمیم‌پذیری دشوار آن‌هاست (مثل thems/styles/colors/animations و …).

جمع‌بندی

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

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *