هفت عادت بد کدنویسی PHP
یکی از چالشهای اصلی برنامهنویسان مبتدی و پیشرفته این است که چگونه سبک کدنویسی خود را بهبود بخشند تا آن را خواناتر و قابل نگهداریتر کنند.
هفت عادت که ممکن است مانع از بینقص بودن کد PHP شما شود
هفت عادت بد یا نقص کدنویسی PHP
در این پست، لیستی از ۷ مشکل معمول که ممکن است برنامهنویسان با آنها مواجه شوند به همراه سادهترین روشها برای حل این مشکلات را مشاهده خواهید کرد. این مشکلات در واقع استفاده نادرست از کدهایی هستند که توسط خود برنامهنویس به کد معرفی میشوند و ریشهکن شدن آنها ممکن است خوانایی، قابلیت نگهداری و استفاده از کدهایی را که برنامهنویس مینویسد را تا حد زیادی بهبود بخشد.
آنچه میخوانید:
مشکل شماره ۱: عدم استفاده از توابع (Functions)
مشکل: استفاده نکردن از توابع یک مشکل مشخص برای برنامهنویسان PHP، به خصوص در اوایل کارشان، است. مشکل از این واقعیت ناشی میشود که یک برنامهنویس میتواند دهها خط از اسکریپتهای PHP را بدون نیاز به قرار دادن بخشهای کد در توابع بنویسد. این کار مشکل ساز است چرا که درک این که کد واقعا چه کاری انجام میدهد بدون کاوش عمیق در آن دشوار است و برنامه نویس ممکن است ناخواسته خود را تکرار کند.
راهحل: راهحل این است که کد را به توابع جداگانه تقسیم کنید.
مشکل شماره ۲: عدم استفاده از توابع داخلی PHP
مشکل: ما برای حل یک مشکل رایج به یک تابع نیاز داریم و سعی میکنیم خودمان، به جای جستجوی یک تابع موجود که عملکرد مورد نیاز ما را ارائه میدهد، آن را بنویسیم.
راهحل: PHP صدها Function مفید را ارائه میدهد که نیاز به دوباره کاری را از بین میبرد، و اغلب کار را بسیار موثرتر از هر چیزی که یک برنامهنویس استاندارد مینویسد، انجام میدهد. بنابراین اگر با نیاز به نوشتن توابع پیچیدهای مواجه شدید که فکر میکنید ممکن است از قبل وجود داشته باشند، بهتر است پیش از شروع به نوشتن کد خود در اینترنت (و به ویژه اسناد PHP) جستجو کنید.
مشکل شماره ۳: نامهای مبهم برای توابع و متغیرها
مشکل: یکی دیگر از مشکلاتی که حتی در بین برنامهنویسان باتجربه ظاهر میشود، انتخاب نام مبهم و نامفهوم متغیرها و توابع است. به عنوان مثال، نام تابعی مانند «doSomething» بسیار مبهم است. ممکن است مشکل به دلایل مختلفی باشد: عدم آگاهی، تنبلی، یا نتیجه عملکردی که کد به منظور انجام یک عمل خاص نوشته شده بود، اما به جای آن عمل دیگری را انجام داد. این مشکل به کاهش خوانایی کد کمک میکند و به مشکلات در نگهداری و اصلاح کد میافزاید.
راهحل: راهحل این است که به توابع و متغیرها نامهای دقیق و توصیفی بدهیم که شامل ۲ تا ۳ کلمه یا بیشتر باشد. مانند: userRegister
مشکل شماره ۴: اعداد جادویی
مشکل: عدد جادویی عددی است که در کد پیدا میشود که هیچ توضیح یا نامی ندارد. به عنوان مثال، عدد ۵ در مثال کد زیر یک عدد جادویی است:
<?php for($i = 0; $i < 5; $i++) { //do check }
مشخص نیست که کد چرا باید ۵ بار اجرا شود.
راهحل: برای خوانایی بیشتر کد، بهتر است به متغیر یک نام توصیفی بدهیم. مثلا:
$numberOfChecks = 5; for($i = 0; $i < $numberOfChecks; $i++) { //do check }
به همین ترتیب، رشتههای جادویی رشتههایی هستند که بدون هیچ توضیحی در کد ظاهر میشوند و در مورد آنها نیز توصیه میشود نام یک متغیر را به عنوان یک نام توصیفی به کار ببرید.
مشکل شماره ۵: تکرار کد
اگر متوجه شدید که یک کد را بارها و بارها مینویسید، مشکلی در کد شما وجود دارد.
مشکل: اگر متوجه شدید که یک کد را بارها و بارها مینویسید، مشکلی در کد شما وجود دارد. علاوه بر این، وقتی چنین کاری میکنید، یکی از مهمترین اصول نوشتن کد مدرن را زیر پا میگذارید: خودتان را تکرار نکنید (DRY=Don’t Repeat Yourself). دلیل مهم بودن اصل DRY ساده و کاربردی است. تصور کنید بعد از اتمام نوشتن کد، باید چیزی را تغییر دهید. اگر به اندازه کافی سختگیر نیستید و یک کد را بیش از یک بار نوشتهاید، باید تلاش کنید تا کد را در چندین مکان تغییر دهید که میتواند به پیدایش باگها کمک کند. با این حال، اگر مطمئن شوید که کد خود را تکرار نمیکنید، باید کد را تنها در یک مکان تغییر دهید.
راهحل: بهترین راه برای جلوگیری از تکرار کد این است که کد را در توابع بپیچید و سپس هر تابعی را که نیاز دارید از هر کجا که نیاز دارید فراخوانی کنید.
مشکل شماره ۶: توابعی که بیش از یک کار را انجام میدهند
یک Function موثر در حالت ایدهآل باید فقط یک کار را انجام دهد
یک تابع موثر در حالت ایدهآل باید فقط یک کار را انجام دهد تا بتوانیم آن را از مکانهای مختلف کد فراخوانی کنیم و با اطمینان کامل بدانیم که دقیقا همان کاری را که قرار است انجام دهد انجام میدهد و هیچ کار دیگری را انجام نمیدهد. بنابراین، باید مراقب بود که هر تابعی که مینویسید تنها یک مسئولیت داشته باشد.
در مثال زیر، تابع validatePhoneNumberThenWrapInHtml دو کار انجام میدهد:
- بررسی میکند که آیا یک رشته یک شماره تلفن معتبر است یا خیر
- شماره تلفن یا یک هشدار در html را خروجی میدهد
function validatePhoneNumberThenWrapInHtml($string) { //replace all the non-digit characters $onlyDigits = preg_replace('/[^0-9]/','',$string); // checks if the length of the remaining string // is 7-14 characters long $onlyDigitsLen = strlen($onlyDigits); $isValidPhoneNumber = ($onlyDigitsLen >= 7 && $onlyDigitsLen <= 14); // a warning if it is not a phone number if(!$isValidPhoneNumber) $onlyDigits = "Not a phone number"; // return the phone number wrapped in html return "<p>{$onlyDigits}</p>"; }
بیایید تابع را با یک رشته معتبر و غیر معتبر بررسی کنیم:
var_dump(validatePhoneNumberThenWrapInHtml("1-800-123-4567")); var_dump(validatePhoneNumberThenWrapInHtml("1-800-123-45678910"));
خروجی:
string '<p>18001234567</p>' (length=18) string '<p>Not a phone number</p>' (length=25)
همانطور که میبینیم، تابع شماره تلفن را تایید میکند و سپس نتیجه در html را برمیگرداند. این بدان معناست که ما نمیتوانیم هر بار که میخواهیم اعتبار یک شماره تلفن را بررسی کنیم و از این تابع استفاده کنیم چرا که یک مقدار بولین (درست یا نادرست) را به جای html برمیگرداند. این امر را به جد باید در نظر گرفت چرا که ما نباید خودمان را تکرار کنیم و کد اعتبار سنجی را بارها و بارها در هر تابعی که نیاز به بررسی اعتبار شماره تلفن دارد بنویسیم. این کار میتواند باعث ایجاد تکرار در کد ما شود، در حالی که تکرار چیزی است که ما در تلاش برای حذف آن هستیم (مشکل شماره ۵ را ببینید).
بنابراین راهحل بهتر این است که تابع را به دو تابع تقسیم کنیم که هر کدام تنها یک مسئولیت دارند. توابع عبارتند از:
- validatePhoneNumber که شماره تلفن را تایید میکند
- wrapInHtml که نتیجه را در html قرار میدهد
function validatePhoneNumber($string) { //replace all the non-digit characters $onlyDigits = preg_replace('/[^0-9]/','',$string); // checks if the remaining string // is 7-14 characters long // and return boolean (true/false) value $onlyDigitsLen = strlen($onlyDigits); return $isValidPhoneNumber = ($onlyDigitsLen >= 7 && $onlyDigitsLen <= 14); } function wrapInHtml($string) { // return the string wrapped in html return "<p>{$string}</p>"; } // check the 2 functions $string = "1-800-123-4567"; $isValidPhoneNumber = validatePhoneNumber($string); var_dump(($isValidPhoneNumber)? wrapInHtml($string) : wrapInHtml("Not a valid phone number"));
مشکل شماره ۷: شرایط تو در تو بسیار زیاد
مشکل: یکی از مشکلات اصلی که باعث میشود کد به هم ریخته و خواندن آن دشوار باشد، وجود شرایط تودرتوی بیش از حد است (یعنی یک دستور if در یک دستور if دیگر).
مثال کد زیر را در نظر بگیرید:
$string==='m'; if($string==='a' || $string==='b') { if($string==='a') { echo "a indeed"; } if($string==='b') { echo "b"; } } else { echo "x"; }
خروجی:
x
راهحل: با استفاده از توابع و دستور بازگشت میتوانیم مشکل شرایط تو در تو را حل کنیم.
مثلا:
function eliminateNestedConditionals($string) { if($string==='a') return "a indeed"; if($string==='b') return "b"; return "x"; } $string = "m"; echo eliminateNestedConditionals($string);
نتیجهگیری
اگر قصد دارید دانش خود را در زمینه بهبود سبک کدنویسی PHP با کاهش استفاده نادرست از کد افزایش دهید، اصطلاح کد تمیز (Clean Code) را در گوگل جستجو کنید.
آیا PHP یک زبان در حال مرگ است؟
آیا PHP یک زبان برنامه نویسی در حال مرگ است؟ پیش از اینکه به «آیا کمتر از PHP استفاده میشود؟» نگاهی بیندازیم، اجازه دهید با نکات مهمی که باید در […]