как придерживаться принципа «Не повторяй себя» (DRY), когда будет слишком много «если-то-еще», что сделает код нечитаемым?

Я хотел бы придерживаться принципа Don't-Repeat-Yourself, но иногда, когда я пишу PHP вместе с HTML и CSS, если я повторно использую один и тот же код для разных ситуаций, в моем коде скоро будет очень много if- затем-иначе, что код нелегко поддерживать.

Это может быть более серьезной проблемой, если используется Smarty, шаблонизатор, потому что большинство редакторов кода не будут соответствовать {if} {else} {/ if} Таким образом, программисту нужно искать соответствующий тег визуально, а это непросто когда есть 3 или 4 уровня вложенности {if} {else} {/ if}.

В такой ситуации есть ли способ придерживаться DRY, но при этом иметь хороший поддерживаемый код?


person nonopolarity    schedule 01.06.2009    source источник
comment
Ваша проблема с шаблонами управления кодом, встроенной в шаблоны логикой или их спагеттификацией? ›   -  person Aiden Bell    schedule 02.06.2009
comment
@Aiden - это в основном логика, встроенная в шаблоны   -  person nonopolarity    schedule 02.06.2009
comment
@Jian Lin .. это имеет больше смысла. Приятно видеть, что вы не искажаете строки шаблона / HTML в операторы PHP: P   -  person Aiden Bell    schedule 02.06.2009
comment
Образец кода? Я не уверен, что понимаю ..   -  person 0scar    schedule 02.06.2009
comment
@Oscar - Скрипты в скриптах. Запутывается: P DRY in DRY   -  person Aiden Bell    schedule 02.06.2009
comment
Приведите пример того, что содержится в вашем if / else, если вам нужен конкретный ответ. Если задать неопределенный вопрос о модном слове, получится огромное количество ответов. Большинство из них, вероятно, не ответят на ваш вопрос.   -  person Mike B    schedule 02.06.2009


Ответы (6)


Если не считать полной структуры, то, что я обычно делаю для контента (даже если он содержит логику), это разделяю на файлы и использую другую логическую оценку, чтобы объединить их вместе (искажать их), а затем оценивать шаблонная логика после этого. Это разбивает ваш контент на части и делает их доступными для совместного использования / многократного использования в общем состоянии.

Таким образом, каждый окончательный буфер шаблона представляет собой сплющенное дерево дискретных слепков многократно используемого контента, которые вы можете хранить на диске или в базе данных. Даже такая простая вещь, как небольшой парсер, заменяющий:

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

С shared_page_header.txt помогает разделить вещи. Это также заставляет вас смотреть на разделение проблем даже в логике, встроенной в ваши шаблоны. Управляемые, многоразовые фрагменты чего угодно (динамического или нет) всегда подходят. Ваши шаблоны - это просто строки до тех пор, пока они не будут оценены, поэтому рассматривайте их как общие компоненты, объединенные в большую грязную строку (TM), а затем оцениваемые.

Удачи

person Aiden Bell    schedule 01.06.2009
comment
Мне нравится идея настройки стилей дерева для кеширования. - person Ballsacian1; 02.06.2009
comment
@ Ballsacian1 - у меня есть файл Python, содержащий около 200 строк, который я использую для выравнивания дерева строк и кеширования статических поддеревьев. Всегда под рукой! - person Aiden Bell; 02.06.2009

Просто чтобы у нас было больше информации ... Какую программу вы используете для написания кода?

Советы, как не повторяться:

Используйте какие-то шаблоны. Это избавит вас от необходимости повторять код для отображения контента на каждой из ваших страниц. I.E. Если у вас есть сайт с 20 страницами, и вы решили изменить свой макет, вам не нужно проходить, а затем менять все 20 своих страниц.

Используйте функции. Если у вас есть код, который выполняет определенную задачу, НЕ пишите этот код несколько раз в своей программе / странице. Создайте функцию, а затем вызывайте ее в каждом месте, где вам нужно выполнить эту задачу. Таким образом, если вам нужно внести изменения, вы просто изменяете эту одну функцию и вам не нужно искать в коде все места, где вы выполняли эту задачу. Если вы знаете о классах и методах (метод - это функция в классе), для многих задач это даже лучше, поскольку оно обеспечивает инкапсуляцию данных и позволяет группировать связанные функции вместе, чтобы вы могли включать класс в будущем. проекты по мере необходимости.

Если у вас возникли проблемы с большим количеством операторов if / else и кода, который не очень читается, вы можете сделать несколько вещей:

1. Попробуйте новый редактор. Сворачивание кода - необходимость. В некоторых редакторах также есть вертикальные линии, которые выделяют и совпадают с отступом кода, чтобы вы знали, что с чем сочетается. Если вам нужен достойный бесплатный редактор, я бы порекомендовал Notepad ++, поскольку он имеет обе эти функции (просто погуглите, я не могу добавлять сюда ссылки).

2. Есть методы, которые можно использовать, чтобы уменьшить количество вложенных операторов if, которые у вас есть ...

Пример (этот код):

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 уровня вложенных if / elses и вы хотите их сгладить, вы можете найти свой код более читабельным, чтобы использовать несколько аргументов, таких как выше. Он делает то же самое, это просто вопрос ваших предпочтений.

Старайтесь не смешивать вашу логику (я предполагаю PHP) и ваш дисплей (я предполагаю HTML / CSS). Это не всегда легко сделать, но с помощью шаблонов и CSS это возможно . Позвольте мне привести практический пример того, как вы можете сделать это на домашней странице, которая отображает имя пользователя в качестве приветственного сообщения.

Встроенный 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) поможет вам не перегружаться, когда ваш проект станет действительно сложным. Лучше просто не смешивать! :)

Удачи чувак!

person Joe Bubna    schedule 02.06.2009

Первое предложение вашего вопроса - проблема, ИМО. Вам действительно не следует смешивать код с вашим представлением (например, HTML и CSS). Есть несколько фреймворков PHP MVC, которые помогут вам этого не делать. Фреймворк Zend довольно приличный, но есть и другие.

Если вы не хотите использовать фреймворк, я бы посоветовал провести рефакторинг ваших страниц, чтобы не использовать подобный код и не вызывать объекты в серверной части. Смешивание кода и представления быстро становится невозможным ни на любом языке, а не только на PHP.

person Alex Beardsley    schedule 01.06.2009
comment
даже если HTML и CSS разделены на шаблоны, ситуация все равно остается: слишком много вложенных if-then-else. а Smarty if-then-else еще труднее читать и сравнивать. - person nonopolarity; 02.06.2009

Возможно, я не настолько знаком с реализацией концепций ООП с использованием PHP, но рефакторинг этих вложенных операторов if-else и их размещение в хорошо названной функции очень помогает в соблюдении принципа DRY. Кроме того, соблюдение принципа DRY делает ваш код легко сопровождаемым.

person Julson Lim    schedule 01.06.2009

С примером файла сценария нам было бы намного проще указать, где вы ошибаетесь, однако некоторые вещи, которые могут или не могут помочь вам, в зависимости от того, чего вы пытаетесь достичь:

  • Ознакомьтесь с альтернативным синтаксисом для структур управления. Некоторые люди предпочитают использовать этот стиль при написании файлов, которые в основном содержат HTML, при этом PHP используется только для решения, какие разделы HTML выводить.

  • Разделите повторно используемые части кода на файлы, которые вы можете позже включить, т. Е. header.php, footer.php и т. д.

  • Использование IDE, поддерживающего сворачивание кода

Удачи

person Gerry    schedule 02.06.2009

Если операторы считаются логическими операторами, их следует по возможности избегать в представлениях, поскольку они нарушают принципы 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';
    }
}

Этот код можно использовать повторно, тестировать, он сохранит ваш код сухим :)

person emix    schedule 10.02.2013