Станислав Тельнов Дебютант

Каким должен быть код интернет-страниц? Читабельность vs размер. Часть 2. PHP

В первой части статьи мы говорили про цветочки, т. е. про html код. А теперь давайте про ягодки — php код!

Допустим, вы пишете скрипт на php… и пишете его, не особо заботясь о читабельности. Да, вы пишете его по нескольку часов изо дня в день, наизусть помните, что означает тот или иной фрагмент, что означает та или иная переменная.
Но вот вы написали скрипт. И всё! А потом захотели его отредактировать. Например, ошибка в коде, которую вы раньше не заметили.
Вы открываете его и видите, например, такое:
if ($a==$b && ($c≥$d || $q≠$p)) {$s=w ($a); echo 'Результат: '.x ($s);}

Вы что-нибудь понимаете? Можете сказать, что делает этот фрагмент кода? В чём смысл? Конечно, нет! Но это только одна строка кода… а скрипт может занимать и 10, и 20, и 50 строк… и что тогда? Сидеть полдня и вспоминать, что значат переменные $a и $b и искать, где вы описали функции w () и x ()?
Хорошо, а теперь взгляните на такой вот кусок кода:
if ($result==$znachenie && ($max≥$min || $otvet≠$error))
{
$OKresult=obrabotka ($result); //Обработка результата
echo 'Результат: '.Preobr ($OKresult); //Преобразование данных в понятный формат.
}

Согласитесь, в последнем коде даже не разбирающийся в программировании человек уже что-то понимает!
Хотя оптимизаторы сайтов, наверное, на меня сейчас накинутся с гневными ругательствами: мол, не к тому приучаю! Этак и страница будет весить, как слон! В результате и загрузка дольше, и трафик больше будет, да и вообще! Чем меньше размер — тем лучше!
В принципе они правы, ведь первый кусок кода весит 71 байт, а второй 223 байта…

Да, к сожалению, при арифметическом росте читабельности геометрически растёт вес страниц, но что поделаешь. Я специально проверял. Я удалил все лишние пробелы, переходы на новую строку и т. д. на одной их своих страниц. И страница уменьшилась в размере в 6, 7 раз! Это при условии, что я переменным не менял имена на более короткие в один-два символа, а так можно было бы уменьшить размер в 10 или более раз!

Впечатляет? И зачем же такие жертвы, спросите вы? Если вы хоть раз писали длинный скрипт, то вы меня, наверное, поймете. Если же нет, то сейчас объясню.
Представьте, вы пишете скрипт. Пишете именно как в первом варианте — с непонятными именами переменных, максимально сокращая вес страниц, не делая ни одного лишнего пробела, и пишете всё чуть ли не в одну строчку. Да, во время написания вы помните, где и в каком месте у вас что записано, какая переменная что означает. И вот вы написали…

А через пару месяцев вы хотите исправить скрипт… и что вы видите?! Вы уже не вспомните, что означает та или иная переменная, что означает тот или иной кусок кода. Более того, не видно, где начинаются и где заканчиваются циклы, условия и т. д. И поверьте, вам придётся потратить минимум полчаса на то, чтобы разобраться в своём же скрипте! А если скрипт большой и сложный, а вы не профессионал — минимум часа полтора! А изменения вы, может, успеете и за 10 минут внести!

Вам хочется каждый раз тратить столько времени на «вспоминание» того, что, где и когда вы написали, как это всё работает, что это означает и что со всем этим делать? Если да — то пожалуйста, пишите всё, как хочется. А если нет, называйте переменные «по-человечьи»! И не стесняйтесь комментариев, они пока ещё не принесли никому такого катастрофического вреда, чтобы от них избавляться. Поверьте, когда где-то в шестиста строках нечитабельного php кода есть «не явная» ошибка (т.е. когда в целом всё работает, но не всегда так, как нужно), то поиск подобной ошибки превращается в многочасовой ад!
Помните поговорку: «скупой платит дважды»? Как ни удивительно, но для сайтостроения она тоже применима! Поленившись потратить 20−30 минут на то, чтобы сделать код читабельным, вы каждый раз при редактировании будете тратить эти же 20−30 (если не больше) минут только на то, чтобы разобраться в коде.

А сейчас хочу вас немного предостеречь. Я иногда вижу и варианты, подобные этим:
if ($resultata_rabotu==$znachenie_iz_bufera_obmena && ($maximal_chislo_polsovatela≥$minimum_chislo_reshenia || $otvet_vychislenia_vurashenia≠$error_vo_vrema_rassgeta)) //Проверка условия такого-то в зависимости от того-то и при тех-то обстоятельствах.
{
$good_resultat_rabory = obrabotka_resyltata_vyshiskenia ($resultata_rabotu); //Функция обработки результата, которая сначала делает то-то, а потом вот это и ещё это.
echo 'Результат: '.Preobrazovanie_resultata_v_drygoi_format ($good_resultat_rabory); //Функция преобразования данных в понятный формат, которая преобразует данные из такого-то формата в такой-то для лучшего понимания результата человеком.
}

Ну всё хорошо, но в меру! Ведь комментарии — это не сочинения-рассуждения, а имена переменных — это имена, а не словосочетания. Не нужно излишеств, старайтесь писать понятно, но не нужно комментировать совершенно очевидные вещи и писать километровые имена переменных. Это слишком!

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

Конечно, все люди разные и кому-то, чтобы понять принцип работы того или иного скрипта, комментарии вообще не нужны — он и так всё понимает, а кому-то без них не обойтись! Всё относительно. Конечно, нет никаких особых критериев того, как писать код. Пишите код так, чтобы вы сами его поняли и разобрались в нём довольно быстро, а не так: «работает, и вес маленький, а то, что ничего не понятно и всё в одну строчку… ну так издержки производства!». Это заранее провальный подход, вы в результате проиграете больше, чем выиграли — ведь скупой платит дважды!

Обновлено 4.10.2007
Статья размещена на сайте 3.09.2007

Комментарии (34):

Чтобы оставить комментарий зарегистрируйтесь или войдите на сайт

Войти через социальные сети:

  • В принципе согласен. Однако, если уж статья позиционируется как популяризаторская, то следует избавляться от жаргонизмов типа "вес страницы" и подобных.
    Также неплохо бы пунктуацию прокачать, много огрехов.

    Жду статью по использованию CSS для экономии размера и повышения читабельности

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

    Оценка статьи: 5

    • Сразу видно что вы никогда не связывались с веб-программированием))) Специальными программами это не возможно. С помощью специальных программ (визуальных редакторов) можно только делать вёрстку, но ни в коем случае не скрипт. Его нужно писать вручную. Нет, конечно есть некое ПО которое позволяет создавать уже готовые по функциональности сайты одним нажатием на мышку, но и качество таких сайтов оставляет желать лучшего. И что будет потом в коде скрипта, сделанного таким образом никто не знает... а вдруг там будет вирус???

      Вообще невозможно писать скрипт с помошью специальных программ... Ведь по сути сам язык программирования (интерпритаттор php и сервер) - это и есть специальные программы программы.

  • Сохраню, полезно..

  • 5! Какой Вы умница, Станислав!
    В Вашем возрасте - и понимать такие сложные вещи!
    А вот скажите, как специалист - наверное, чтобы понимать эти вещи, надо иметь склонность более к точным наукам?
    Чем такие сугубо гуманитарные мозги, как у меня, да?
    И если я с алгеброй и интегралами – дифференциалами в школе и ВУЗе не дружила, то мне будет трудно подобное постигать, правильно я думаю? Или всё же есть надежда?

    Оценка статьи: 5

    • Большое вам спасибо за столь высокую оценку... Но поверьте – это очень сложные вещи, и многие мои ровесники достигли в программировании гораздо более высоких результатов. Просто к тому, что код должен быть понятен прежде всего себе самому не пишут, почему-то, в книгах по программированию, и многие приходят к этому сами, после некоторого опыта.
      Насчёт склонности к точным наукам... думаю она тут не причём, т.к. по математике у меня тоже проблемы, а интегралы и решать до сих пор не умею, хотя мы их по математике сейчас и проходим. Мне тоже гуманитарные предметы даются легче. Просто мне всегда было интересно программирование само по себе, и поэтому изучал и изучаю его. Я как правило человек, не имеющий склонностей к данному предметы, но постоянно учится и совершенствуется в данном направлении, в конечном итоге достигает в этой области гораздо более высоких результатов, чем человек имеющий склонности, но не развивающих их. Так что всё возможно, и программирование само по себе кажется не таким уж сложным после самостоятельно написания нескольких программ и понятия логики программирования. Так что, Марина, если вам действительно интересно данное направление, то всё у вас получится))))

      • что код должен быть понятен прежде всего себе самому не пишут, почему-то, в книгах по программированию
        значит, Вы не те книги читали
        в книгах по программированию (там где изложены именно общие принципы и приёмы программирования) обычно это упоминают, а вот в книгах, описывающих синтаксис/семантику конкретного языка (таких книг большинство, по мне они скорее справочники) такое редко встречается

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

        • Да вы правы, значит не читал нормальных книг по программированию. Со справочниками гораздо удобнее рабоать.. Просто нашёл функцию, её синтаксис и что она делает и всё.

          По поводу второй реплики тоже соглашусь.. Я имел ввиду в первую очередь веб-программированию. Задачь на обычных языках (С\С++, Ассемблер) я делал только лабораторные в институте.

          Спасибо за уточнения)))

    • для создания простых веб-страничек не обязательно быть "технарём"/математиком/программистом (Вы же не собираетесь делать сайты на заказ? )
      в Вашем случае, наверное, хватит для начала основ html (это не сложно).. если понравится и хорошо пойдёт, тогда можете копаться дальше в своё удовольствие

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

    • Курсивом я выделил код только чтобы он с текстом не сливался.

      Возможно я погорячился фразой
      Согласитесь, в последнем коде даже не разбирающийся в программировании человек уже что-то понимает!
      Но всё таки второй вариант кода написан транслитом и понятнее, чем просто набор переменных из букв a, b, c и т.д.

      • немного понятней, но есть одно замечание точнее не замечание а пример, его кстати приводят почти всегда в начале изучения программирования.
        Что скажет человек не изучающий программирования если ему показать вот такую строчку:
        х=х+1

        • Что скажет человек не изучающий программирования если ему показать вот такую строчку:
          х=х+1

          уф.. и пришлось же поднапрячься, чтобы представить себя человеком, который не знает программирования (первые мысли "inc x", " x++", "увеличиние на единицу")..
          наверное, подумает что какой-нить силлогизм или опечатка в одной из переменной, ибо представит это с математической точки зрения как уравнение, то бишь:
          x=x+1; например, x=1; => 1=1+1 => 1=2

          я по тому поводу говорил выше в комментарие ко второй части: "простому смертному" нечего просиживать штаны/юбку просматривая исходный код

          • Ага простому смертному этого непонять, а про переменные, дык не каждый знает что это такое.

            • а про переменные, дык не каждый знает что это такое.
              вот не надо тут! если человек учился в школе, то знает, это входит в программу вроде средних классов (если не раньше)

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

                • Нет. Введение в программирование преподаётся сейчас, может не во всех, но в 90% школах. Сам школу только не давно зщакончил и поэтому знаю. Нект не одного знакомого, у кого не было бы ведения в программирование. В угрубленном изучении просто учат ещё и языки программирования, а в обычных школах и классах, просто введение и общие понятия преподают.

                • сейчас введение в программирование
                  да ёклмн.. ГДЕ я упоминал программирование? это МАТЕМАТИКА - составление уравнений, с переменными (они же неизвестные).. встречается также в физике, химии.. вроде это из курса школьного не убирали..

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

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

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

                      • Я про такие базовые навыки и не говорю, однако использование правил пропорцийи еще ряда умений, иногда даже банальный перенос одного элемента формулу через знак равенства вызывал недоумение. Эти примеры реальны, все это при том, что дети далеко не самые глупые, ну просто клинит их немного, и поэтому физика и математика для них разные предметы.

                        • всё таки я думаю Вы переборщили.. имхо, человек закончивший школу решить уравнение типа "3 = x + 2" сможет, а если сможет, то тогда и прийти в недоразумение увидев Ваш пример тоже сможет, для этого не нужно знания пропорций и тд.. возможно, Вы встречались с отдельными индивидуумами, которые дальше начальных классов не продвинулись, но в общем случае, я считаю что Вы не правы

                          • вообщето, если следить за ходом рассуждений, то мой пример был лишь для того, что бы показать, что даже тот кусок кода способен понять не каждый, а примеры приводимые вами, содержат только простейший вид. Я конечно понимаю, что большой разницы в этом нет, используются ли там дроби, тригонометрические функции (которые многие не долюбливают из-за их вида) и т.д. и т.п. но воспринимать мои слова так словно я сказал "Я знаю людей, которые не ответят 2+2" не стоит.

  • Буду знать.

  • переменные называют a,b и c, только в наглядных примерах, в реальности профессионал таким обозначением пользоваться не должен, так делают только недоучки, в принципе согласен, что в скритовых языках важна скорость загрузки и желетально, чтобы был поменьше объём кода.. тут приходится выбирать между читабельностью и размером..
    конкретно в Вашем примере:
    if ($result==$znachenie && ($max>=$min || $otvet!=$error))
    {
    $OKresult=obrabotka($result); //Обработка результата
    echo 'Результат: '.Preobr($OKresult); //Преобразование данных в понятный формат.
    }

    я бы скорее написал, при учёте того, что нужно получить меньший объём исходного кода (предупреждаю, я могу допустить неточности, анпример, использовать зарезервированное имя, просто я не знаком с синтаксисом php):
    if ($res==$val && ($max>=$min || $reply!=$err))
    {
    $proc_res=proc($res);
    echo 'Результат: '.modify($proc_res); // modify to plain format
    }

    1. не обязательно писать слово полностью, иногда достаточно намёка на него (главное не имена "от балды": a, b, c)
    2. в последнем коде даже не разбирающийся в программировании человек уже что-то понимает!
    не разбирающийся в програмировании человек в код смотреть не должен
    3. желательно использовать не транслит, а английский, так как мало ли с кем придётся совместно работать в команде
    4. комментарии иногда нужны, но не всегда.. большая ошибка новичков, что они начинают пихать комментарии где надо и где не надо, во многих случаях вместо комментариев достаточно "говорящих" имён переменных и функций

    ps: Вы движетесь в правильном направлении.. я уже успел сменить за несколько лет несколько стилей написания кода.. склоняясь то к минимализму, то наоборот.. постепенно вырабатывая для себя более удобный формат в зависимости от ситуации..

    • Да... спасибо за комментарий. Замечания дейстивтельно ценные и по существу))) Просто у меня проблемы с английским и поэтому всегда пишу транслитом. А для работы в команде коненчо же нужно по английски. Транслит гораздо хуже понимается.

  • +5

    Оценка статьи: 5