05:26

Coding style

Sanctus Satanas
Вопрос скорее, скажем так, удобства написания и читабельности.
Обычно мои скрипты выглядят примерно так:

Click!

Идея тут в том, что в верхней части выполняются все запросы и часть обработки, а уже потом, если всё прошло нормально, делается ещё одна разветвиловка (в примере отсутствует) и выводится что-нибудь на страницу. Или если были ошибки, то выводится сообщение об ошибке. Почему я не использовал конструкции типа «or die()»? Потому что тогда сломается оформление страницы, а мне бы хотелось чтобы даже в ошибочных случаях оно выводилось.

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

Комментарии
27.05.2008 в 10:10

Шаблоны.
Исполнительная и отобразительная часть в одном флаконе - моветон.
Если, конечно, этот скрипт не stand-alone.
27.05.2008 в 11:05

 
--==SS==--, надо же, практически такая же логика, как у меня))
если часть кода между твоими двумя развилками (ежели там вообще есть код) не создаст особенной нагрузки, можно включить буферизацию (ob_start()) и все действия выполнить прямо в теле страницы. Обычно я для развилки использую switch(), ибо в нем можно перепрыгнуть к следующей ветви условия; ну, примерно так:

читать дальше

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

-->
27.05.2008 в 11:05

 
читать дальше

просто, мне кажется, удобнее иметь функциональную часть и вывод пользователю рядом, а не раскиданными по всей странице. Кстати, в моем случае для навигации по скрипту я использую поиск по тексту - просто ищу что-то вроде case 'view.

правда, вдвоем над таким кодом становится работать значительно тяжелее, зато одному человеку, наоборот, работу заметно ускоряет.)

P.S. Такой навязчивый стиль - ставить открывающие фигурные скобки на той же строке, а не ниже >.<
27.05.2008 в 12:42

Хаотичный нейтрал.
надо же, практически такая же логика, как у меня))
+1 =)
27.05.2008 в 13:46

Мантру "Separate Computation and Presentation" повторять по утрам пока не доведёте до автоматизма... > >
27.05.2008 в 20:09

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kuroi Kitsune +1
--==SS==-- Представь себе проект в котором 200-300 файлов. Допустим половина из них выводит какой-либо контент. Представь себе объем работы при сильном изменении дизайна (не только шапки и подвала, но и различных элементов) при твоей схеме. Что до ошибок - в php5 есть очень удобная конструкция try/catch.
27.05.2008 в 21:38

 
Представь себе проект в котором 200-300 файлов.
дык это ваша же проблема - то, что проект состоит из 200-300 файлов, а не 2-3)
27.05.2008 в 21:41

Хаотичный нейтрал.
ну не 2-3, а с 10ок у меня было, максимум, - каталог совмещенный с подобием магазина, и профиьно-юзерной системой =))
27.05.2008 в 22:01

дык это ваша же проблема - то, что проект состоит из 200-300 файлов, а не 2-3)
Вот объясните мне - как проект, например, форумной системы уместить в 2-3 файла?
Бред говорите.
28.05.2008 в 09:50

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
La personne mystique ritor Да, интересно как вы вмсестите цмс с 15-20 модулями в 2-3 или даже в десяток файлов.
28.05.2008 в 11:51

 
D:\AppServ\www\lublino>php -r "$f=file_get_contents('admin/index.php'); var_dump(count(explode('case ', $f)));"
int(114)


114 узлов - это примерно 19 модулей.
искренне не понимаю, в чем проблема )

Еще раз хочу обратить ваше внимание на то, что принцип Separate Computation and Presentation предназначен прежде всего для облегчения групповой работы (действительно, десять программистов не могут одновременно работать над одним файлом); очевидно, если проект достаточно сложен, чтобы над ним работало несколько программистов (или если один программист будет работать над ним непрерывно, скажем, полгода), он, в любом случае, потребует разработки индивидуальной логики работы и с потерями времени на ее разработку можно мириться. В противном случае это приводит лишь к падению скорости работы, что на моем опыте неоднократно подтверждалось на практике)
28.05.2008 в 12:27

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Мда.
28.05.2008 в 12:41

Для совместной работы есть и был SVN.
Один -дцатитысячи строчный файл на всю систему... да, однако тут знают толк в извращениях...
30.05.2008 в 01:24

Sanctus Satanas
La personne mystique
если часть кода между твоими двумя развилками (ежели там вообще есть код) не создаст особенной нагрузки, можно включить буферизацию (ob_start()) и все действия выполнить прямо в теле страницы

Между развилками кода почти нет, разве что title может быть динамическим. То есть делать формирование вывода прямо при анализе входных параметров? Ну, тоже неплохо. Единственное, что напрягает — количество отступов в коде сильно увеличивается.
Насколько я понял идею, вместо использования механизма буферизации с тем же успехом можно просто написать $content = 'бла-бла-бла'; $content .= myfunction('бла-бла-бла'); и т.д. Правда, пользоваться конструкциями типа ?>много разного HTML<?php уже не получится и придётся экранировать одинарные кавычки...
В самом примере чисто эстетически мне ещё одна вещь не понравилась: в блоке <form></form> в выводе будет куча отступов, непонятно зачем там оказавшихся (да, я понимаю, что в браузере их не будет видно). А если убрать отступы, можно будет запутаться в самом коде...

Обычно я для развилки использую switch(), ибо в нем можно перепрыгнуть к следующей ветви условия

Э-э-э... Ну не совсем. Просто если в каком-то месте не break'нуть, то выполнение пойдёт дальше по всем веткам до конца. В примере выглядит хорошо, но если ветвей, скажем, пять, то для чего может потребоваться перескочить с ветки 1 на ветку 2? Или с ветки 1 пройтись по всем до пятой? Честно не врубаюсь в логику. :)
А так да, я сам использую switch'и. Просто в моём примере кода разбирается только, переданы ли параметры через post, get или вообще не переданы, а сюда switch ну никак не воткнуть.

Такой навязчивый стиль - ставить открывающие фигурные скобки на той же строке, а не ниже >.<

Ну... Никто не запрещает его использовать. ^^

FVA
Что до ошибок - в php5 есть очень удобная конструкция try/catch

Не очень понимаю её удобства относительно примера. Если поместить в try...catch целый блок, то место возникновения ошибки окажется неизвестным. Вернее оно будет известным только программисту, если он куда-нибудь выведет подробные данные о номере строки и т.д. А поставить на каждую ошибку соотвествующее сути сообщение об ошибке уже не получится. Не знаю, может это лишнее, но мне нравится, когда сообщения об ошибках выводятся достаточно понятные даже для конечного юзера, а не просто "Возникла ошибка, скрипту хана".

FVA, Kuroi Kitsune
Шаблоны, значит... Нет, повторять какие-то мантры я точно не буду. :)
Я не совсем понимаю, как можно разделить исполнительную и отобразительную часть. Отобразительная часть сильно зависит от исполнительной, кроме статичных участков (которые и у меня вынесены в отдельные файлы для удобства, чтобы не захламлять код, и потому, что используются в нескольких страницах и, соответственно, скриптах, отвечающих за их вывод).
Опять же, как будет выглядеть шаблон? Как подключаемый php-файл, в котором не будет осмысленной логики, но будут выводиться буферизованные в процессе выполнения скрипта переменные? Тогда особой разницы нет, где именно он находится, внутри основного скрипта или отдельно. Если дизайном занимается отдельный человек, то в отдельном файле ему будет, наверное, удобнее. А если написать некий макро-язык шаблонов, то по сути мы просто скопируем встроенные возможности php, да ещё и добавим необходимость собственного парсинга.
Всё равно в любой случае этот некий дизайнер (предположим, что он не знает PHP) не сможет самостоятельно поменять формат вывода сгенерированных блоков, ему останется на откуп только общий каркас + расположение этих блоков внутри каркаса.

P.S. Я не отрицаю, что могу в чём-то ошибаться. :)
30.05.2008 в 11:49

 
--==SS==--,
То есть делать формирование вывода прямо при анализе входных параметров?
ага, примерно так.
насчет отступов редко задумываюсь)

Насколько я понял идею, вместо использования механизма буферизации с тем же успехом можно просто написать $content = 'бла-бла-бла'; $content .= myfunction('бла-бла-бла'); и т.д. Правда, пользоваться конструкциями типа ?>много разного HTML<?php уже не получится и придётся экранировать одинарные кавычки...
да, это просто добавляет удобства кодингу; к тому же, буферизация облегчает отладку - при ее включении всевозможные Warning'и и Notice'ы не высыпаются сразу пользователю, и можно без проблем использовать var_dump().

В самом примере чисто эстетически мне ещё одна вещь не понравилась
я рассматриваю HTML-вывод как продолжение PHP-кода, и потому расставляю те же отступы)
мне кажется, это лечится только построчным выводом.
впрочем, еще можно, при той же буферизации, сделать что-нибудь вроде preg_replace('#\s+#', ' ', $buf);

В примере выглядит хорошо, но если ветвей, скажем, пять, то для чего может потребоваться перескочить с ветки 1 на ветку 2?
просто есть достаточно типовая логика, которая нужна практически в любом проекте:
1) вывести пользователю пустую форму; он ее заполняет и отправляет;
2) если форма заполнена верно, обработать ее и вывести сообщение об успехе;
3) иначе, вывести снова заполненную форму с указанием на ошибки.
и вот именно этот подход мне почему-то проще делать через switch() ^^
02.06.2008 в 13:35

Sanctus Satanas
La personne mystique
Кстати... Мне когда-то понравилась идея с плейсхолдерами (но не понравилась громоздкая библиотечка на denwer.ru), поэтому я написал коротенький код, который примерно по сути делает то же самое:

Щёлк!

Собственно, используется это так:

$query = 'SELECT ? + ? * ? / ?';
$result = db_query($query, $a, $b, $c, $d);


Разумеется, подразумевается, что дурацкий magic_quotes_gpc отключён.

А вот сейчас у меня появилась мысль сделать что-то такое:

Щёлк!

И тогда можно будет сразу пихать вызовы куда попало (и отступов в начале будет меньше ^^). А может это и лишнее...
02.06.2008 в 14:15

 
$p = strpos($t, '?', $b); $q .= substr($t, $b, $p - $b).'\''.mysql_real_escape_string($a[$i]).'\''; $b = $p + 1;
обрати внимание на функцию vsprintf() ,)

А вот сейчас у меня появилась мысль сделать что-то такое:
кстати, забавно, я уже давным-давно использую такую функцию:
читать дальше

а еще вот так, они служат просто для сокращения объема текста при печати )
читать дальше
02.06.2008 в 18:48

Sanctus Satanas
La personne mystique
За vsprintf() спасибо. ^_^
А я написал через static потому что мне эта переменная за пределами функции нафиг не нужна.
Не понял идею с ht($txt)htmlspecialchars() чем не устраивает?
Кстати, mysql_real_escape_string() рулит гораздо больше, чем mysql_escape_string().
02.06.2008 в 19:34

 
--==SS==--,
А я написал через static потому что мне эта переменная за пределами функции нафиг не нужна.
а мне иногда, бывает, нужно проверять наличие ссылки)
т.е., query() у меня сделана так, что всегда отрубается при ошибке, а если мне нужно сделать запрос, который может окончиться ошибкой, но потом продолжить работу, то я использую непосредственно mysql_query(). Благо, запросы я генерирую сразу строкой

Не понял идею с ht($txt) — htmlspecialchars() чем не устраивает?
у нее проблемы с юникодом)

Кстати, mysql_real_escape_string() рулит гораздо больше, чем mysql_escape_string() (экранирование % нужно для запросов вида LIKE ...).
да, наверно)
01.07.2008 в 23:25

Всё будет Кока-Кола.
И всё же (соглашусь с пердыдущими поборцами упрощенности) код не учень презентабелен. Много такое где не напихаешь... А если выплывет ошибка либо захочется сменить пару функций...

Гораздо проще всё цеплять через обработчик Апача... там же можно инициализировать соединение и забить основной набор функций...

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail