كيفية الالتزام بمبدأ عدم تكرار نفسك (الجاف) عندما يكون هناك الكثير من الذاكرة إذا جعل الرمز غير قابل للقراءة؟

StackOverflow https://stackoverflow.com/questions/937225

سؤال

أرغب في الالتزام بمبدأ عدم التكرار بنفسك، لكن في بعض الأحيان عندما أكتب PHP مع HTML و CSS، إذا أعد استخدام نفس التعليمات البرمجية لحالات مختلفة، فستكون الكود الخاص بي قريبا الكثير إذن، آخر أن الرمز غير قابل للصيانة بسهولة.

قد تكون هذه مشكلة أكبر إذا تم استخدام Smarty، فإن محرك القالب يستخدم، لأن معظم محرر التعليمات البرمجية لن يتطابق مع {if} {} {/ if}، لذلك يحتاج المبرمون إلى البحث عن علامة مطابقة بصريا، وليس من السهل عندما يكون هناك 3 أو 4 مستويات من المتداخل {if} {unt} {/ if}.

في مثل هذا الوضع، هل هناك طريقة للتمسك بالتجف، ولكن لا يزال لديك شفرة صحي جيدة؟

هل كانت مفيدة؟

المحلول

اختصار إطار كامل، ما تميل إلى القيام به للمحتوى (حتى لو كان يحتوي على منطق) هو منفصلة بها في ملفات واستخدام تقييم منطقي آخر لدمجها معا (Mangle لهم) ثم تقييم المنطق القالب بعد ذلك. هذا يدلي المحتوى الخاص بك ويجعل قطع قابلة لإعادة الاستخدام / قابلة لإعادة الاستخدام على الدولة المشتركة.

وبهذه الطريقة، يكون كل مخزن مؤقت للقالب النهائي شجرة مسطحة من شذرات محتوى غير قابل للاستخدام المنفصلة يمكنك تخزينها على القرص أو قاعدة بيانات. حتى شيء بسيط مثل المحلل قليلا يستبدل:

<h1>{{insert:shared_page_header}}</h1>

مع shared_page_header.txt يساعد في الحفاظ على تفصيل الأشياء. كما يفرض عليك النظر في الفصل عن المخاوف حتى في المنطق المضمن في القوالب الخاصة بك. قطع قابلة للإدارة، قابلة لإعادة الاستخدام من أي شيء (ديناميكي أم لا) هي دائما الطريق للذهاب. القوالب الخاصة بك هي مجرد سلاسل حتى يتم تقييمها، لذلك تعاملها مكونات مشتركة دمجها في سلسلة قذرة كبيرة (TM) ثم تقييمها.

حظ سعيد

نصائح أخرى

فقط لذلك لدينا معلومات أكثر ... ما البرنامج الذي تستخدمه لكتابة الكود الخاص بك؟

نصائح لعدم تكرار نفسك:

استخدام نوع من القوالب. القيام بذلك يبقيك من الاضطرار إلى تكرار التعليمات البرمجية لعرض المحتوى في كل صفحاتك. أي إذا كان لديك موقع مع 20 صفحة وكنت تقرر تغيير تخطيطك، فأنت لا تريد أن تضطر إلى المرور ثم قم بتغيير جميع الصفحات 20 الخاصة بك.

استخدام الوظائف. إذا كان لديك رمز يقوم بمهمة محددة، فلا تكتب هذا الرمز عدة مرات في جميع أنحاء البرنامج / صفحةك. قم بإنشاء وظيفة ثم اتصل به في كل مكان حيث تحتاج إلى هذه المهمة المنجزة. وبهذه الطريقة إذا كنت بحاجة إلى إجراء تغيير، يمكنك فقط تعديل هذه الوظيفة ولا تضطر إلى البحث من خلال التعليمات البرمجية للعثور على كل مكان قمت بإجراء هذه المهمة. إذا كنت تعرف عن الفئات والأساليب (الطريقة هي وظيفة في الفصل)، للعديد من المهام، فهذا أفضل لأنه يوفر لك تغليف البيانات ويسمح لك بتجميع الوظائف ذات الصلة معا حتى تتمكن من تضمين الفئة في المستقبل المشاريع حسب الحاجة.

إذا كنت تواجه صعوبة في الحصول على الكثير من البيانات وإمكانية عدم وجودها قابلة للقراءة للغاية، فهناك بعض الأشياء التي يمكنك القيام بها:

1. النظر في محاولة محرر جديد. رمز قابلة للطي أمر لا بد منه. يحتوي بعض المحررين أيضا على خطوط عمودي تسليط الضوء ومطابقة رمز المسافة البادئة حتى تعرف ما الذي يحدث مع ما. إذا كنت تريد محرر مجاني لائق، فسوف أوصي Notepad ++ لأنها تحتوي على كل من هذه الميزات (فقط Google، لا يمكنني إضافة روابط هنا).

2. هناك تقنيات يمكنك استخدامها لتقليل عدد المتداخل إذا كانت البيانات التي لديك ...

مثال (هذا الرمز):

if (item1 == true) {
   if (item2 == true) {
      item3 = 5;
   }
   else {
      item3 = 10;
   }
}
else {
   if (item2 == true) {
      item3 = 15;
   }
   else {
      item3 = 20;
   }
}

يمكن أيضا بالارض في:

if (item1 == true && item2 == true) {
   item3 = 5;
}
else if (item1 == true && item2 == false) {
   item3 = 10;
}
else if (item1 == false && item2 == true) {
   item3 = 15;
}
else {
   item3 = 20;
}

لذلك إذا كان لديك 3 أو 4 مستويات من المتداخل إذا / elses وتريد أن تتسطح بها، فقد تجد الشفرة أكثر قابلية للقراءة لاستخدام حجج متعددة مثل أعلاه. يفعل الشيء نفسه، إنها مجرد تفضيل لها بأي طريقة تفعلها.

حاول ولا مزج منطقك (أنا أفترض PHP) وعرضك (أنا أفترض HTML / CSS). هذا ليس من السهل دائما القيام به دائما، ولكن باستخدام قوالب و CSS، فمن الممكن. اسمحوا لي أن أقدم لك مثالا عمليا على كيفية القيام بذلك في صفحة منزلية تعرض اسم مستخدمين كرسالة ترحيب.

Inline PHP (حاول تجنب):

<html>
   <body>
      <?php
      if ($logged_in == true) {
         echo "Welcome ",$user->name(),"!";
      }
      else {
         echo "Welcome Guest!";
      }
      ?>
   </body>
</html>

المنطق منفصلة عن العرض (أفضل):

<?php
if ($logged_in == true) {
   $greetingMessage = "Welcome ",$user->name(),"!";
}
else {
   $greetingMessage = "Welcome Guest!";
}
?>

<html>
   <body>
      <?php echo $greetingMessage; ?>
   </body>
</html>

^ الحفاظ على المنطق الخاص بك منفصلة من وجهة نظرك (HTML) سوف تساعدك على عدم الاحتمال عندما يبدأ مشروعك في التعقيد حقا. من الأفضل عدم خلطها! :)

حظا سعيدا يا رجل!

الجملة الأولى لسؤالك هي المشكلة، المنظمة البحرية الدولية. يجب أن لا تكون حقا خلط التعليمات البرمجية مع عرضك (أي HTML و CSS). هناك العديد من أطر PHP MVC التي ستساعدك على عدم القيام بذلك. إطار Zend لائق للغاية ولكن هناك آخرون أيضا.

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

الآن قد لا أكون على دراية بتنفيذ مفاهيم OOP باستخدام PHP، ولكن إعادة صياغة تلك البيانات المتداخلة إذا كانت البيانات ووضعها في وظيفة مسماة جيدا تساعد كثيرا في مواكبة المبدأ الجاف. وإلى جانب ذلك، فإن التمسك بالمبدأ الجاف جعل الرمز القابل للصيانة.

مع وجود ملف نصي مثال، سيكون الأمر أسهل بكثير بالنسبة لنا للإشارة إلى المكان الذي تسير فيه، إلا أن بعض الأشياء التي قد تساعدك أو لا تساعدك على اعتمادك على ما تحاول تحقيقه:

  • إلقاء نظرة على بناء جملة بديل للهياكل السيطرة. وبعد يفضل بعض الأشخاص استخدام هذا النمط عند كتابة الملفات التي تحتوي أساسا على HTML، مع استخدام PHP فقط لتحديد أقسام HTML للإخراج.

  • قم بتقسيم الأقسام القابلة لإعادة الاستخدام من التعليمات البرمجية إلى الملفات التي يمكنك تضمينها لاحقا، أي. header.php، footer.php الخ

  • باستخدام IDE الذي يدعم التعليمات البرمجية

حظ سعيد

إذا كانت العبارات تعتبر بيانات المنطق، فيجب تجنبها في وجهات النظر قدر الإمكان لأنها تنتهك مبادئ MVC.

قم بالتبديل لعرض المساعدين بدلا من ذلك، على سبيل المثال:

class LoggedUsernameHelper
{
    protected $user;

    public function __construct(SomeUserObject $user)
    {
        $this->user=$user;
    }

    public function __toString()
    {
        return $user->isLogged() ? sprintf('Welcome %s', $user->getUsername()) :
            'Welcome guest';
    }
}

هذا الرمز قابل لإعادة الاستخدام، يمكن اختباره، وسوف تبقي رمزك الجاف :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top