اسکریپت تمیز

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

پ.ن. ۱) خوب هنوز ننوشته چند تا پیشنهاد گرفتم از narcislinux . یکی اینکه می تونید bash style guide را google‌ کنید به لینک های خیلی خوبی مثل این و این می‌رسید.

رعایت indent

استفاده از «Indent» یا به قول ویکی پدیا «دندانه دار» نوشتن، یعنی اضافه کردن فاصله یا tab در ابتدای هر خط به شکلی که ارتباط بخش های مختلف کد بهتر مشخص باشد. در اکثر مواقع شما در فواصل طولانی نیاز به ویرایش و بازخوانی اسکریپتتون می کنید یا اینکه شخصی جانشین شما می شه و قرار بفهمه شما چی کار کردید. رعایت این کار باعث خوانایی می شه، هم برای خودتون هم برای نفر بعدی که احتمالا جای شما می یاد.

helloworld() { 
    if ... 
    then 
      do somthing 
    fi 
}

helloworld() {
    if ...
    then
      do somthing
    fi
}

 

سر و ته function

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

new_func() { 
  echo "This is new function" 
  ... 
  return 0 
} # new_func

new_func() {
  echo "This is new function"
  ...
  return 0
} # new_func

 

تعریف return value

خیلی خوبه که عادت کنید هر function ای تعریف می کنید حتما براش return value‌ هم تعریف کنید. خیلی مواقع زمانی که شروع به نوشتن اسکریپت می کنیم، به error handling اسکریپت فکر نمی کنیم و زمانی که لازمش داریم مجبور می شیم از اول کدمون را بررسی کنیم. اسکریپتتون با ساختار زیر شروع کنید

#!/bin/bash

new_func() {
  return 0
}

exit 0

 

خوب این یه عادت خوبه که قبل از نوشتن function‌ و یا هر بخش دیگه از اسکریپت return value ها را مشخص کنید. خوب مطمئنا در ادامه باید حواستون به جاهایی که ممکنه اسکریپت با خطا مواجه بشه هم باشه. این کار باعث می شه که شما بعد از اجرای اسکریپتتون بتونید ?$ را بررسی کنید و مطمئن بشید که اسکریپت بدون خطا اجرا شده.

new_func() { 
  if true 
  then 
    ... 
    return 0 
  elif false 
  then 
    ... 
    retrun 1 
  fi 
} # new_func

new_func() {
  if true
  then
    ...
    return 0
  elif false
    then
    ...
    retrun 1
  fi
} # new_func

 

تعریف متغیر ها

یکی دیگه از موضوعاتی که در یک اسکریپت بزرگ درگیرتون می کنه، تعریف متغیرها و زیاد شدن اونهاست. دغدغه اینکه آیا این متغیر را قبلا تعریف کردید؟ نکنه اسمش تکراری بشه. خوب برای این موضوع من دو تا نکته را رعایت می کنم

۱- متغیر های سراسری را خارج از function ها و با حروف بزرگ تعریف می کنم (برای مثال: VARIABLE) و متغیر های محلی که داخل function بهشون نیاز هست را با حروف کوچک (برای مثال: variable)

پیشنهاد ۱) این پیشنهاد از طرف narcislinux بود. اینکه این انتخاب هم می‌تونه مشکلاتی داشته باشد. مثلا تداخل نام با متغیر های محیطی (Environment Variable). پیشنهاد من این هست که یک قرارداد نامگذاری برای خودتون مشخص کنید. برای اینکار قسمت ساختار نامگذاری را در ادامه مطالعه کنید.

۲- برای متغیرهای محلی که قرار فقط داخل function ازشون استفاده کنم، از دستور local استفاده می کنم. این کار باعث می شه که زمانی که function اجراش پایان پیدا کنه، متغیر هم پاک بشه. پس دیگه دغدغه تکراری شدن متغیر را نخواهید داشت.

new_func() { 
  local variable1 
  local variable2=$1 
  ... 
  return 0 
} # new_func VARIABLE=$1

new_func() {
  local variable1
  local variable2=$1
  ...
  return 0
} # new_func

VARIABLE=$1

 

ساختار نامگذاری

هم در تعریف متغیر و هم تعریف نام تابع بهتر هست که یک مدل مشخص کنید و در تمام اسکریپتتون از اون استفاده کنید. مثلا بهتر هست که از اسامی تک کلمه ای استفاده نکنید، چرا که نمی تونه مفهموم را برسونه . علاوه بر اون نترسید که اسم خیلی بلند بشه، طوری تعریف کنید که بتونه دلیل تعریفش را برسونه. اینکه یک ساختار نامگذاری داشته باشید مزایای زیر را داره:

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

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

  • flatcase
  • UPPERFLATCASE
  • camelCase
  • PascalCase
  • snake_case
  • SCREAMING_SNAKE_CASE or MACRO_CASE
  • camel_Snake_Case
  • Pascal_Snake_Case

 

ادامه دارد …

یک پاسخ

دیدگاهتان را بنویسید

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