تصميم موقع الويب الخاص بك مع PHP و MySQL


الدرس: أكتب كود نظيف


الصفحة السابقة
في البرمجة كما هو الحال في أي مكان آخر ، هناك نوعان من الأشخاص: أولئك الذين يقومون بعملهم بسرعة ، لكنهم لا يهتمون بجودة التعليمات البرمجية الخاصة بهم وقابليتها للتطور ووٌضوحها ، وأولئك الذين يبذلون الجهد لرعاية عملهم ، لأنهم يدركون أن هذا العمل الإضافي الصغير سيكون مدخرًا كبيرًا للوقت في المستقبل.
عندما نبدأ ، نميل إلى القول "إنه يعمل ، مثالي ، لن ألمس أي شيء وسأتركه كما هو" . إنه رد فعل سيئ ، ولن أكون الوحيد الذي سيخبركم أن : أي مبرمج PHP ذو خبرة قليلة يعلم أن الكود الذي يعمل ليس جيدًا بالضرورة.
هذا الملحق هو في الواقع سلسلة من النصائح الصغيرة التي تبدو غير مهمة ، والتي أود منك أن توليها كل اهتمامك .
هذا ليس كثيرًا ، ومع ذلك فهو ما يجعل الفرق بين مبرمج "جيد" واه ... و مبرمج ليوم الأحد!

مسح الأسماء


لقد أكدت هذه النقطة مرارًا وتكرارًا في المرحلة الأولى من الدورة التدريبية ، وهذه المرة عدت مع الشرح أكثر قليلاً.
عند إنشاء برنامج نصي PHP ، يجب عليك اختراع الأسماء. سيكون عليك إعطاء أسماء لأنواع مختلفة من العناصر:
  • المتغيرات.
  • وظائف.
  • الأقسام.
الفكرة بسيطة: عليك بذل الجهد لاختيار أسماء المتغيرات والوظائف الواضحة والمفهومة.
على سبيل المثال ، فيما يلي بعض أسماء المتغيرات السيئة:
  • $temp  .
  • $data  .
  • $info  .
  • $val  .
  • $val2 .
لم أخترع هذه الأسماء المتغيرة ؛ في الواقع ، لنكون صادقين ، فهذه أسماء رأيتها حقًا في العديد من أكواد المصدر.
على سبيل المثال ،   $info  "معلومات" ، نعم ، ولكن معلومات عن ماذا؟
هذا هو المهم: معرفة ما يحتوي عليه المتغير. يحتوي المتغير دائمًا على معلومات ، والامر متروك لك لتحديد أي منها.
أنا لا أتكلم حتى المتغير " بدون إسم "  ، $tmp و مشتقاتها. هذه الأسماء يجب عدم استعمالها على الإطلاق.
ولكن ما فائدة البحث عن اسم متغير واضح؟ بعد كل شيء ، إنه الكود الخاص بي ، إنه لي ، وأنا أفهم جيدًا ما أقوم به!
خاطئ.
بالطبع أنت تعرف ماذا تفعل (لا يوجد أحد في عقلك). ومع ذلك ، يمكن أن تظهر المشكلة في حالتين.
  • إذا أعطيت كود PHP الخاص بك إلى صديق لمساعدتك ، أو لمتابعة التعليمات البرمجية الخاصة بك. حاول على سبيل المثال إظهار كود PHP الخاص بك على المنتديات على الإنترنت ، وسوف ترى أنه إذا استخدمت أسماء غير واضحة ، فسيكون لديك عدد أقل من الإجابات لأنه سيكون من الأصعب بكثير فهم تشغيل التعليمات البرمجية الخاصة بك!
  • هناك حالة أخرى (يتم الاستهانة بها) وهي الحالة التي يمكنك فيها إعادة لمس الكود في وقت لاحق. أنا لا أقول في اليوم التالي (الأفكار لا تزال جديدة) ، ولكن في ثلاثة أشهر ، أو حتى في ثلاثة أسابيع. صدق تجربتي: لقد تعين علي إعادة قراءة الكود المصدري الخاص بي بسؤال نفسي "  لكن ماذا أردت أن أفعل هناك؟  ".
قضاء ثانية واحدة فقط للتفكير في أسماء واضحة. لا تخف من اختيار الأسماء لفترة طويلة ، فهي ليست مضيعة للوقت ، بل على العكس .
يمكنك استخدام رمز الشرطة السفلية "_" لاستبدال المسافات ، التي يٌمنع إستعمالها في أسماء المتغيرات والوظائف.
فيما يلي بعض الأمثلة لأسماء المتغيرات الواضحة:
  • $ip_visitor  .
  • $pseudo_member  .
  • $date_news  .
  • $password  .
  • $forum_selectionne .
أخيرًا ، وعلى أمل إقناعك (لأن صدقوني ، إنه مهم جدًا) ، إليك نفس كود المصدر في نسختين:
  • الأول يحتوي على أسماء قصيرة وغير واضحة ؛ من الصعب أن نفهم بسرعة ما يفعله ؛
  • يحتوي الثاني على أسماء أطول إلى حد ما ، لكننا على الأقل نتعرف على الفور على ما هو الغرض من هذا المتغير أو الوظيفة.
هذان الكودان ينتجان نفس النتيجة بالضبط ؛ ببساطة ، واحد منهم أكثر قابلية للفهم من الآخر.
أسماء المتغيرات غير واضحة

<?php
$mess_page = 20;

$ret = $bdd->query('SELECT COUNT(*) AS nb FROM livre');

$data = $ret->fetch();
$total = $data['nb'];
 
$nb_total  = ceil($total / $mess_page);
 
echo 'Page : ';
for ($i = 1 ; $i <= $nb_total ; $i++)
{
    echo '' . $i . ' ';
}
 
?>
أسماء المتغيرات أكثر وضوحا بكثير

<?php
$numberOfMessagesPerPage = 20;
 
$retour = $bdd->query('SELECT COUNT(*) AS nb_messages FROM livre');
$data = $retour->fetch();
$totalOfMessages = $data['nb_messages'];
 
$numberOfPages  = ceil($totalOfMessages / $numberOfMessagesPerPage);
 
echo 'Page : ';
for ($current_page = 1 ; $current_page <= $numberOfPages ; $current_page++)
{
    echo '' . $current_page. ' ';
}
?>
إنه لأمر مجنون أن الأسماء المكتوبة بشكل صحيح باللغة الانجليزية تسمح برؤية أكثر وضوحًا.

المسافات البادئة للتعليمات البرمجية


واحدة من أول الأشياء التي تنبثق عند النظر في كود المصدر هي المسافة البادئة .
مبدأ المسافة البادئة هو استخدام علامات التبويب بذكاء "لتعويض" أجزاء من التعليمات البرمجية لإظهار البنية بشكل أكثر وضوحًا.
تستخدم جميع برامج تحرير النصوص تقريبًا في استخدام التعليمات البرمجية ذات المسافات البادئة ، لذا فهي تساعدك كثيرًا في توضيح التعليمات البرمجية الخاصة بك.
عندما أقول "أكثر" ، أنا لا أتحدث عن Bloc note . إذا قمت بكتابة كود PHP الخاص بك في Notepad ، فمن الأفضل تجربة برنامج حقيقي لذلك ، مثل Notepad ++ الذي أخبرتك به في أحد الفصول الأولى.
ليس فقط باستخدام محرر حقيقي لديك مسافة بادئة لكود شبه تلقائي ، ولكن بالإضافة إلى ذلك ، يتم تلوين رمزك تلقائيًا ، مما يساعد بشكل كبير ، ثق بي!
هناك عدة "أنماط" المسافة البادئة التعليمات البرمجية؛ انها تختلف قليلا وفقا لأذواق المطورين. الشيء الذي اقترحه سهل التذكر:
  • في كل مرة تفتح فيها دعامات {، على سبيل المثال واحدة if، واحدة ، while أو واحدة for ، يمكنك خلط جميع التعليمات البرمجية التي تتبع من علامة تبويب واحدة إلى اليمين ؛
  • في كل مرة تغلق فيها دعامة }، يمكنك خلط كل علامة تبويب واحدة التالية على اليسار.
كود بدون مسافات بادئة
إنه أكثر وضوحا مع مثال ، لذلك انظر لنفسك:

<?php
for ($ligne = 1 ; $ligne <= 100 ; $ligne++)
{
if ($ligne % 2 == 0)
{
echo $ligne . ' : <strong>ligne paire</strong>';
}
else
{
echo $ligne . ' : <?em>ligne impaire</em>
';
}
echo '<br />';
}
?>
كود مع مسافات بادئة
وهنا هو نفس المسافة البادئة بشكل صحيح إذا احترمنا قاعدة الجدولة:

<?php
for ($ligne = 1 ; $ligne <= 100 ; $ligne++)
{
    if ($ligne % 2 == 0)
    {
        echo $ligne . ' : <strong>ligne paire</strong>';
    }
    else
    {
        echo $ligne . ' : <em>ligne impaire</em>';
    }
    
    echo '<br />';
}
?>
ميزة مع كود المسافة البادئة هو أننا يمكن أن نرى "مستويات" من التعليمات. نحن نفصل الكتل جيدًا ، ونتعرف بسهولة أكبر. ؛-) إن
وجود كود ذات مسافة بادئة بشكل صحيح أمر ضروري تقريبًا عند بدء تشغيل البرامج النصية لعدة عشرات من الخطوط (التي تحدث بسرعة كبيرة!).
يميل بعض المطورين إلى استبدال علامات التبويب بمسافات اثنين أو أربعة ، لأن عرض علامة التبويب يمكن أن يختلف من برنامج إلى آخر ، بينما يتم إصلاح عرض المساحة. بشكل عام ، يقوم محرر النصوص نفسه بتحويل علامات التبويب الخاصة بنا إلى مسافات ، بشفافية.

كوديحتوي التعليقات بشكل صحيح


النقطة الأخيرة ، والتي ربما تكون الأكثر حساسية ، تتعلق بالتعليقات في الكود.
التعليقات عديمة الفائدة ، نظرًا لعدم قراءتها بواسطة PHP أثناء إنشاء الصفحة ... مثل أسماء المتغيرات و المسافة البادئة للكود ، ستقول لي.
في الواقع. لكن مرة أخرى ، التعليقات لك ، وفي النهاية للشخص الذي سيقرأ الكود. عليك وضع التعليقات في الكود لكن حاول ان لا تكثر منها!
ساوضح. إذا بعد سطر مثل هذا:

<?php
 echo $pseudo_visiteur; 
?>
... قمت بإضافة تعليق "  يعرض لقب الزائر  " ، هناك أقول لا ، لا ولا!
ليس من الضروري على الإطلاق التعليق واحدًا تلو الآخر على سطور التعليمات البرمجية الخاصة بك! إذا أصررت منذ فترة على اختيار أسماء المتغيرات والوظائف الواضحة ، فمن الأفضل أن تتجنب الحاجة إلى التعليق أكثر من اللازم.
أذكى وأذكى هو التعليق على "مجموعة من الخطوط" لشرح لفترة وجيزة ما يفعلونه عندما يكون غير واضح.
هذا هو المعنى العام لكودك الذي يجب أن تشرحه في التعليقات ، وليس دور كل سطر!
لمساعدتك ، هناك نوعان من التعليقات:
  • أولئك الذين يبدأون // : يسمحون بالتعليق على سطر واحد في وقت واحد ؛
  • أولئك الذين يبدأون بـ /*وينتهي */ بهم: يستخدمون للتعليقات الطويلة موزعة على عدة سطور.
فيما يلي توضيح صغير لرمز التعليق بشكل صحيح:

<?php
/*
Script "Questionnaire de satisfaction"
    
    
Dernière modification : 20 août XXXX
*/

// نتحقق أولاً من عدم وجود حقل فارغ
if ($_POST['description'] == NULL OR $_POST['mail'] == NULL)
{
    echo 'Tous les champs ne sont pas remplis !';
}
else // إذا كانت جيدة ، فنحن نحفظ المعلومات في قاعدة البيانات
{
    $bdd->prepare('INSERT INTO enquete VALUES (\'\', ?, ?)');
    $bdd->execute(array($_POST['description'], $_POST['mail']));    
    
    // ثم نرسل الصور    
    for ($numero = 1 ; $numero <= 3 ; $numero++)
    {
        if ($_FILES['photo' . $numero]['error'] == 0)
        {
            if ($_FILES['photo' . $numero]['size'] < 500000)
            {
                move_uploaded_file($_FILES['photo' . $numero]['tmp_name'], $numero . '.jpg');
            }
            else
            {
                echo 'La photo ' . $numero . 'n\'est pas valide.<br />';
                $probleme = true;
            }
        }
    }
    
    // أخيرًا ، اعرض رسالة تأكيد إذا سارت الأمور على ما يرام    
    if (!(isset($probleme)))
    {
        echo 'Merci ! Les informations ont été correctement enregistrées !';
    }
}
?>
كما ترون ، لم أعلق على جميع الخطوط. لقد علقت للتو على مجموعات من الخطوط لتوضيح وظيفتها ، مما يسمح للمؤلف (أنا أو آخر) بالعثور على الكود لاحقًا!

المعايير


كما ستفهم ، عند العمل كفريق واحد ، من المهم الحفاظ على بعض الاتساق في الطريقة التي تكتب بها الكود. سيكون هذا أكثر أهمية عندما تقوم بالتطوير باستخدام إطار عمل مثل Symfony  .
اجتمعت مجموعة من المطورين لوضع معايير لكتابة كود PHP . يسمى هذا consortium FIG ( Framework Interop Group) وتم إنشاؤه بشكل خاص لضمان احترام جميع أطر عمل PHP للقواعد المشتركة.
تسمى المعايير "PSR" ( PHP Standards Recommendations ) وهناك قائمة كاملة. يمكنك العثور عليها هنا: قائمة PSR .
أقترح عليك أن تقف عن اثنين منهم:
  • PSR1  ، القواعد الأساسية في اتصال مع معيار التشفير،
  • و  PSR-2  ، دليل أسلوب كتابة الكود.
    • تحتوي هذه المعايير على مجموعة كاملة من القواعد التي يجب اتباعها. أدعوك لقراءتها بعناية.
      لا يزال بإمكانك ارتكاب أخطاء ... هناك أداة مفيدة تعمل تلقائيًا على تصحيح التعليمات البرمجية وفقًا للقواعد المفروضة. أدعوك لاستخدام PHPCS-Fixer .
      إنها أداة تستخدم فقط في سطر الأوامر. ستجد  خطوات التثبيت هنا   . أنا أحثك ​​على استخدام هذه الأداة لضمان اتباع التعليمات البرمجية لقواعد كتابة الكود.