Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Урок №17
Форумы портала PHP.SU » PHP » Уроки php » Урок №17

Страниц (1): [1]
 

1. Champion - 07 Марта, 2009 - 17:51:15 - перейти к сообщению
Красивый скрипт или стили программирования.

Эта глава тоже здесь написана не просто так. Скрипт должен быть красивым. И нужно это, как ни странно, не для красоты.
Дело в том, что очень мало программ пишутся раз и на всегда, и чтобы сразу работала как надо. Скрипт, написанный красиво, вам самим гораздо проще отлаживать, модифицировать. Кроме того, по различным причинам работать с вашим творением может быть прийдется другому человеку. В красивом, правильно написанном коде разобраться гораздо проще.
Давайте разбираться, как должен выглядеть красивый код. Вначале глянем на коды с недочетами, потом их разберем.
PHP:
скопировать код в буфер обмена
  1. №1
  2. <?PHP for($i=0;$i<5;$i++){if($i%2)echo $i;echo 'O<hr>';} ?>

PHP:
скопировать код в буфер обмена
  1. №2
  2. <?PHP
  3.         for(
  4.                         $i
  5.         =
  6.                         0               ;       $i
  7.         <5      ;                                       $i++)
  8.                                 {      
  9.                         if
  10.                                         ($i
  11.                                                         %
  12.         2)echo
  13.  $i;
  14.                         echo 'О<hr>'
  15.         ;}                                               ?>


PHP:
скопировать код в буфер обмена
  1. №4
  2. <?PHP
  3. for ($i = 0; $i < 5; $i++) {
  4.         if ($i % 2)
  5.                 echo $i;
  6.                 echo '<hr>'; }
  7. ?>


Все приведенные скрипты написаны синтаксически верно, это рабочие скрипты.

Вот, рассмотрим код №1. Тут всё написано строчку. Ну-ка быстренько: в каких случаях код выводит большую букву О? Не удобно искать, да? А если бы код был на много листов?

В чем недостатки кода №2, объяснять даже не надо. Попробуйте ответить на тот же вопрос, что и в предыдущем случае.

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

В коде №4 из-за табуляции кажется, что тег '<hr>' выводится только при выполнении условия, однако если глянуть на фигурные скобки, мы увидим, что это не так.

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

Основные правила.

Итак, что видно из первого и второго примера, думаю рассказывать не надо.

Третий пример говорит нам о том, что расстановка пробелов должна быть постоянной. Не должно быть такого, что тут 2 пробела, тут 4, тут вообще ни одного. Еще тут стоит сказать, что в длинных выражениях
CODE (text):
скопировать код в буфер обмена
  1. $b = $a + $c +$z + $f * $r + $e * $f + $a + $o
операцию умножения, всё же стоит взять в скобки, хоть она и первой все равно выполняется. Это упростит читаемость кода.
И еще о пробелах: Всегда отделяйте с двух стронон пробелами запятые и другие операторы.
CODE (text):
скопировать код в буфер обмена
  1. $b=$a+$c+$z+$f*$r+$e*$f+$a+$o
Приятно читать такую кашу?

Из 4го примера мы видим роль отступов. Отступы должны показывать нам вложенность структур программы. Это значит, что все операторы, вложенные ,например, в цикл, должны начинаться на какое-то одинаковое расстояние от левого края дальше, чем сам оператор цикла. То же и с условиями. Операторы одного уровня вложенности должны на ходиться на одном расстоянии от левого края.

Расстановка фигурных скобок.

Существует множество стилей:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if ($a > $b) {
  3.         // операторы
  4. }
  5. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if ($a > $b)
  3. {
  4.         // операторы
  5. }
  6. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if ($a > $b)
  3.         {
  4.         // операторы
  5.         }
  6. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if ($a > $b)
  3.         {
  4.                 // операторы
  5.         }
  6.  ?>

Я пользуюсь первым способом в блоках if, for и т. д. и вторым при описании функций. Первый способ мне нравится тем, что закрывающая скобка находится на одной вертикали с тем, что она открывает (в данном случае с оператором if), а первая скобка не создает лишнего (мне так кажется, что лишнего) отступа после if.
Для функций я использую второй способ, потому что... да даже не знаю почему; нравится мне так.
Другие способы мне не нравятся из-за большого количества табуляции.
В любом случае, закрывающая фигурная скобка должна располагаться одна на строке и должно сразу быть видно, что она закрывает.

Имена переменных, функций и классов.

Имена должны гдворить программисту о нозначении переменной, функции или пр.. Что вы можете сказать, увидев в середине кода $a = 'Table' ? Ничего по существу. А вот $product = 'Table' нам уже подсказывает о чем речь. То же и с функциями: $r = g($a, $b) и $sum = add($serv_1, $serv_2). Видна разница? Но не нужно давать функциям (точнее, ни чему не надо) имена типа add_first_service_and_one_more_s ervice_returning_their_summ_as_i nteger_value. Почему - объяснить?

Комментарии.
Что надо комментировать.


Комментировать нужно:
* Необычные решения. Потому, что потом не вспомните, что вы тут имели в виду. А другой человек - тем более, это не поймет.
* Решения, над которыми пришлось подумать. На случай, если захотите что-то перелопатить. Возможно, вы уже пытались, и поняли почему надо сделать именно так. Это стоит написать в комментарии.
* Назначение длинных блоков.
* Длинные логические условия. На человеческом языке. Не "если а больше б и a меньше е". Это и так видно из кода.
* То, что на самом деле нуждается в комментарии. Не нажо комментаровать это:
CODE (text):
скопировать код в буфер обмена
  1. ibase_connect($host, $user, $passwd); // соединяемся с базой данных на Интербейз



Какие должны быть комментарии.


Сравните:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $a = 1; // Присваиваем переменной А единицу
  3. $b = 6; // Присваиваем Б значение 6
  4. // Цикл по $i от 1 до 6
  5. for ($i = 1; $i <= $b; $i++ )
  6.         $ a = $a * $i; // Умножаем А на $i
  7. ?>

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Находим факториал числа $b
  3. $a = 1;
  4. $b = 6;
  5. for ($i = 1; $i <= $b; $i++ )  
  6.         $a = $a * $i;
  7. ?>

Разница есть? Куча комментариев в первом коде абсолютно ничего нам не сказала, а три с половиной слова в втором случае, дали нам полностью понять что тут для чего. Комментировать прежде всего надо не то, что мы делаем, а зачем.
Кстати, вот еще:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function factorial($b)
  3. $res = 1;
  4. for ($i = 1; $i <= $b; $i++ )
  5.         $res = $res * $i;
  6. ?>
Здесь всё и без комментариев ясно. Это о том, как надо называть функции и переменные.


Где располагаются комментарии.


Обычно комментарий одной команды располагается после точки с запятой, а комментарий блока располагается в строке над первой его командой. Больше тут нечего написать, по-моему.

И еще о комментариях.
Не надо лениться комментировать. Многие программисты не любят комментировать свой код, но дико возмущаются, когда им приходится работать с чужим некомментированным кодом.


О вложенности.


Здесь скажу только то, что ситуации типа
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function any_func()
  3. {
  4.         if ( условие ) {
  5.                 // вся функция
  6.         }
  7. }
  8. ?>

Их лучше описывать вот так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function any_func()
  3. {
  4.         if ( ! условие ) {
  5.                 exit;
  6.         }
  7.         // вся функция
  8. }
  9. ?>



GOTO


Этот оператор присутствует во многих языках программирования, и в PHP 5.3.0 он тоже появился. Но называется он там Jump.
Использовать его можно, но только тогда, когда это необходимо; когда это облегчает чтение и реализацию кода; когда чтобы избежать GOTO приходится вводить множество дополнительных проверок и переменных. Однако, возникновение такой ситуации, может свидетельствовать и об ошибке проектирования. Но если уж надо, то ладно. Только не стоит злоупотреблять.
Для выходов из цикла, кстати, в PHP есть break, для повторения - continue. У оператора break можно указать число из скольких уровней вложенности нужно произвести выход. Так, что избегать его возможности есть.
2. EuGen - 10 Марта, 2009 - 11:05:34 - перейти к сообщению
Многое здесь уже перечислено до меня, однако кое какие правила я все-таки хочу добавить.
- Хороший код комментирует себя сам
- Никогда не используйте goto, строго никогда. Нет и не придумают таких конструкций, в которых бы нельзя было без него обойтись.
- Если у Вас в коде один участок встречается более 1 раза, стоит подумать о том, чтобы сделать его функцией. Это, правда, стоит относить к логически законченному фрагменту, то есть к такому участку, который можно объединить в логическую форму.
- Хорошо написанный скрипт сэкономит время программиста - одного пишушего и десяти читающих.
- Я рекомендую писать комментарии только на английском языке, чтобы в любой кодировке они были прочитаны как надо. Я рекомендую писать не транслитом, а на литературном английском.
- Не стоит тратить время на придумывание супер-хитрых алгоритмов, которые сэкономят 0,1 секунды при бенчмарке 10000. Время программиста стоит куда дороже времени этих бездушных железок. И, к тому же, процессорное время дешевеет, а время программистов - дорожает. Это правило стоит применять, если приросты в производительности явно малы по сравнению с затратами по разработке.
- При именовании функций и переменных придерживайтесь определенного - но - одинакового стиля. Не стоит писать, скажем
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $user_password="";
  4. $userPassword="";
  5. ?>
  6.  

- Вы наверняка забудете, как в каком случаю называли эту переменную. Придерживайтесь одного стиля и Вам не придется тратить время на поиск того, как же именно Вы именовали эту самую переменную.
- Для облегчения чтения в PHP я рекомендую указывать приставку типа данных впереди имени переменных (так называемая "венгерская нотация"). Связано это с тем, что в PHP нет явного определения типа, и такое именование помогает сразу понять, к какому типу все-таки относится переменная:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $sUsername="user123";
  4. $iUserage=20;
  5. $bUserdeleted=false;
  6. ?>
  7.  

- Пишите скрипт так, как будто завтра Вам придется его дорабатывать. Старайтесь продумывать его так, чтобы его было легко масштабировать.

 

Powered by ExBB FM 1.0 RC1