WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Хороший стиль кодинга (программирования) на 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();

   или

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



 :::::  Tankist пишет 28.01.2002 @ 17:05 
Все верно
 :::::  Felenka пишет 28.01.2002 @ 19:08 
не согласная я вот с этим:

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

Они могу пропусти тестовое значение
Они могут пропустить выражение увеличения/уменьшения

для иллюстрации приведен пример:

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

как по мне - так здесь просто непродуманная последовательность операторов! а инкремент цикла ($i) правильно всегда размещать ПОСЛЕ всех выполненных операций, тогда не будет никаких проблем.

кроме того, в continue и break есть еще и достоинства, а именно: разумное использование continue и break позволяет ...

* избежать избыточных уровней вложенностей скобок
* локализовать ошибку
* осуществляет дополнительный контроль за правильностью составленного алгоритма (если программа оказалась в том блоке, куда она не могла попасть никак при ПРАВИЛЬНО составленном алгоритме)

Кроме того, мне кажется, что стоило бы минимизировать использование бесконечных циклов, т.к. для меня бесконечные циклы (за исключением случаев, когда они действительно необходимы) зачастую свидетельствуют о нежелании продумать условия цикла.

 :::::  сергей пишет 30.01.2002 @ 08:12 
ошибки/описки заметные сразу

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

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

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

Они могу пропусти тестовое значение


 :::::  Mossy пишет 10.02.2002 @ 14:27 
Я не вижу проблем в использовании табуляции. Главное - все отступы делать только табами, то есть один таб, два таба... Зато любой юзер может выставить размер отоабражения таба на столько, на сколько ему нравиться и значительно ускоряется редактирование текста. Вообщем, по моему опыту, если не смешивать пробелы и табы то всё будет отлично.
 :::::  dk пишет 17.02.2002 @ 14:46 
В некоторых местах совершенно не согласен:
1. break и continue - тут уже высказались на этот счет. К goto, конечно же, они не имеют никакого отношения.
2. Насчет табуляций: http://dklab.ru/chicken/11.html Если ваш редактор крив и постоянно вставляет табуляцию там, где это не нужно, просто смените редактор. Но это не повод заявлять, что табуляторы - зло. См. также http://dklab.ru/chicken/15.html
3. ?: на разных строках свотрится слишком уродливо. Почему бы тогда не использовать if?..
4. Про конструкторы: ведь есть механизм исключений...

Теперь - положительное:
1. Про if (6==$x). Выглядит разумным, хотя и отталкивающим. Вполне возможно, что это действительно правильнее. Хотя большинство компиляторов выдают предупреждения, даже если написать if ($x==6)
2. Про пробел перед скобками в if (...). Тоже кажется оправданным - чтобы отличить от вызова функции. Хотя, интересно, какой же это программист спутает ключевое слово с функцией (особенно если оно отображается другим цветом в редакторе)...
3. Про стили скобок - согласен абсолютно. Мне больше нравится вариант 2 - в свое время насильно переучился на него с варианта 1.
 :::::  Leonid пишет 05.03.2002 @ 16:57 
а я просто пишу...
не табов тебе, ни отступов...
моё, конечно, мнение, но мне так удобнее.
 :::::  Кендер пишет 26.03.2002 @ 16:00 
Насчет системного текста сообщения об ошибке - в корне не согласен. Пользователь должен получить просто сообщение, что произошла ошибка БЕЗ любого уточнения что и, тем более, ГДЕ. Например, вариант "произошла ошибка в /usr/local/sbin/katze/inc/dbcon.inc в строке ... " крайне нежелателен! Вся информация должна класться в логи и высылаться админу - это да. Но пользователю ничего сообщать не надо.
 :::::  Кендер пишет 26.03.2002 @ 16:03 
Вообще же, можете почитать "21 ошибка программиста на PHP"
http://werad.narod.ru/articles/programm9.html
и
http://werad.narod.ru/articles/programm6.html

Там рассматриваются значительно более интересные проблемы.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0322571