как придерживаться принципа «не повторяйся» («СУХОЙ»), когда будет слишком много «если еще то», что сделает код нечитаемым? - PullRequest
1 голос
/ 02 июня 2009

Я бы хотел придерживаться принципа «Не повторяй себя», но иногда, когда я пишу PHP вместе с HTML и CSS, если я повторно использую один и тот же код для разных ситуаций, мой код скоро будет иметь многие, если-то-еще, что код не легко поддерживать.

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

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

Ответы [ 6 ]

5 голосов
/ 02 июня 2009

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

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

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

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

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

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

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

Удачи, мужик!

3 голосов
/ 02 июня 2009

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

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

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

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

Удачи

0 голосов
/ 11 февраля 2013

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

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

0 голосов
/ 02 июня 2009

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

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

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

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

Удачи

0 голосов
/ 02 июня 2009

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

0 голосов
/ 02 июня 2009

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

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

...