تمیز بودن کدهای یک پروژه از مهم ترین ویژگی هایی که باید رعایت بشه. میتونید در این Gist خلاصه ای مفید از تعریف کد تمیز مطالعه کنید :

Summary of ‘Clean code’ by Robert C. Martin
Summary of ‘Clean code’ by Robert C. Martin. GitHub Gist: instantly share code, notes, and snippets.

EditorConfig چیه ؟

وقتی شما یک پروژه در حال توسعه دارید ٬ افراد مختلفی روی اون کار می کنن که هرکدوم سیستم عامل و IDE متفاوتی هم ممکنه داشته باشن. انجام امور فنی در چنین شرایطی خیلی سخته چون خروجی کار هرکدام از افراد مجموعه ممکنه استایل متفاوتی با دیگر اعضا داشته باشه. اینجا است که EditorConfig به کمک ما میاد و تنها با نوشتن یک فایل میتونیم قوانین پیشفرضی رو برای پروژه مون تعریف کنیم.

shutterstock_148972376

روش کار به چه صورته ؟

در حال حاضر IDE ها کاملا از EditorConfig پشتیبانی می کنند. یکسری ها پیشفرض این قابلیت را دارند و یکسری ها هم با نصب Plugin به این قابلیت دست پیدا می کنند ( در انتها لیست کامل ذکر شده ).

و اما خود EditorConfig ... در اینجا ما هیچ تنظیمات خاصی وجود نداره و همه چیز فقط با استفاده از یک فایل انجام میشه. دقیقا همانند چیزی که در gitignore داریم.

اینجا فایلی با نام editorconfig. در محل اصلی پروژه میسازیم و تنظیمات خودمون رو در اون قرار میدیم. به محض اینکه یک پروژه را باز کنیم Plugin به جستجوی این فایل میپردازه و پس از اون گزینه های مورد نظر اعمال میشه.

ساختار فایل

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

root = true

[*]
end_of_line = lf
insert_final_newline = true

[*.py]
indent_style = tab

[lib/**.js]
indent_style = space
indent_size = 2

همه چیزی که اینجا وجود داره اینه :

  • برای تمام فایل ها EOL روی lf تنظیم بشه
  • در انتهای هر فایل یک خط خالی قرار داده بشه
  • برای فایل ها با پسوند py. فرورفتگی های به صورت tab باشه
  • برای تمام فایل ها با پسوند js. در پوشه ی lib فرورفتگی ها به صورت space معادل ۲ فاصله باشه

گزینه ها

در ادامه لیست کل گزینه های موجود رو مشاهده می کنید :

گزینه مقدار قابل تنظیم توضیحات هدف
indent_style tab, space مشخص کردن نوع فرورفتگی ها
indent_size integer, tab مشخص کردن سایز فرورفتگی. اگر روی tab تنظیم بشه برابر با مقداری tab_width خواهد بود. در صورتی که این مقدار در فایل تعریف نشده باشه ٬ از مقدار مشخص شده در IDE استفاده میشه.
tab_width integer مشخص کردن عرض هر کارکتر tab
end_of_line lf, crlf, cr تنظیم EOL برای فایل ها. جهت اطلاعات بیشتر به این لینک مراجعه کنید
charset latin1, utf-8,utf-16be, utf-16le,utf-8-bom مشخص کردن character encoding
trim_trailing_whitespace true, false حذف کارکتر خالی اضافه در انتهای خط های فایل
insert_final_newline true, false قرار دادن یک خط خالی در انتهای فایل ها
max_line_length integer, off مشخص کردن نهایت طول هر خط که پس از آن به طور خودکار شکسته شده و به خط بعدی می رود. این گزینه ممکنه در بعضی IDE ها کار نکنه و از تنظیمات خود برنامه استفاده بشه
quote_type single, double, auto کارکتر انتخابی برای پوشش رشته ها به صورت ' یا " رشته های موجود در کد
c_include_path لیست پوشه های جدا شده با علامت : اختصاص پوشه مربوط به فایل های Header برای بعضی زبان های خاص. جهت جلوگیری از خطاهای رایج زبان های خانواده C
java_class_path لیست مسیر های جدا شده با علامت : اختصاص CLASSPATH مورد نیاز برای بعضی Plugin ها زبان جاوا
curly_bracket_next_line true, false تنظیم اینکه براکت توابع یا کلاس ها جلوی نام آن ها قرار بگیرد یا در خط بعدی زبان های خانواده C
spaces_around_operators true, false, hybrid تنظیم اینکه اطراف اپراتور ها فاصله خالی قرار بگیرد یا نه
spaces_around_brackets none, inside, outside,both تنظیم اینکه اطراف براکت ها فاصله قرار بگیرد و اینکه فاصله در کجا باشد
indent_brace_style K&R, Allman, GNU,Horstmann و غیره اعمال استایل برای نوع فرورفتگی ها. جهت اطلاعات بیشتر به این لینک مراجعه کنید زبان های خانواده C

الگوهای انتخاب حوزه

حالا که با تمام گزینه های موجود آشنا شدید وقتشه که به مبحث انتخاب حوزه بپردازیم. همونطور که در فایل نمونه مشاهده کردید ما میتونیم برای پوشه های مختلف یا حتی فایل های با فرمت خاص ٬ قوانین متفاوتی تعریف کنیم. اینجا اکثر قوانین شبیه به فایل gitignore هستند.

  • * : برابر با هر رشته ای از کارکتر ها به جز /
  • ** : برابر با هر رشته ای از کارکتر ها به جز
  • ? : برابر با هر کارکتری
  • [name] : برابر با هر کارکتر موجود در رشته name
  • [!name] : برابر با هر کارکتری که در رشته name نباشد
  • {s1,s2,s3} : برابر با هرکدام از رشته های موجود در لیست
  • {num1..num2} : برابر با هر عددی بین num1 و num2

برای مثال به این موارد نگاه کنید :

[*.{js,py}]
charset = utf-8

در اینجا حوزه ما تمام فایل ها با پسوند py یا js تنظیم میشه.

[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

در اینجا تنظیمات دقیقا روی دو فایل package.json و travis.yml. اعمال میشه.

لیست IDE ها

همونطور که در ابتدای مطلب گفتم ٬ یکسری از IDE ها و محیط ها به صورت پیشفرض از EditorConfig پشتیبانی میکنن و نیاز به نصب هیچ چیز اضافی نیست. مانند این موارد :

و در ادامه برای استفاده از EditorConfig در این موارد نیاز به نصب Plugin جدایی دارید :