Variable (متغیر) یکی از عناصر پایهای در برنامهنویسی است. در واقع، متغیرها از اولین مطالبی هستند که در زمینهٔ برنامهنویسی میآموزید و از همین روی خیلی سریع عادت به استفاده از آنها خواهید کرد اما در عین حال میبینیم بسیاری از دولوپرهای تازهکار از متغیرها بیش از حدی که باید استفاده میکنند! به طور کلی، اگر از متغیرها درست استفاده شود، میتوانند بسیار قدرتمند ظاهر شوند ولی در صورت استفادهٔ نابجا از آنها، ممکن است منجر به ایجاد مشکلاتی در توسعهٔ اپلیکیشن در آینده شوند.
به عنوان یک قانون کلی، از متغیرها نباید برای توضیح دادن سورسکد استفاده کرد (به طور مثال، کاری که قرار است یک کامنت انجام دهد را در نامگذاری متغیرها لحاظ کرد.) مسأله اینجا است که کدها باید آنقدر واضح باشند که برای فهمیدن آنها، نیازی به استفاده از متغیرها و کامنتهای اضافی نباشد. در واقع، زمانی که در حال خواندن سورسکد نوشته شده توسط دولوپر دیگری هستیم، باید به متغیرهای ایجاد شده نگاهی بیاندازیم و از خود بپرسیم که آیا این کد میتواند متغیرهای کمتری داشته و تمیزتر باشد ولی در عین حال عملکرد آن تغییری نکند یا خیر.
استراتژیهای افزایش خوانایی سورسکد
در فرایند کدنویسی، عقل سلیم تمایل به استفاده از متغیرها به منظور افزایش خوانایی سورسکد دارد، ولی این کار دو مشکل در پی خواهد داشت که عبارتند از:
- افزایش استفاده از متغیرها باعث کاهش خوانایی کدها میشود: استفادهٔ زیاد از متغیرها باعث افزایش تعداد خطوط میشود و همچنین تعداد نامهایی که باید در حین کدخوانی به خاطر بسپارید را نیز افزایش میدهد. در همین راستا، بهتر است کدی که مینویسید شامل حداقل چیزهایی باشد که باید آنها را درک کنید تا اینکه بخواهید یک خط را بیش از یک بار چک کنید تا دلیل استفاده از یک متغیر را بفهمید.
- متغیر هرگز یک میانبر نیست: اگر دلیل استفاده از متغیر افزایش خوانایی سورسکد است، در چنین شرایطی است که نگاه ما به متغیرها چیزی همچون شورتکات (میانبر) است. خوانایی سورسکد اساساً از معماری خوب آن نشأت میگیرد و استفادهٔ بیجا از یک متغیر، سورسکد را دارای نواقضی میکند که باعث مشکلاتی در توسعهٔ اپلیکیشن در آینده خواهد شد.
درآمدی بر موارد استفادهٔ اشتباه از متغیرها
مهم است که بدانیم موارد اشتباه در استفاده از متغیرها چیست تا در زمان خواندن کدهای خود و دیگران، آنها را تشخیص داده و درصدد ریفکتور کردن آنها برآییم. در همین راستا، زمانی که از یک متغیر کوچک برای افزایش خوانایی سورسکد استفاده میکنیم، چیزی همچون کد زیر به دست میآید (لازم به ذکر است که از زبان PHP برای نمایش نمونه کدها استفاده شده است):
$authorName = $this->getAuthorName();
echo "This is $authorName";
این متغیر به کسی کمک چندانی نمیکند. خیلی ساده ما در حال اضافه کردن یک خط به کد خود هستیم در حالی که ممکن است به نظر برسد این کار ما به خوانایی بیشتر کد کمک میکند اما واقعیت امر آن است که هیچ کمک قابلتوجهی از جانب متغیر authorName$
به ما نشده است. در واقع، این کار ما همهچیز را خراب میکند زیرا هر کسی که بخواهد این کد را بخواند، باید به دنبال بخشی از کد باشد که متغیر authorName$
در آن تعریف شده است. کد بالا میتواند به صورت زیر بهبود یابد:
echo "This is " . $this->getAuthorName();
البته که این مثال یک نمونهٔ ساده است ولی با دانستن مسائلی از این دست، قادر به تشخیص استفادهٔ بیمورد از متغیرهای کوچک در کدهای پیچیدهتر خواهید بود. علاوه بر این، همیشه در سورسکد جاهایی وجود دارند که نیاز به کدهای پیچیدهتری داشته و در این موارد از متغیرها به منظور خوانایی بیشتر سورسکد استفاده میشود به طوری که نام متغیر شامل تعداد کاراکترهای بیشتری نیز خواهد شد. به عنوان مثال داریم:
$kilometerToMileConverted = 1 * 0.621;
echo "1 Kilometer is equal to $kilometerToMileConverted mile(s)";
همانطور که مشاهده میشود، متغیری با نامی نسبتاً بلند داریم که مقادیرش هم به صورت استاتیک در نظر گرفته شدهاند. در چنین شرایطی، راهکار مناسب آن است که فرمول خود را داخل یک فانکشن (تابع) قرار داده و کد را کمی داینامیک کرده و در نهایت آن را مورد استفاده قرار دهیم. برای نمونه داریم:
function kilometer2mile($input)
{
$kilometerToMileConverted = $input * 0.621;
echo "$input Kilometer is equal to $kilometerToMileConverted mile(s)";
}
kilometer2mile(100);
همانطور که مشاهده میشود، فانکشنی داریم تحت عنوان ()kilometer2mile
که یک پارامتر ورودی میگیرد تحت عنوان input$
سپس فرمول محاسبهٔ خود را داخل فانکشن گذاشته و خروجی را echo
میکنیم. در مثال فوق، چیزی که نمایش داده میشود به صورت زیر است:
100 Kilometer is equal to 62.1 mile(s)
روی هم رفته، استفاده از یک فانکشن در چنین شرایطی دارای مزایای زیر است:
- کد تمیزتر است. در هر قسمت کد، یک متغیر مشاهده نمیکنید، بلکه فقط یک فانکشن با نامی گویا به چشم میخورد.
- کد قابل استفادهٔ مجدد است به طوری که میتوانید از این فانکشن در هر کجای سورسکد استفاده کنید. علاوه بر این، فقط به جای یک عدد ثابت، میتوان مقادیر متغیری برای تبدیل از کیلومتر به مایل استفاده نمود (همانطور که مشاهده میشود، در مثال بالا از پارامتر ورودی ۱۰۰ استفاده شده است.)
- درک کد آسان است به طوری که با یک نگاه به ورودی مثلاً ()kilometer2mile
و خروجیاش، متوجه خواهید شد که در چه زمانی این فانکشن چه نوع عملکردی از خود نشان خواهد داد.
هیچچیزی جایگزین معماری خوب نمیشود
در این باره باید بگوییم که متغیرها آنچنان که به نظر میآیند بیعیب و نقص نیستند. در واقع، با توجه به اینکه استفاده از متغیرها آسان است، میتوانند دولوپرها را بسیار وسوسه کنند تا از آنها به عنوان یک میانبر برای بهتر کردن ظاهر کدها استفاده کنند ولی همانطور که دیدیم، استفاده از متغیرها راهحل خوبی برای بهتر کردن کدهای پیچیده نیست و میتواند مشکلات را در آینده پیچیدهتر هم کند.
به طور کلی، هیچچیز قابل جایگزین کردن یک Architecture (معماری) خوب نیست به طوری که وقتی در حال بررسی سورسکدی هستید، با دقت بررسی کنید که متغیرها درست به کار رفتهاند یا خیر. همچنین تمرین بررسی استفادهٔ نابهجا از متغیرها و اصلاح آنها، شما را به یک Code Reviewer (مرورکنندهٔ کد) خوب مبدل خواهد ساخت.