Политика обработки неудачного исполнения
-
Проверяйте каждое обращение к функции, не закончилась ли она
ошибкой, кроме конечно случаев, когда Вы уверены в том, что
желаете проигнорировать все ошибки.
-
Включайте системный текст сообщения об ошибке каждый раз, когда
уведомляете о ней пользователя. Вольная интерпретация может
внести двусмысленность
Политика
использования {}скобок
Из трех основных методов, применяемых в программировании только 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();
или
(условие)
? длинный оператор
: другой длинный оператор;