Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Уроки PHP (по материалам форума PHP.SU)
 
 

Урок № 13 - Красивый скрипт или стили программирования.

Авторы (участники forum.php.su): Champion, EuGen
Источник: forum.php.su
Обсуждение: Обсуждение уроков.


Красивый скрипт или стили программирования.

Эта глава тоже здесь написана не просто так. Скрипт должен быть красивым. И нужно это, как ни странно, не для красоты.
Дело в том, что очень мало программ пишутся раз и на всегда, и чтобы сразу работала как надо. Скрипт, написанный красиво, вам самим гораздо проще отлаживать, модифицировать. Кроме того, по различным причинам работать с вашим творением может быть придется другому человеку. В красивом, правильно написанном коде разобраться гораздо проще.
Давайте разбираться, как должен выглядеть красивый код. Вначале глянем на коды с недочетами, потом их разберем.


№1
<?PHP  for($i=0;$i<5;$i++){if($i%2)echo $i;echo 'O<hr>';} ?>

№2
<?PHP  
    
for(
            
$i
    
=
            
0        ;    $i
    
<5    ;                    $i++)
                {    
            if
                    (
$i
                            
%
    
2)echo
 
$i;
            echo 
'О<hr>'
    
;}                         ?>

№3
<?PHP  $a $b+$c *  $d ?>

№4
<?PHP  
for ($i 0$i 5$i++) {
    if (
$i 2)
        echo 
$i;
        echo 
'<hr>'; }
?>

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

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

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

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

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

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


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


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

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

CODE:

$b = $a + $c +$z + $f * $r + $e * $f + $a + $o

Операцию умножения, всё же стоит взять в скобки, хоть она и первой все равно выполняется. Это упростит читаемость кода.
И еще о пробелах: Всегда отделяйте с двух сторон пробелами запятые и другие операторы.

CODE:

$b=$a+$c+$z+$f*$r+$e*$f+$a+$o

Приятно читать такую кашу?

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


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


Существует множество стилей:

<?PHP
if ($a $b) {
    
// операторы

?>

<?PHP
if ($a $b)
{
    
// операторы

?>

<?PHP
if ($a $b)
    {
    
// операторы
    

?>

<?PHP
if ($a $b
    {
        
// операторы
    
}
 
?>

Я пользуюсь первым способом в блоках 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:

ibase_connect($host, $user, $passwd); // соединяемся с базой данных на Интербейз


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

Сравните:

<?PHP  
$a 
1// Присваиваем переменной А единицу
$b 6// Присваиваем Б значение 6
// Цикл по $i от 1 до 6
for ($i 1$i <= $b$i++ ) 
    $ 
$a $i// Умножаем А на $i
?> 

<?PHP  
// Находим факториал числа $b
$a 1;
$b 6;
for (
$i 1$i <= $b$i++ )  
    
$a $a $i
?> 

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

<?PHP  
function factorial($b)
$res 1;
for (
$i 1$i <= $b$i++ ) 
    
$res $res $i
?> 


Здесь всё и без комментариев ясно. Это о том, как надо называть функции и переменные.

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


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

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


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

Здесь скажу только то, что ситуации типа

<?PHP
function any_func()
{
    if ( 
условие ) {
        
// вся функция
    
}
}
?>

Их лучше описывать вот так:

<?PHP
function any_func()
{
    if ( ! 
условие ) {
        exit;
    }
    
// вся функция
}
?>


GOTO

Этот оператор присутствует во многих языках программирования, и в PHP 5.3.0 он тоже появился. Но называется он там Jump.
Использовать его можно, но только тогда, когда это необходимо; когда это облегчает чтение и реализацию кода; когда чтобы избежать GOTO приходится вводить множество дополнительных проверок и переменных. Однако, возникновение такой ситуации, может свидетельствовать и об ошибке проектирования. Но если уж надо, то ладно. Только не стоит злоупотреблять.
Для выходов из цикла, кстати, в PHP есть break, для повторения - continue. У оператора break можно указать число из скольких уровней вложенности нужно произвести выход. Так, что избегать его возможности есть.

Еще несколько полезных правил:

  • Хороший код комментирует себя сам
  • Никогда не используйте goto, строго никогда. Нет и не придумают таких конструкций, в которых бы нельзя было без него обойтись.Если у Вас в коде один участок встречается более 1 раза, стоит подумать о том, чтобы сделать его функцией. Это, правда, стоит относить к логически законченному фрагменту, то есть к такому участку, который можно объединить в логическую форму.
  • Хорошо написанный скрипт сэкономит время программиста - одного пишущего и десяти читающих.
  • Я рекомендую писать комментарии только на английском языке, чтобы в любой кодировке они были прочитаны как надо. Я рекомендую писать не транслитом, а на литературном английском.
  • Не стоит тратить время на придумывание супер-хитрых алгоритмов, которые сэкономят 0,1 секунды при бенчмарке 10000. Время программиста стоит куда дороже времени этих бездушных железок. И, к тому же, процессорное время дешевеет, а время программистов - дорожает. Это правило стоит применять, если приросты в производительности явно малы по сравнению с затратами по разработке.
  • При именовании функций и переменных придерживайтесь определенного - но - одинакового стиля. Не стоит писать, скажем

    <?PHP
    $user_password
    ="";
    $userPassword="";
    ?>

  • Вы наверняка забудете, как и в каком случае называли эту переменную. Придерживайтесь одного стиля и Вам не придется тратить время на поиск того, как же именно Вы именовали эту самую переменную.
  • Для облегчения чтения в PHP я рекомендую указывать приставку типа данных впереди имени переменных (так называемая "венгерская нотация"). Связано это с тем, что в PHP нет явного определения типа, и такое именование помогает сразу понять, к какому типу все-таки относится переменная:

    <?PHP
    $sUsername
    ="user123";
    $iUserage=20;
    $bUserdeleted=false;
    ?>

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


 
 
 <<< Назад 
 Содержание 
 Вперед >>> 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS