Хороший стиль кодинга (программирования) на php. Часть 3


Прислал: Алексей Волков [ 28.01.2002 @ 13:59 ]
Раздел:: [ Статьи по PHP ]


Политика обработки неудачного исполнения

  • Проверяйте каждое обращение к функции, не закончилась ли она ошибкой, кроме конечно случаев, когда Вы уверены в том, что желаете проигнорировать все ошибки.
  • Включайте системный текст сообщения об ошибке каждый раз, когда уведомляете о ней пользователя. Вольная интерпретация может внести двусмысленность

Политика использования {}скобок

Из трех основных методов, применяемых в программировании только 2 из них вполне приемлемы.

Размещение под ключевым словом и на одном уровне с ним:

    if ($condition)       while ($condition)
    {                     {
       ...                   ...
    }                     }

Традиционная для UNIX практика размещения открывающей скобки на той же самой строке, где и ключевое слово и  использование закрывающей скобки с тем же отступом, что и ключевое слово

    if ($condition) {     while ($condition) {
       ...                   ...
    }                     }

Мотивация

  • Обе формы одинаково приемлемы, однако большинство людей, почему-то, предпочитают первый вариант. Почему? Это тема уже для психологических измышлений.
  • Есть некоторое количество оснований почему люди предпочитают первый вариант. Если Вы используете редактор типа vi который поддерживает соответствие скобок, первый вариант намного более удобный. Почему? Скажем, у Вас есть большой блок кодекса и Вы хотите знать, где блок заканчивается. Вы двигаетесь в первую скобку, нажимаете горячую клавишу, и редактор находит соответствующую скобу. Пример:
     if ($very_long_condition && $second_very_long_condition)
     {
        ...
     }
     else if (...)
     {
  ...
     }

Чтобы передвинуться от блока к блоку Вам просто нужно просто передвинуть курсор вниз. Нет необходимости передвигаться в конец линии, чтобы проверить где начинается скобка и потом переходить опять в начало.

Отступы, проблемы и табуляция

  • Используйте отступ в 3 или 4 пробела для каждого уровня..
  • Не используйте табуляцию, используйте пробелы. Большинство редакторов может заменять табуляцию на пробелы..
  • Делайте отступов настолько много, насколько нужно, не переборщите. Тут нет жестких правил, насчет максимального уровня глубины отсупов. Однако, если у Вас более 4 или 5 уровней, то может быть имеет смысл подумать о том, чтобы написать алгоритм иначе.

Мотивация

  • Когда пользователи используют различные значения для табуляции, то может получится так, что читать текст будет просто не возможно. Поэтому пробелы более универсальны, чем табуляция.
  • Никто не будет устраивать спор насчет количества пробелов в отступе, но в большинстве случаев 3 или 4 весьма удобны.
  • Мы не ограниваем глубину вложений, но поверьте – более 5 уровне будет смотреться совершенно не читабельно..

Пример

   function func()
   {
      if (something bad)
      {
         if (another thing bad)
         {
            while (more input)
            {
            }
         }
      }
   }

Круглые скобки ()сключевыми словами и названиями функций

  • Не размещайте скобки сразу за ключевым словом. Отделяйте пробелом.
  • Размещайте скобки сразу после названия функции.
  • Не используйте скобок в return функциях без наличия на то необходимости.

Мотивация

  • Ключевые слова не функции. Используя это правило, Вы легко разделите функции и ключевые слова.

Пример

    if (condition)
    {
    }

    while (condition)
    {
    }

    strcmp($s, $s1);

    return 1;

Не производите реальной работы в конструкторе объектов.

Не производите реальных действий в конструкторе объектов. Внутри конструктора только  инициализируются переменные и выполняются действия, которые не могут привести к ошибке.

Создайте Open() метод для объекта будет завершать конструктор.Open() должен вызываться после того как объект будет инициализирован..

Мотивация

  • Конструктор не может вернуть ошибку.

Пример

   class Device
   {
      function Device()    { /* инициализация и другие функции */ }
      function Open()  { return FAIL; }
   };

   $dev = new Device;
   if (FAIL == $dev->Open()) exit(1);

Позвольте функция запускаться повторно

Функции не должны содержать в себе статических переменных, которые будут запрещать функции повторный запуск.

ФорматированиеIf иElse

Расположение

Различные стили использования скобок выглядят немного по разному. Общий вид примерно такой::

   if (условие)                 // Комментарий
   {
   }
   else if (условие)             // Комментарий
   {
   }
   else                           // Комментарий
   {
   }

Если Вы используете else if оператор, то часто хорошой идеей является всегда использовать выделение кавычками блока. Комментарии обязательно Вам пригодятся.

Формат условий

Всегда размещайте константу слева от знака равенства/неравенства. Например:

if ( 6 == $errorNum ) ...

Одной из причин является то, что если Вы оставите только один знак = (а это очень распространенная ошибка), парсер остановится с сообщением об ошибке. Второй причиной является то, что значение находится в левой части и его найти будет там проще, чем в конце длинного выражения. Требуется совсем немного времени для того, чтобы привыкнуть писать именно так, но в будущем Вы неоднократно убедитесь, как это экономит время.  

Использование switch

  • Пропускаемые значения должны быть включены в список и снабжены комментариями.
  • Ветка default всегда должна присутствовать и отображать ошибку, если ее работа не предполагалась по алгоритму, но все же до нее дошла очередь.
  • Если Вы создаете переменные, располагайте их внутри блока

Пример

   switch (...)
   {
      case 1:
         ...
      // пропускаем

      case 2:
      {
         $v = get_week_number();
         ...
      }
      break;

      default:
   }

Использование continue,break и ?:

Continue и Break

Continue и break подобны замаскированному оператору goto, от которого все по чуть-чуть отказались.

Continue и break подобны goto и должны использоваться минимально, так как могут привести к неожиданным последствиям.

2 основные проблемы с continue:

  • Они могу пропусти тестовое значение
  • Они могут пропустить выражение увеличения/уменьшения
Рассмотрим следующий пример, где рассматриваются обе проблемы :

while (TRUE)
{
   ...
   // A lot of code
   ...
   if (/* условие */) {
      continue;
   }
   ...
   // A lot of code
   ...
   if ( $i++ > STOP_VALUE) break;
}

Из примера выше само по себе появляется правило: смешивая continue и break в одном цикле практически гарантировано приводит к путанице

?:

Основная проблема заключается в том, что люди обычно стараются разместить между ? и :слишком много кода.   Вот несколько простых правил, которых следует придерживаться:

  • Размещайте условие в скобках, чтобы отделить от другого кода
  • Если возможно, действия для проверки должны быть простыми.
  • Размещайте тогда и иначе операторы на разных строках в случае если нет возможности разместить их так, чтобы они вошли на 1 строку.

Пример

   (условие) ? funct1() : func2();

   или

   (условие)
      ? длинный оператор
      : другой длинный оператор;