اصول برنامه نویسی در PHP

۱۳۹۲/۰۳/۲۳

clean_codeپی اچ پی یکی از بهترین و پرکاربردترین زبان های دنیاست که داکیومنت های بسیاری برای آن وجود دارد. اما زبان php مشکلاتی دارد (طبیعی ست که همه ی زبان ها مشکلاتی دارند).
مهمترین مشکل PHP این است که سخت گیر نیست (برای هر کاری راه های بسیاری وجود دارد) و این باعث می شود که ما اشتباهاتی را مرتکب شویم که در پشت محدودیت های برنامه دیده نمی شود. در حالی که می توانیم با نوشتن کدتمیز (Clean Code) و خوانا از آنها جلوگیری کنیم.

محدودیت یک قانون مطلق است و ما نمی توانیم روی آن خط بکشیم و نادیده بگیریم. اما نکته هایی هست که رعایت کردن آنها باعث می شود تا برنامه هایمان را بهتر توسعه بدهیم که در اینجا به ۲۱ مورد اشاره می کنیم.

۱- تابع var_dump دوست شماست
این تابع به شما اجازه می دهد که نوع متغیرها را بفهمید. چون PHP یک زبان داینامیک است بنابراین دیباگ کردنش کمی سخته برای همین این تابع با نشون دادن متغیر ها و نوعشون یه کم دیباگ کردن رو ساده می کنه (هرچند ابزارهای متفاوتی هست برای این کار اما با این حال برعکس زبان هایی مثل #C یا … شما نمی تونید برنامه رو خط به خط اجرا کنید و بفهمید خطا از کجاست)
برای نمایش بهتر هم می تونید از تگ

 استفاده کنید.
                

۲- اندازه گیری زمان
چون زمان اجرای برنامه برای کاربر و خودما (صاحبان سرور)‌مهمه در نتیجه چیزی که باید خیلی بهش اهمیت بدیم (که معمولن نمی دیم) اینه که برنامه در کوتاه ترین زمان ممکن اجرا بشه.
برای این کار میشه از تابع microtime استفاده کرد.
برای نمونه به این کد دقت کنید:


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





شاید به نظر شما این بی معنی باشه. ولی قبول کنید که اگر این رو رعایت کنیم قدرت درک و یادگیری مون بالاتر می ره.

۴- اسم گذاری با مفهوم
مرغِ زیر زمینی ِ سنگ خوار ؟
مرد عنکبوتی چیه؟ مردیه که شبیه عنکبوته!!! این سخته؟ طبیعتن نه. اسم توابع و متغیرهامون هم باید مثل همین اسم قابل فهم باشه. وقتی اسم یه تابع رو جایی می بینیم باید از اسمش بفهمیم که کارش چیه و چه خروجی میده. همیشه شما باید از یه اسم متغیر یا تابع سرنخ بگیرید که کارش چیه.
بنابراین از اسم گذاری توابع یا متغیر ها به صورت:

“$a” , “$a1″, “$request_result” , “$first_element”

۵- درموردش گوگل کنید
این خیلی مهمه. در هر موردی یک بار سرچ کنید. ممکنه فکر کنید که چطوری با یه تابع می شه یه آرایه رو مرتب سازی کرد یا چیزای دیگه. ممکنه ندونید که یه همچین تابعی هست و همین کارو برای شما انجام می ده. حتی ممکنه کسی راه حلی ارائه کرده باشه یا تابعی براش نوشته باشه. با این کار گوگل به شما کمک می کنه که در مورد کاری که می خاید انجام بدید ایده ی بهتری بدید یا ابزار بهتری در اختیارتون بزاره.

۶- بولین ها (Booleans) باید پیچیده باشند؟
اگه قراره از بولین ها استفاده کنید سعی کنید اسم درستی براشون انتخاب کنید. فقط برای مثال به این توجه کنید:


۷- کپی-پیست دشمن برنامه نویسه
گاهی فقط دوخط کد می تونه روزتون رو هدر بده. منظورم این نیست که ما باید هر بار چرخ رو اختراع کنیم و همه ی کد هامون رو خودمون بنویسیم. بلکه منظورم اینه که ما باید از چیزی که توی برنامه مون استفاده می کنیم آگاهی کامل داشته باشیم. شما می تونید هر کدی رو از هر جایی که میخاید کپی کنید و توی برنامه تون استفاده کنید. اما فقط توجه کنید که قراره این کد چی کار بکنه! این حق شماست که نخواید بدونید که وقتی سوار ماشین میشید موتور به چه صورتی کار می کنه، اما اگر یه جایی ماشین خراب شد. انتظار این رو از خودتون نداشته باشید که بتونید اون رو تعمیر کنید.
یه برنامه مثل یه ماشینه. مراقبش باشید و بهش توجه کنید و هیچ وقت اجازه ندید که چیزی که نمی دونید چیه وارد ماشینتون بشه.

۸- Getters and Setters
یک کلاس باید یه سری قواعد رو رعایت بکنه. همون طوری که ما توی شیوه ی کدزدنمون یه سری قوانین رو رعایت می کنیم. مثلن سعی کنید خصوصیات (property) کلاس رو به صورت خصوصی(Private)‌تعریف کنید و براش ستر و گتر بزارید. برای مثال به این کد توجه کنید:

name;
        }

        // Setter
        public function set_name($string){
           $this->name = $string;
        }
}
?>

یعنی وقتی خصوصیتی به نام owner دارید می تونید پرایوتش کنید و برنامه نویس با دیدن این خصوصیت بفهمه که می تونه از get_owner و set_owner استفاده کنه برای دسترسی داشتن بهش.

۹- استثناها (Exceptions) کمک می کنن
اکسپشن ها معمولن چیزای بی خودی به نظر میان و وقتی استفاده می شن که ما بخایم از خطای برنامه مون رو باهاشون برطرف کنیم که خب راه های دیگه ای هم براش هست. اما در واقع اکسپشن ها خیلی از هدر رفتن وقت ما جلوگیری می کنن.
وقتی بخشی از برنامه اشتباهه (که معمولن این اتفاق برای همه می افته) ما باید به کاربر یا به یه برنامه ی دیگه بگیم که چه خطایی رخ داده و چرا این خطا رخ داده پس اکسپشن ها بسیار مفید هستند و ما باید در تمام برنامه هامون ازشون استفاده کنیم.

۱۰- تقسیم بکن و حکومت کن
بهترین راه برای کنترل یه برنامه اینه که اونو به بخش های کوچیک تبدیل کنید ( جعبه جعبه ) کنید. مثل دستگاه های پرینتر مثلن که هر عضوی برای خودش کار می کنه و وقتی خراب می شه شما لازم نیست که کل دستگاه رو عوض کنید. اون قطعه رو دور می ندازید و یه قطعه ی دیگه جاش می زارید. این قطعات با هم دیگه ارتباط دارن( معمولن از طریق مقداری که بر می گردونن returns).
این تعریف خیلی خلاصه بود اما بهترین چیزیه که می شه گفت. وقتی برنامه نویسی می کنیم باید به جعبه ها توجه کنیم و کار رو به بخش های کوچیک تقسیم کنیم. یه بخش کار خاصی انجام می ده و ما خروجی ش رو می گیریم و می ریزیم تو یه بخش دیگه.
به این کدها توجه کنید. روش غلط:


";
foreach($int_array as $value){
        echo $value . "
"; } sort($int_array); echo "The output is:" . "
"; foreach($int_array as $value){ echo $value . "
"; } ?>

روش درست:

";
        }
}

echo "We have to order this array" . "
"; print_array($int_array); sort($int_array); echo "The output is:" . "
"; print_array($int_array); ?>

این تقریبن یه مثال احمقانه ست اما به روشنی نشون می ده که می تونیم از چه روشی برای این کار استفاده کنیم. تابعی که تعریف شد به ما کمک می کنه که کدهای کمتری بزنیم و از تکرارهای بی مورد جلوگیری کنیم.

۱۱- کامنت کردن از کدزدن مهم تره
فکر کنید که یه برنامه پیچیده نوشتید با کلی کلاس و فانکشن بدون حتی یه خط کامنت. اگر چند ماه بعد یه برنامه نویس دیگه یا حتی خودتون بخاید برگردید رو همون برنامه و توسعش بدید مسلمن انجامش براتون سخت خواهد بود و زمان زیادی طول می کشه که روی روال بیافتید و دستتون بیاد که چی به چیه که بتونید خطا ها رو برطرف کنید. اینجاست که کامنت ها به دردتون می خورن و بهتون سرنخ می دن که برنامه رو سریع تر و بهتر درک کنید و دیباگ کنید.
در نهایت شما کامنت ها رو می خونید و ازشون سر در میارید اما استفاده کردن از یه سری علائم و کاراکترهای خاص می تونید استفاده کنید تا کدتون استاندارد تر و قابل استفاده تر بشه. مثل @ یا see@ برای رفرنس دادن به فانکشن دیگه یا return@ برای نمایش مقدار برگشتی تابع و نوعش.
شما می تونید از phpDocumentator استفاده کنید. خوبی این داکیومنتر اینه که می تونید از داکیومنت هاتون خروجی بگیرید با پسوند PDF یا HTML و یا حتی در IDE خودتون می تونید ازشون استفاده های خیلی خوبی بکنید.

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

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

۱۴- داکیومنت های رسمی تنها داکیومنت های قابل اعتمادن
اینترنت یه منبع بسیار بزرگ و وسیع اطلاعاته، اما در یه بخش خاص و تکنیکی ما باید خیلی مراقب باشیم و به همه اعتماد نکنیم. درو اقع شما وقتی به عملکرد یه تابع شک کردید یا می خواستید تابعی رو یاد بگیرید که خیلی پرکاربرده، بهترین راه اینه که به سایت رسمیش بریم و اونجا دنبال پاسخمون باشیم.

۱۵- استفاده از متغیرها
سعی کنید تا می تونید متغیر های کمتری تعریف کنید. اینکه متغیرهای زیادی داشته باشید باعث می شه گیج بشید. سعی کنید همه ی متغیر ها رو تو یه بخش از برنامه بزارید. اینطوری نباشه که هر جایی از صفحه که می خواید یه متغیر تعریف کنید و بعدن گم کنید که فلان متغیر کجا بود؟!
علاوه بر اینکه باید برای متغیر ها اسم های خوب و معنا داری انتخاب کنید، باید دقت کنید که همه ش دردسترس باشن. این کار باعث می شه که در یک برنامه چن تا متغیر هم اسم نداشته باشید. که اگه داشته باشید کانفلیکت پیش میاد و برنامه تون به مشکل بر می خوره.

۱۶- اهل صله ی رحم باشید :دی
خانواده خوب است. PHP هم یه زبان پدرمادر داره :دی ینی توش می تونید از وراثت استفاده کنید. این توهینه برای PHP که در برنامه های شی گرا از وراثت استفاده نکنید. چطوری این کارو باید انجام داد؟
این یه نمونه : احمقانه ترین کاری که می شه کرد اینه:


ولی می تونید همین رو با وراثت بنویسید که هم قابل فهم باشه و هم اینکه کد اضافی نداشته باشید:


givenName = $name;
    }

    public function get_givenName(){
        return $this->givenName;
    }

    public function set_age($age){
        $this->age = $age;
    }

    public function get_age(){
        return $this->age;
    }

    public function say_hello(){
        echo("I am ");
        $this->print_data();
    }

        
        abstract public function print_data();
}

class Employee extends Person{
    private $role;

        // Getters and setters
    public function set_role($r){
        $this->role = $r;
    }

    public function get_role(){
        return $this->role;
    }

/*این کلاس شامل همه ی مقدایر خصوصی،‌محافظت شده و عمومی ست */
    public function print_data(){
        echo($this->getRole()." ".$this->get_givenName().
                   " and I am " .$this->get_age() . " years old");
    }
}
?>

۱۷- توابع باید همیشه در کوچیک ترین حالت ممکن باشن
اگر توی برنامه تون تابعی دارید که برای دیدن همش باید اسکرول بکنید باید واقعن به فکر این باشید که این تابع رو کوچیک کنید و به تکه های ریزتر تبدیل کنید.

۱۸- با امکانات خودتون رو خفه نکنید
PHP به شما این اجازه رو می ده که برای شروط یک خطی از { } استفاده نکنید. شما مختارید از اون استفاده کنید یا نه ولی مثل این می مونه که با چاقوی رایگان شکم خودتون رو پاره کنید.
روش غلط :



روش درست:


۱۹- فریمورک ها می تونن زمان کار رو کاهش بدن
همیشه در تمامی پروژه ها یه سری کارای تکراری رو انجام می دیم که واقعن لزومی به تکرارش نیست. فریم ورک ها به ما کمک می کنن که در وقتمون صرفه جویی کنیم و از زدن کدهای اضافی پرهیز کنیم. علاوه بر اون امکاناتی دارن که خیلی در سرعت کانتریبیوت موثر و مفید هستن.
تعداد زیادی فریم ورک هست که هر کدوم بنا به سیاستی که در قبال توسعه ش دارن امکانات گوناگونی در اختیار ما میگذارن. یکی سرعت خیلی خوبی داره (CI و YII) یکی یادگیریش آسونه (CI و CakePHP) و بعضی هاشون هم بسیار بزرگ و گسترده هستن با کلی کتابخونه و پلاگین(ZF) که بیشتر شبیه یه کتابخونه ی بزرگ هستن تا فریم ورک.
استفاده از فریم ورک ها باعث می شه کارای پیش پا افتاده ای مثل CRUD رو به خودشون بسپریم و کدهای خسته کننده و تکراری نزنیم.

۲۰ – اوصیکم بالریجکس
تقریبن می تونید توی تمام پروژه ها از Regular Expression استفاده کنید. کارهایی که می تونید با ریجکس انجام بدید که واقعن تصورش هم سخته. تقریبن سینتکس راحتی داره و در تمامی زبان های برنامه نویسی و ترمینال لینوکس یا … می تونید از قابلیت هاش استفاده کنید.
در برنامه ها و اپلیکیشن های مختلف می تونید با اندک تغییراتی به راحتی با متن کار کنید. هیچ چیزی نمی تونه در پردازش متن به پای ریجکس برسه. سعی کنید یادش بگیرید چون با هر زبان و هر پروژه ای که کار کنید می تونید از قابلیت هاش استفاده کنید.
علاوه بر اینکه کلی در زمان کدنویسی تون صرفه جویی می کنید می تونید با استفاده از ریجکس کدهای تمیزتری بنویسید.

3 دیدگاه در “اصول برنامه نویسی در PHP

  1. خیلی باحال بود
    خیلی از چیزاشو اگر هم از ابتدا برنامه نویسای php اگه رعایت نکنن دست روزگار و مشقت و دردسر کد کثیف زدن یادشون میده که رعایت کنن

پاسخ دهید

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

شما می‌توانید از این دستورات HTML استفاده کنید: