Behnam Nasehi | بهنام ناصحی
Behnam Nasehi | بهنام ناصحی
خواندن ۶ دقیقه·۵ سال پیش

یک قرارداد نام گذاری XML موفق | ایجاد نظم در پروژه


آخرین باری که مجبور شدید فایل string.xml باز کنید و به سختی و غرزنان دنبال ایدی String مورد نظر خودتون بگردید کی بوده ؟ یا اینکه تک تک همه drawable باز کنید و اونی که مدنظرتونه رو پیدا کنید ؟
هروقت که پروژه جدید شروع کردید خیلی مواظب architecture, CI, build flavors و و و ... بودید ولی آیا استراتژی مناسبی برای نام گذاری resources داشتید ؟
باید داشته باشید ! نبود نام مناسب باعث میشه که در مدیریت پروژتون خسته بشید با نام گذاری درست میتونید راحت پروژه کنترل کنید مخصوصا در پروژه های بزرگ !

اصل اساسی

همه resources از یه قرداد ساده پیروی میکنن :

<WHAT> _ <WHERE> _ <DESCRIPTION> _ <SIZE>
بیایم اول در مورد تک تک اینا صحبت کنیم

<WHAT>

هموطوری که از اسمش پیداست نشان میده که دقیقا resources چه چیزی هستن ؟ معمولا Android View Class
برای مثال :

e.g. MainActivity -> activiy


<WHERE>

توضیحی درباره اینکه از لحاظ منطقی در کجای اپ شما قرار دارد اگر در جاهای مختلفی استفاده میکنید از all و در غیر این صورت از اسم کلاسی که داخلش ازش استفاده میشه استفاده کنید
برای مثال :
e.g. MainActivity -> main
ArticleDetailFragment -> articledetail


<DESCRIPTION>

یه توضیحی تقریبا یک کلمه برای تفکیک عناصر در یک صفحه
مثال :
e.g. title


<SIZE> (optional)

این قسمت اختیاری و معمولا برای سایز دهی استفاده میشه
مثال :
24dp
small

چندتا مثال

  • Layouts (<WHAT><WHERE>.XML):
    activity_main.xml
  • Strings (<WHERE><DESCRIPTION>):
    main_intro
    all_done
  • Drawables (<WHRE><DESCRIPTION><SIZE>):
    main_background
    all_infoicon_small
  • ID (<WHAT><WHERE><DESCRIPTION>):
    linearlayout_main_fragmentcontaine


مزایا

  • قسمت WHERE توصیف می کند که کدام صفحه از یک منبع متعلق به آن است. از این رو ، به راحتی میتونید همه IDs, drawables, dimensions را برای یک صفحه خاص دریافت کنید.
  • قسمت WHAT در ایدی منابع ها نام کلاسی که Xml متعلق به ان هست را توصیف میکند پس در findViewById() برای شما راحت تر که چه چیزی را صدا بزنید
  • فایل هایی که در اندروید استودیو لیست میشوند معمولا بر اساس الفبا ترتیب بندی میشوند و با رعایت این نوع قرار داد نامگذاری یک لیست منظم از فایل هایتان دارید و برایتان پیدا کردن فایل مدنظرتون بسیار اسان میشود
  • نام های منابع بسیار قابل پیشبینی شده و استفاده از autocomplete اندروید استودیو بسیار اسان میشود
  • به طور کلی تمام منابع منطقی نام گذاری میشوند و این امر باعث میشود پروژه تمیز تری داشته باشید


چندتا مثال میزنم براتون از چند قسمت پروژه :

1. Layouts

معمولا در پروژه ها ما برای هر اسکرینی یک Layout دارم پس در نتیجه خیلی ساده ست نحوه نام گذاریش :
WHAT_WHERE.XML

What معمولا یکی از موارد زیر است :
activity = content view for activity
fragment = view for a fragment
view = inflated by a custom view
item = layout used in list/recycler/gridview
layout = layout reused using the include tag

مثال :

  • activity_main: content view of the MainActivity
  • fragment_articledetail: view for the ArticleDetailFragment
  • view_menu: layout inflated by custom view class MenuView
  • item_article: list item in ArticleRecyclerView
  • layout_actionbar_backbutton: layout for an actionbar with a backbutton (too simple to be a customview)

2. Strings

در String ها کلمه what نامربوطه پس بجاش از Where برای نشان دادن محل استفاده , استفاده میکنیم :

<WHERE>_<DESCRIPTION>
و یا برای استفاده از String در کل برنامه :
all_<DESCRIPTION>
مثال :

  • articledetail_title: title of ArticleDetailFragment
  • feedback_explanation: feedback explanation in FeedbackFragment
  • feedback_namehint: hint of name field in FeedbackFragment
  • all_done: generic “done” string

3. Drawables

این هم مانند String ها از Where استفاده میکنیم :

<WHERE>_<DESCRIPTION>_<SIZE>
و یا برای استفاده در کل برنامه :
all_<DESCRIPTION>_<SIZE>

به صورت اختیاری میتوانید یک آرگومان Size اضافه کنید که یا میتواند به صورت 26 باشد یا large

مثال :

  • articledetail_placeholder: placeholder in ArticleDetailFragment
  • all_infoicon: generic info icon
  • all_infoicon_large: large version of generic info icon
  • all_infoicon_24dp: 24dp version of generic info icon

4. IDs

برای ID کلمه What نام کلاسی است که به آن تعلق دارد و Where اسکرینی است که در ان قرار دارد و میتوانید برای ID هایی که مشابه هستند میتوانید DESCRIPTION هم به صورت اختیاری اضافه کنید :

<WHAT>_<WHERE>_<DESCRIPTION>

مثال :

  • ablayout_main -> TabLayout in MainActivity
  • imageview_menu_profile -> profile image in custom MenuView
  • textview_articledetail_title -> title TextView in ArticleDetailFragment

5. Dimensions

پروژه باید مجموعه محدودی از dimensions را تعریف کنید که مرتبا مورد استفاده قرار میگیرد که این باعث میشه کلمه all به طور پیشفرض در نامگذاری باشد :

<WHAT>_all_<DESCRIPTION>_<SIZE>
برای جاهای خاص میتوانید از Where هم استفاده کنید

کلمه WHAT در dimensions معمولا یکی از موارد زیر است البته توجه داشته باشید که لیست پایین شامل بیشترین موارد استفاده شده از کلمه What است :

  • height_toolbar: height of all toolbars
  • keyline_listtext: listitem text is aligned at this keyline
  • textsize_medium: medium size of all text
  • size_menu_icon: size of icons in menu
  • height_menu_profileimage: height of profile image in menu


نکات مهم

صفحه ها باید اسامی منحصر به فرد داشته باشند

برای جلوگیری از مشکل در آرگومان Where کلاس های شما باید اسم های منحصر به فرد داشته باشند پس در نتیجه شما نمیتوانید MainActivity و MainFragment داشته باشید چون پیشوند main قبلا مورد استفاده قرار گرفته

ساپورت نکردن Refactoring

با عوض کردن اسم کلاس اسامی که در resource ها قرار تغییر نمیکنند پس اگر شما کلاس MainActivity را به SecondActivity تغییر دادید layout activity_main به activity_second تغییر نخواهد کرد امیدواریم که یه روزی اندروید استودیو چنین ویژگی را اضافه کنه :)

همه نوع resource ساپورت نمیشن

این قرار داد برای همه resource نیست و بعضی ها جایی توی این قرار داد ندارند مانند: Raw Assets


ممنون که وقتتون رو در اختیار من گذاشتید :)
بنظرتون خوب نیست که همه روی این قرار داد تمرکز کنیم و در پروژه هامون استفاده کنیم که تقریبا یه زبان مشترک بین ما بشه تا بتونیم راحت تر کد هارو ری ویو کنیم ؟ ؟ نظرتون برام خیلی مهمه
اگه هم جایی اشتباه کردم لطفا بهم بگید تا ویرایش کنم...


Ref :https://jeroenmols.com/blog/2016/03/07/resourcenaming/

مقاله ی دیگه هم نوشتم برای اینه بتونی متوجه شی چه موقعی کیبوردت باز شده !

http://vrgl.ir/bA5Ti



برنامه نویسیاندرویداندروید استودیوجاوااپلیکیشن
Android Application Developer https://behnamnasehi.ir
شاید از این پست‌ها خوشتان بیاید