Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
В этом файле - ниоткуда. Я уж было думал, что дело пахнет уязвимостью (ведь register_globals=on, а дело происходит в глобальной области видимости), но проверка показала, что не катит. До этой конструкции идут 9 инклудов - наверное, где-то в одном из подключаемых файлов $admin_mode выставляется в false.
Очень интересная конструкция. Я что топодобное гдето видел даже помоему и ГК.
С одной стороны дурь и блаж с другой очень тонкое использование особенностей языка на других (с которыми я сталкивался) в подобных конструкциях для выбора ветвеления используется только константа и не вкоем случае не строка. А тут однин свич запихали несколько условий. Единственное что мне прямати расмешило это
case $nc_core->inside_admin:
$nc_core->admin_mode = true; три раза код пречитывал так смысл и не увидел.
Остальное хоть как то можно объяснить
Хотя тут же зная особности языка можно использовать что вроде if (z) x=b=c=true; else a=b=false;
Как то так ну может я и ошибаюсь
блин ИМХО какая-то говнопрактика, else if () быстрее пишется чем
break; case ()
единственное толковое применение switch(true) - это когда некоторые break - отсутствуют - иногда это может оказатся полезным.
кстати, о свитчах. всегда полагал, что идиотизм писать везде брейк. лучше бы по умолчанию он был, а если надо свалиться в следующую ветку, то делать это явно, навроде continue
а зачем ориентироваться на здравый смысл?
думаешь, ритчи от нех делать такой синтаксис использовал?
у тебя есть уникальная возможность создать свой язык с блекджеком и 'правильным' switch
А затем, что switch - прямой наследник goto, и работает не на уровне блоков, а на уровне инструкций. Единственный блок - сам switch, из которого и выходит break;
Так что убрать break'и можно только заменив switch на совершенно другую конструкцию (с нормальными блоками вместо case'ов, типа case of в erlang'е), но тогда ни о каких проваливающихся case'ах речи быть не может, и будет такая конструкция просто сахаром над if() else if () else ().
в принципе не проблема, при компиляции при встрече следующего case без continue вставить goto на конец switcha, а при встрече continue; case не вставлять его
говнокод - это когда криво реализовано
а тут просто ставится отрицание
на условии ставить ли goto endSwitch
и детекшн keyworda break заменяется на детект continue.
мне всегда казалось что компилеры писали, чтоб было удобнее кодить юзающему, а не наоборот
вот не надо городить костыли, поверх того, что реально работает (ведь налицо же продуманная идея)
если хочется 'подсластить' if else if.. лучше новую конструкцию ввести (в руби именно такой case)
Switch
case: -> метка, кода на своем месте при компиляции не дает
break -> goto в конец блока
Все просто как кувалда
Switch-без-break
case: -> метка, но компилируется в break, но только если перед ней нет continue
continue -> вообще ничего не делает, но влияет на компиляцию case
В неткете данные могут выводиться в обычным виде, в режиме редактирования, а так же в админке. В последних двух случаях к выводимым объектам могут добавляться различные ссылки ( удалить, изменить, етс).
Добавлять/изменять данные можно как с сайта, а можно в режиме редактирования.
Понятно, что если пользователь добавляет данные в режиме редактирования, то после операции он должен в этом режиме и остаться.
// если пользователь в админке - то он явно в режиме редактирования
case $nc_core->inside_admin:
$nc_core->admin_mode = true;
break;
// тут $admin_mode приходит из формы добавления (в post'e например )
case !$passed_thru_404 && isset($posting): // add (edit) action
$nc_core->admin_mode = $admin_mode;
break;
// через обработчик чпу запрос не проходил, значит пользователь зашел по адресу
мойсайт.ru/netcat/ - это режим редактирования
case !$passed_thru_404: //front-office
$nc_core->admin_mode = true;
// запрос прошел через обработчик чпу - показывается просто страница в обычном режиме
case $passed_thru_404:
$nc_core->admin_mode = false;
То есть любой авторизированный пользователь может переключиться на режим редактирования ( в скрипте тогда будет $admin_mode = 1 ), но это не значит, что он может все поудалять, у него не будет никаких на это прав: http://netcat.ru/netcat/?catalogue=3&sub=422
UPD: впрочем, это не важно. Спасибо за разъяснение, как работает этот кусок кода; мне часто приходится колупаться внутри, чтобы понять, как что-то работает/не работает. Тем не менее, приведённый кусок от этого более грамотно написанным не становится ни капли.
Мне вариант с синтаксическим сахаром нравится больше всего: он и короткий, лаконичный, работающий ( скорее всего, и самый быстрый), но вариант в оригинале, на мой взгляд, более читаемый.
Естественно, вариант в оригинале самый читаемый. Там логика в лучших традициях Капитана Очевидность - прямая, как извилины автора струна. Это выдаёт в авторе самого что ни на есть новичка, который ещё не отточил до автоматизма ни умение держать возможные ходы выполнения в голове, ни тем более умения просчитывать их, дабы не плодить лишних, и хорошо просчитывать их, дабы не перебарщивать с избавлением от лишнего, и поэтому скрупулёзно прописывает каждую ветку. То же самое я могу сказать про весь код NetCat, за редким исключением. Сейчас почитываю код 4-й версии - местами видны поразительно светлые мысли на фоне остальной безблагодатности, да и в мануале местами проскальзывают очень здравые на фоне остальных суждения. Никак команда девелоперов пополнилась кем-то действительно толковым. Надеюсь на лучшее.
Ну как сказать =) То, что основные сущности системы додумались реализовать в виде объектов, и то, что для класса nc_Core кто-то даже догадался применить шаблон "Одиночка", задепрекейтив глобальную переменную $nc_core, на фоне остального выглядит большим шагом вперёд. Вот только то, что в классе nc_Core какой-то умник взялся использовать ReflectionClass, который даже не документирован, повергло меня в шок. Именно из-за последнего, кстати, NetCat оказалась запускаться на PHP 5.3. Никак не возьму в толк, на фига, во-первых, было использовать недокументированный интерфейс, поведение которого может меняться в будущих версиях непредсказуемо, и, во-вторых, для чего вообще автора потянуло к средствам рефлексии (этот момент надо будет попробовать самостоятельно раскурить, как свободное время появится). Впрочем, на фоне того, что у CMS без изрядного рефакторинга будущего всё равно нет, этот факт смотрится не особо ярко.
интересно откуда там этот $admin_mode береца?
В PHP программировании (в отличии от структурного) принято все переменные делать глобальными
С одной стороны дурь и блаж с другой очень тонкое использование особенностей языка на других (с которыми я сталкивался) в подобных конструкциях для выбора ветвеления используется только константа и не вкоем случае не строка. А тут однин свич запихали несколько условий. Единственное что мне прямати расмешило это
case $nc_core->inside_admin:
$nc_core->admin_mode = true; три раза код пречитывал так смысл и не увидел.
Остальное хоть как то можно объяснить
Хотя тут же зная особности языка можно использовать что вроде if (z) x=b=c=true; else a=b=false;
Как то так ну может я и ошибаюсь
А присваивание выполняется видимо для явного приведения типа.
таких жестоких свитчей на говнокоде я еще не видел
break; case ()
единственное толковое применение switch(true) - это когда некоторые break - отсутствуют - иногда это может оказатся полезным.
по кодогенерации тысячи манов - кури на здоровье.
думаешь, ритчи от нех делать такой синтаксис использовал?
у тебя есть уникальная возможность создать свой язык с блекджеком и 'правильным' switch
Так что убрать break'и можно только заменив switch на совершенно другую конструкцию (с нормальными блоками вместо case'ов, типа case of в erlang'е), но тогда ни о каких проваливающихся case'ах речи быть не может, и будет такая конструкция просто сахаром над if() else if () else ().
а тут просто ставится отрицание
на условии ставить ли goto endSwitch
и детекшн keyworda break заменяется на детект continue.
мне всегда казалось что компилеры писали, чтоб было удобнее кодить юзающему, а не наоборот
если хочется 'подсластить' if else if.. лучше новую конструкцию ввести (в руби именно такой case)
просто обычное отрицание
continue!=break
другое дело что все уже привыкли
я пока никого и не обвинял)
Switch
case: -> метка, кода на своем месте при компиляции не дает
break -> goto в конец блока
Все просто как кувалда
Switch-без-break
case: -> метка, но компилируется в break, но только если перед ней нет continue
continue -> вообще ничего не делает, но влияет на компиляцию case
И это по вашему не говно-костыль?
на
А в каждом методе логика аналогична той, что в кейзах
UPD: это была первая мысль, @telnet сообщил что не работает. Поздравим неткат с этим.
Добавлять/изменять данные можно как с сайта, а можно в режиме редактирования.
Понятно, что если пользователь добавляет данные в режиме редактирования, то после операции он должен в этом режиме и остаться.
// если пользователь в админке - то он явно в режиме редактирования
case $nc_core->inside_admin:
$nc_core->admin_mode = true;
break;
// тут $admin_mode приходит из формы добавления (в post'e например )
case !$passed_thru_404 && isset($posting): // add (edit) action
$nc_core->admin_mode = $admin_mode;
break;
// через обработчик чпу запрос не проходил, значит пользователь зашел по адресу
мойсайт.ru/netcat/ - это режим редактирования
case !$passed_thru_404: //front-office
$nc_core->admin_mode = true;
// запрос прошел через обработчик чпу - показывается просто страница в обычном режиме
case $passed_thru_404:
$nc_core->admin_mode = false;
То есть любой авторизированный пользователь может переключиться на режим редактирования ( в скрипте тогда будет $admin_mode = 1 ), но это не значит, что он может все поудалять, у него не будет никаких на это прав:
http://netcat.ru/netcat/?catalogue=3&sub=422
Если не секрет, какие?:-) все, что находится в system/ ?
Весь текст ужимается до "NetCat - УГ".
вроде так))
Проверять лень =3