The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Хороший и плохой PHP код. (php)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: php,  (найти похожие документы)
From: Scorpion <ss-suchkov@yandex.ru.> Newsgroups: email Date: Mon, 18 Dec 2007 14:31:37 +0000 (UTC) Subject: Хороший и плохой PHP код. Моё рабочее время делится как правило на три части(помимо завтрака и обеда): собственно сама работа, поиск нового и интересного; что помогает в работе; чтение bash.org.ru конечно(у всех свои слабости). Очень часто наталкиваюсь на статьи о хорошем и плохом коде. Причём нередко то, что считается плохим кодом в одной статье, признаётся хорошим в другой. Наибольшее противостояние идёт вокруг "отделения дизайна от кода". Одни говорят о том, что совмещать код нельзя, ибо все "нормальные языки программирования" этого не допускают, другие говорят что отделение это лишь прихоть дизайнеров, которые не хотят разбираться в коде(хотя. почему они должны, собственно?). Вопрос конечно спорен, но я придерживаюсь точки зрения о том, что код и дизайн должны быть разделены на сколько это возможно. Об этом я уже говорил в одной из моих прошлых статей, но сейчас речь не об этом, вернее это только частность. Во время поиска чего-то новенького я наткнулся на занимательную статью, которая мне очень понравилась, и которую я бы хотел вам привести. Поскольку она на английском языке, далее следует её перевод. Хороший и Плохой PHP код автор: Кевин Янг Источник: http://www.sitepoint.com/blogs/2007/05/25/good-and-bad-php-code/ На собеседовании с кандидатом на должность PHP-кодера в SitePoint я всегда задаю свой любимый вопрос(так как ответ на него даёт понять на сколько хорош программист): "Какая разница, на ваш взгляд, между хорошим и плохим PHP кодом?" Я люблю этот вопрос за то что он даёт возможность проверить не только знание функций, но и многие другие стороны знаний в отношении PHP. А для проверки знания функций в PHP существуют специальные тесты: Zend's PHP certification например. Ответ на этот вопрос позволяет понять, например, работал ли разработчик с чужим, плохо написаным кодом, оставшимся от плохого программиста-предшественника, и возникали ли у него трудности при этом. Ну и конечно становится понятно, будет ли "доработка" такой же кривой, или обретёт человеческое лицо. В действительности, я не знаю точного ответа на собственный вопрос, но я точно знаю определённые вещи, которые хочу услышать. Я вот и они: Хороший PHP код должен быть структурированым. Длинные куски кода должны быть разбиты на функции или методы, которые позволяют выполнять отдельные операции и описаны "простым" кодом. Функции и методы в свою очередь должны быть снабжены понятными коментариями, позволяющими понять суть выполняемых операций. На сколько это возможно, код должен быть отделён от конечного представления, которым является HTML/CSS/JavaScript код. ООП даёт очень мощные инструменты для написания вашего кода структурированым и разбитым на мелкие, просты элементы. Хороший код должен быть последовательным. Это значит что вы должны следовать определённым правилам именования переменных и функций, стараясь стандартизировать код таким образом, чтобы он был понятен любому разработчику. Хороший код должен быть портируемым. В PHP есть ряд функций, таких как "magic quotes" например, использование которых может привести к сбоям в работе кода, в зависимости от того используются они или нет. Конечно, если вы знаете что делаете, можете писать код для конкретной платформы. Хороший код должен быть безопасным. Несмотря на то, что после установки php отлично работает, многие аспекты работы интерпритатора находятся в руках разработчика. Это прежде всего безопасность. На сегодняшний день существует масса потенциальных опасностей: XSS-уязвимости, CSRF-уязвимости, инъекции кода и т.д. После того, как кандидат ответил на вопрос, чаще всего я уже знаю будет он у нас работать или нет. Конечно, есть и такие программисты, которые просто не могут внятно сформулировать те тезисы, которые я привёл. Для них мы придумали специальный экзамен. Многие вопросы кажутся поверхностными и простыми, как будто ответы лежат на поверхности. Однако, они дают кандидатам возможность показать на сколько они педантичны(на сколько они внимательны к деталям). Следующий "плохой" код - очень упрощёный пример кода, элюстрирующий то что мы хотели бы узнать на экзамене. Сам вопрос мог бы звучать примерно так: "Каким образом нужно переписать этот код, чтобы он стал правильным и что называется хорошим?" <? echo("<p>Search results for query: " . $_GET['query'] . ".</p>"); ?> Основная проблема данного скрипта в том, что он выводит переданое значение напрямую, там самым создаёт XSS-уязвимость. Хотя есть и другие нарекания. Итак, что бы мы хотели услышать/увидеть в качестве ответа? <? echo("<p>Search results for query: " . htmlspecialchars($_GET['query']) . ".</p>"); ?> Именно этого мы и ждали. Мы предупредили XSS-уязвимость использовав функцию htmlspecialchars которая превращает "опасные символы" в их "безопасный" аналог. При этом код можно ещё улучшить: <?php if (isset($_GET['query'])){ echo '<p>Search results for query: ', htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>'; } ?> Теперь код выглядит так, как у разработчика, которого мы бы хотели нанять: "Короткий" вариант PHP тега (<?) заменён на его "длинного" прородителя, который более универсален(и дружелюбен стандарту XML). Перед тем, как вывести значение $_GET['query'], проверяется существует ли переменная. Для этого используется функция isset. Круглые скобочки вокруг значения, выводимого через echo убраны за ненадобностью. Строковые переменные заключены в апострофы, вместо кавычек, для того, чтобы переменные можно было вставлять без усилий в строку. Вместо конкатенатора(.), который посылает на вывод единую строковую переменную, элементы передаваемые оператору echo разделены запятыми для небольшого выигрыша в производительности. Задание дополнительного параметра ENT_QUOTES позволяют безоговорочно применять замену к апострофу. К сожалению, из ищущих работу программистов, не так много тех кто смог бы ответить на мой вопрос правильно. По крайней мере здесь, в Мельбурне. Мы потратили три месяца пока нашли того, кто отвечал бы всем нашим требованиям! Итак, как вы ответите на мой вопрос? какие ещё факторы позволяют отличить хороший код от плохого? Что вы ищите в соискателях, когда ищете PHP разработчика? Частичная или полная публикация перевода допускается лишь с согласия автора перевода и с его предварительного согласия. ICQ: 107876417 Перевод статьи опубликован: http://scorpion.amateria.ru/2007/12/17/xoroshij-i-ploxoj-php-kod-good-and-bad-php-code.html

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Аноним (1), 13:15, 19/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ты конечно прости, но такой :
    <?php
                if (isset($_GET['query'])){
                    
                    echo '<p>Search results for query: ',
                    htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>';
                }
            ?>

    код работать не будет

     
     
  • 2.2, Gustik (?), 13:44, 19/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Почему же?
     
  • 2.7, Moriarti (??), 18:39, 19/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    хороший код )))

    стаття супер

     

  • 1.3, Андрей (??), 14:13, 19/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    элюстрирующий

    Cheked witz Mikrosoft spelchequer, ага

     
  • 1.4, Аноним (4), 14:14, 19/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    ибо запятая что то не в тему там)
     
     
  • 2.5, Sem (??), 16:00, 19/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >ибо запятая что то не в тему там)

    Вот такие люди и пишут на PHP :)))

     

  • 1.6, Pilat (?), 16:41, 19/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Такое количество арфаграфических абшипок... Возникает сомнение в правильности перевода. Кроме того, автор текста не заметил, что последняя строка в его тесте лишняя, ненужная и даже вредная. Автор забыл свои же советы насчёт отделения кода от html. Не удивительно, что к такому работодателю три месяца нормальные программисты не приходили.
     
  • 1.8, max (??), 11:21, 20/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну пипец, начали за здравие (ооп, separation of concerns и т.д.) а закончили echo('<p>'); и скобочками вокруг него. 3 месяца, блин, искали, кто скобочки уберет!

    Я так думаю, хороший программист на PHP -- тот кто в состоянии преодолеть идиотские ограничения платформы, заключающиеся, как минимум в отсутствии пространств имен и модульной системы, отсутствии абстрагированного слоя хотя бы для единообразной работы с HTTP под разными серверами, не говоря уже об ORM и прочих радостях (apache_request_headers, ага, и ладно бы хоть тесная интеграция с апачем была при этом), наличие страшной помойки, которую представляет из себя базовый API, отсутствии единого coding style и развитой стандартной библиотеки.

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

     
  • 1.9, Diman (??), 13:34, 20/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ыыы... очень смешная статья. В 2007 году чел пытаецо показать правильный код на примере echo, isset($_GET), блаблабла... Единственное, чего мне не хватает в php это namespaces (ждем, уже в 5.3) и нормального gc, который сможет разбирать циклические ссылки. Все остальное, MVC там всякие, ORM-ы вопросы решаемые и я бы сказал даже больше - решенные. Например http://wcmf.ru/. А тем кто не любит пехапе по причине "патамушта", могу сказать - вы просто не умеете его готовить.
     
     
  • 2.10, max (??), 15:25, 20/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >Ыыы... очень смешная статья. В 2007 году чел пытаецо показать правильный код
    >на примере echo, isset($_GET), блаблабла...

    Именно.

    > Единственное, чего мне не хватает в
    >php это namespaces (ждем, уже в 5.3) и нормального gc, который
    >сможет разбирать циклические ссылки.

    С namespaces похоже таки опять получится как всегда, ну да ладно, если весь код свой -- можно приноровиться и без них, а вот в то, что когда-нибудь появится нормальный gc, я лично вообще не верю, хотя не хватает его катастрофически.

    > Все остальное, MVC там всякие, ORM-ы вопросы
    >решаемые и я бы сказал даже больше - решенные. Например http://wcmf.ru/.

    Ну, MVC самому сделать -- небольшого ума дело, независимо от языка. А вот насчет ORM -- тут засад очень много.

    >А тем кто не любит пехапе по причине "патамушта", могу сказать
    >- вы просто не умеете его готовить.

    Да, только готовить надо хорошо уметь, и воняет в процессе приготовления все-равно омерзительно. Ну и любить его, в общем-то, не за что.

     
     
  • 3.11, Diman (??), 15:35, 20/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Каждый должен заниматься своим делом. Нормальный руководитель должен знать кому делегировать задачу тестирования программиста, дизайнера или бухгалтера, а не корчить из себя профессионала. Кесарю кесарево, как грится.

    По поводу любви. Это как с женщинами - чем больше на нее потратишь (времени/денег/etc), тем больше "любишь". А если еще и дети общие, то ваще пипец. Так и тут, если есть большие наработки в определенной области, просто глупо от них отказываться только потому, что в основе лежит кривой процедурный API.

     
  • 3.12, Diman (??), 15:57, 20/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >в то, что когда-нибудь появится нормальный gc, я лично вообще не
    >верю, хотя не хватает его катастрофически.

    PS. По поводу GC не стоит отчаиваться заранее. Процесс идет
    http://aspn.activestate.com/ASPN/Mail/Message/php-dev/3588702

     

  • 1.13, Alexey (??), 18:07, 21/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как такового различия не вижу, все-равно сказать плохая инструкция процессора, код есть код. По существу - тот который не работает.
     
     
  • 2.14, Diman (??), 18:21, 21/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >Как такового различия не вижу, все-равно сказать плохая инструкция процессора, код есть
    >код. По существу - тот который не работает.

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

    По моему более точного определения хорошего/плохого кода не найти.

     
     
  • 3.15, crl (?), 17:56, 29/12/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Хороший программист - тот, кто действительно любит программирование. Технические асекты придут со временем и практикой, а любовь к программированию - она либо есть, либо - нет.
     
     
  • 4.17, admax (?), 00:19, 22/01/2008 [^] [^^] [^^^] [ответить]  
  • +/
    +1. Абсолютно согласен. С любовью к программированию приходит и опыт, и умения
     

  • 1.19, ну вот и проверил фильтрацию (?), 23:13, 06/06/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    мля.. .Не стать я бред.. ..Давайте ещо разберём всю фильтрацию ... итд.
    И вообще вы читали статью с самого начала,
    html и ПХП код должны быть разделены
    А я бы написал так
    print '<p>Search results for query: ';
    echo htmlspecialchars($_GET['query'],ENT_QUOTES);
    print '</p>';
     
  • 1.21, hevyweb.com.ua (?), 14:13, 09/09/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья хорошая, но тема полностью не раскрыта. Жаль, что не упоминалось пхп доки((
    Я бы писал
    <?php
    echo '<p>Search results for query: '.
                    htmlspecialchars(@$_GET['query'], ENT_QUOTES).'.</p>';
     
  • 1.22, Es (?), 13:45, 09/11/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Правильным вариантом будет скорее следующий код, написанный в представлении. И то, скорее всего, прямого обращения к  $_GET не будет, ибо шаблон не должен зависеть от внешних данных, которые могут всегда измениться, ведь это не должно быть поводом к переписыванию шаблонов.

    <?php if ( isset($_GET['query']) ): ?>
    <p>Search results for query: <?=htmlspecialchars($_GET['query'])?></p>
    <?php endif; ?>

     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2023 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру