- 1
SELECT users.nick,group.name FROM users,group WHERE user.id='$id' AND group.id=user.group;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−873
SELECT users.nick,group.name FROM users,group WHERE user.id='$id' AND group.id=user.group;
Это мой код. Мне сказали что это говнокод, и порекомендовали спросить здесь.
В чём именно говнокодость, и как надо писать правильно?
Порекомендовал какой то чел с одного форума wapговнокодеров.
Так в чём говнокодость, и как писать правильно? Он там что то про JOIN говорил.
говнокодовость в том, что не по стандарту SQL-95/99. Однако все DB понимают такой диалект.
Так же говнокодовость в том, что может скрывать незнание разницы между RIGHT/INNER/LEFT JOIN.
и все субд (а не базы данных, учим матчасть быстро, решительно) такой синтаксис понимают потому, что не по стандарту, ну-ну, гений, блджад.
http://savage.net.au/SQL/sql-99.bnf.html#table%20reference%20list
потому что соединить и объединить это разные вещи. Перечисление в секции FROM вообще плохой тон. в твоем запросе нельзя использовать ни левое ни правое объединение, только внутренние.
Если хочешь больше критики запости запрос на сайте gavnokod.ru))))
...но это не более чем украшательство, т.к. два данных запроса эквивалентны: из ON парсер переносит условия во WHERE, а запятая и INNER JOIN - это одно и то же.
Короче, камрад. Вместо того чтобы слушать, что тебе сказали хрены с горы, которые сами ни бельмеса не соображают (судя по тому, что они тебе наговорили, между прочим), но лезут в вебдев, лучше набери литературы и сиди разбирайся. И да, это не сайт помощи новичкам. Его тематику ты можешь прочитать вверху страницы.
Страйкер, приди, сделай уже что-нибудь.
за разъяснениями - к EXPLAIN
EXPLAIN SELECT u.login, g.name FROM users u, groups g WHERE u.id = '5' AND g.id = u.groupid
EXPLAIN SELECT u.login, g.name FROM users u INNER JOIN groups g ON .groupid = g.id WHERE u.id = '1'
найдите 10 отличий.
вот зачем давать громкие комментарии не разбираясь в вопросе, или предлагать тест, самому его не проверив.
hint он будет выглядеть точно так же, как и с условиями в where.
за разъяснениями - к EXPLAIN"
А ты тут начал залупоном махать, орать, что это не правда. Кароче говоря сфейлил.
зри в корень дискуссии
p.s. приходилось видеть такие запросы с запятой, где таблиц более 2, ну чем не гамнокод.
2 p.s. поэтому лучше человека щас направить на то, чтобы он начал писать запросы в соответсвии со стандартом.
Ммм... В русском переводе мануала к 4.0 говорится, что для LEFT JOIN и RIGHT JOIN такой перенос выполняется (про INNER JOIN, правда, ни слова). В англоязычном к той же версии этого нет. Косяк переводчиков, что ли...
> для меня более читабельнее и интуитивно понятней будет запрос, когда используется операция с JOIN'ом а не операция "С запятой"
Поддерживаю. В общем-то, это часть того, что человеку недообъяснили на форуме, с которого он пришёл.
ну для самообразования, конечно, полезно, хотя и только в качестве доп.мат.
Сайты для развлечения пишу.. и в такую глубь (haskell(clean), ml, erlang, lisp) погружаться не хочеться.
- надоело бухать|геймить|хней страдать, пойду-ка сайты писать
- надоело бухать|геймить|хней страдать, напишу-ка я убийцу крайзиса/вова/доты/т.п.
а с началом каникул все сильно усугубляется...
Кстати, это не только ирония, но и грустная правда: я видел, как некоторые (коим компутерная грамота, ну, не дано) производят двойной клик: нажимают кнопку, секунду держат, отпускают, через секунду еще раз нажимают, держат секунду, отпускают. И не понимают, что не так, если за это время успевают дрогнувшей рукой сделать драг-н-дроп
Он вроде бы уже устарел? На его основе OCaml и F# уже есть. Или ml лучше своих потомков? Чем-то принципиально отличается?
http://www.mpi-sws.org/~rossberg/sml-vs-ocaml.html
зы: OCaml - более популярен + объектный.
зыы: Использую OCaml в виде F# для всяких тулз.
Типизация в таких языках мощнее банальной ООПной, она покрывает ООП с запасом... Но всё равно суют... Напр. назначение O'Haskell'а мне так и не понятно...
Нахватаются поверхностных знаний и кончают от своего ЧСВ...
ООП в 90% юзается для полиморфизма (чтобы диспатчить по линии родитель-потомок для code-reuse) (syntax-driven-инкапсуляция данных не так важна, один хрен во всяких сиплюсах и явах к полям обращаются через методы-геттеры-сеттеры), а в ФЯ это всё намного обширнее, т.е. ООП можно сказать это частный, скромный случай того, что есть в ФЯ... (с несколько иными акцентами, правда, crucial только для обезьянок типа тебя)
А так же для инкапсуляции и наследования.
Быстро читать википедию, школьник.
>>чтобы диспатчить по линии родитель-потомок для code-reuse
кого диспатчить-то? Ты про передачу событий что ли и паттерн chain of responsibility?
Слышал звон, да не знаешь где он?
Какая же каша у тебя в голове(((
>> т.е. ООП можно сказать это частный, скромный случай того, что есть в ФЯ
дада, сынок, ООП это частный случай ФЯ. А Лондон столица Парижа.
Мне кажется тебе нужно выкинуть из головы всю ту кашу, что ты туда зачем-то накидал, и начать с основ.
Почитать, что такое структурное программирование, чем процедурное отличается от объектно-ориентированного, а императивное от функционального.
Без обид, но с таким маразмом в мозгах ты ничего сложнее hello world не напишешь.
Пора взрослеть
> А так же для инкапсуляции и > наследования.
> Быстро читать википедию, школьник.
Я же выше написал - что инкапсуляция данных мало юзается, один хрен для доступа к данным объекта в основном геттеры/сеттеры используются. Публичные поля объекта - моветон в современном ООП.Что касается наследование, то он тоже редко где на самом деле надо. Главное (что в теории, что на практике) - это полиморфные методы и инкапсуляция вспомогательных методов. Опровергай.
>Слышал звон, да не знаешь где он?
> Какая же каша у тебя в голове(((
Я тебя не понимаю.
> Пора взрослеть
А тебе сколько лет?..
отличный признак говнокода - это наличие геттеров и сеттеров на все поля класса...
наоборт, признак говнокода - прямое обращение, потому что в любой момент логика может поменяться. на эти грабли напр. наступили разрабы моно (или глиба?), они напрямую обращались к полям по всему коду, а потом когда поменялась чуть-чуть логика, пришлось по всему коду выискивать и переделывать (повсюду заменили на сеттеры/геттеры, чтобы потом опять не заниматься тем же).
а если нужны, то где-то произошел архитектурный фейл...
а публик-апи должно быть вынесено в интерфейсы, а там как хотите: прокси, фасады...
Поскольку ты полный null в ООП, то единственное, что ты о нем знаешь, это что не нужно напрямую обращаться к свойствам?
Тоесть красоту архитектуры ты определяешь по тому есть ли аксессеоры/мутаторы, или нет.
А в C#, где проперти скрывает филд -- ты бы убился сразу.
Твои рассуждения выдают в тебе третеклассника.
Это все равно, что сказать что "если в программе нет гоуту -- это хорошая программа".
Почитай что нить про ООП, задолбал уже свое невежество мохровое в сеть изливать.
У тебя глюки? Где я это говорил? Перестань в меня вкладывать левые мысли, сука.
нет, это не говно, это высшая форма я даже не знаю какого говнокода...
Хороший код - это понятный и эффективный код, а не по "тру"-стандартам. В одном место какой-то подход оправдан, в другом он же - полное гумно
вместо кучи геттеров/сеттеров, передавать данные в конструкторы, можно написать метод Init с кучей параметров одновременно и тп.
а класс может и не реализовывать функционал, он может быть просто дата-холдером
В нормальном классе (если это не DTO) 90% свойств -- приватные.
Если у твоего класса все свойства доступны через аксессоры, и все ими пользуются, то одно из двух: или это DTO или это запах кода "envy class" и ты горе-архитектор.
Пойми: если ты не знаешь основ ООП и не умеешь им пользоваться -- это еще не значит что ООП -- говно.
Ну не у всех проекеты из 15ти строк на javascript, как у тебя.
Не всем так повезло.
>>Что касается наследование, то он тоже редко где на самом деле надо. Главное (что в теории, что на практике) - это полиморфные методы
а полиморфизм по-твоему как работает? Без наследования?
И вообще -- открой gang of four, почитай хотя бы пару паттернов (template method например) и узнаешь, зачем наследование нужно.
разуй глаза, я вообще-то я говорил про публичные поля объекта. считается моветоном и вообще непрактичено иметь публичные поля - используют методы-аксессоры (в унылых языках где нет поддержки свойств). А раз так, получается что поля объекта всегда приватные и в отношении интерфейсов идёт акцент на работу с методами. Т.е. ООП на самом деле не ООП, а МОП. Метод-ориентированное программирование, ха-ха. Если все поля реально приватные, то понятия инкапсуляции в этой части перестоит иметь смысл, потому что без сладкого нет горбкого, без горького нет сладкого - а без публичного нет приватного. Понимаешь мысль, баран?
> а полиморфизм по-твоему как работает? Без наследования?
Тьфу ты, я там недописал, я имел в виду наследование объектной части, я не имел в виду переопределение методов.
Моя мысль была к тому, что в ООП крутится реально всё не вокруг объектов, а вокруг методов и о том, как их обобщить на классы. А учитывая что типизация в оопе хуёвая зачастую, не то что всеми нами любимые алгебраические типы, то встаёт вопрос. Классы/типы - хуйня, всё крутится вокруг методов. А почему не начать юзать ФЯ?
> И вообще -- открой gang of four, почитай хотя бы пару паттернов (template method например) и узнаешь, зачем наследование нужно.
выпердыш ебанутых фанатиков этот ваш генг оф фор.
А там нет ООП дерьма. Это вы, обезьяны, без ООП, как без бананов...
и равносильно ли это
object->method();
этому
SomeClass_Method( object );
поэтому можно похоливарить есть ли в линуксе ООП...
по определению, ООП это парадигма. то, что ты пишешь - это синтаксис. Парадигма мало соприкасается с синтаксисом. Вот синтаксис может реализовать какую-то парадигму - но не более чем как "синтаксический сахар". Без синтаксического сахара мы имеем коде конвеншонз.
ООП - это философия (достаточно гадкая), концепция в первую очередь.
Поэтому object->method(); равняется SomeClass_Method( object );
то есть можно смело утверждать что в линуксе есть ООП реализованное методом "синтаксического сахара"?
из каких моих слов это следовало? нет, нельзя утверждать. ты код линукса видел хоть?
void __sched mutex_lock(struct mutex *lock)
void __sched mutex_unlock(struct mutex *lock)
void __sched mutex_lock_nested(struct mutex *lock, unsigned int subclass)
а для ядра ожидать использование ста уровней абстракции просто кретинизм, если мы не хотим получить супермедленную ось. Приоритет удобство программинга\скорость работы тут более сведено к скорости.
Как, кстати и код интерфейса писать на низкоуровневом языке типа ассемблер тоже идиотизм.
2) ядра, на самом деле, не такой уж и большой проект.
Там нет гигантской бизнес-логики, нет сложной доменной модели итд...
Вебкилл, я тебе еще раз говорю: Если ты не умеешь пользоваться ООП -- это не значит что оно не нужно.
13320934 строк кода конечно это вам не сложную бизнес-логику "ЧП Тараканова" написать...
http://upload.wikimedia.org/wikipedia/commons/5/5b/Linux_kernel_map.png
Ты сложность кода меряешь количеством строк?
Тоесть какой-нить DOS 2.0 сложнее чем система для торговой площадки на бирже потому, что DOS 2.0 писали на асм и строк кода там больше?
Иди, почитай что такое "доменная модель", вонючка
Тоесть какой-нить DOS 2.0 сложнее чем система для торговой площадки на бирже потому, что DOS 2.0 писали на асм и строк кода там больше?
Ну ты сравнил бля, код на яве и код на асме. Я-то тут вообще о си говорю. В правильном написании си-код примерно кореллирует с твой любимой яве в отношении строка/смысл (учитывая что в яве чтобы ввести одну небольшую сущность нужно по фаулерам и прочим пидарасом ввести три фабрики, семь адаптаров и ещё дохуя мусора -в стиле "программистов"-маркетологов бля).
Давай не в строчках кода, а в стоимости на переписку с нуля. Линукс стоит разработать 1.4 миллиардов долларов. А твой софт для магазина подсвечников сколлько?
Ынтерпрайз - уныло и для кодообезьянок
нет, просто потому что форсированный ООП там просто не нужен. ты прикинь.
Поищи в инете на эту тему, много нового для себя откроешь.
А некоторые куски кода оттуда можно прямо на этот сайт выкладывать, отборное говно.
нет, ты не прав. ядре линукса нет c++ потому что он там не нужен.
Поищи в инете на эту тему, много нового для себя откроешь.
> А некоторые куски кода оттуда можно прямо на этот сайт выкладывать, отборное говно.
дерзай, чё! жду с нетерпением.
а с++ поделия тоже текут. почему?
на самом деле, в ядре НЕ ДОЛЖНО быть сложной логики и сервисных методов - ничего лишнего. Это должно выноситься в юзер слой в виде библиотек
У вебкила простая логика: чем больше строк -- тем сложнее логика. Вон он в меня кол-вом строк в ядре пихал.
Логика всегда должна быть простой. Если она сложная - то где-то в цепочке оказался пидарас.
KISS :*
и наоборот, ОСь не может быть простой по определению.
Хотите доказать свое? напишите, тогда поверим. А брызгать здесь слюной и минусовать если не согласны излишне
у осей логика тоже простая. сложного там - только борьба с хардварным быдлосхемингом (айбиэм-писи-хардваре спроектировано индусами)
пзц, вебкил, ты бы хоть почитал что ли что нить про компутеры...
а то как рот откроешь -- так хоть стой, хоть падай
Во вторых что такое $id?
Это в каком-то database-access-layerе указывается параметр, и потом Вы делаете "setParam"?
Или это конструкция наподобии
?
Второй вариант ужасен, и делать так не нужно.
И наконец почему у Вас пользователи в множественном числе, а группы -- в единственном?
Или переписал с использованием ActiveRecord:
Вообще завязывай с mysql_query() - эта функция была создана во времена PHP3 для MySQL 3.x.
Безопаснее и эффективнее пользоваться таким приёмом:
http://ithappens.ru/story/2568
Сейчас бы так написал
Но как понял из всего вышесказанного, надо писать так
Все сказки про "переносимость SQL" -- именно что сказки
А хранимки УГ :)
Да ну? Это как? ORM юзать что ли?
Глупости-то не надо говорить
но я говорил про генераторы запросов, которые могут выступать частью ORM, а не выступать в роли замены.
в чем глупость то?
но в этом то и плюс
посмотрел бы я как вы код с хранимками будете между MySQL, MS SQL, Postgres, Oracle DB, etc переносить
Вызываешь процедуру "getUserById(12)" , и получаешь инфу о юзвере
а для переносимости - есть куча абстрактных слоев
молодцы
И что-то мне подсказывает ты тоже из этих 95%.
люди, обыкновенные люди (ц)
А обыкновенные люди ходят по коврам в сапогах, не попадают в писуар, и игнорируют такие изобретения как туалетный ёршик и освежитель воздуха.
Видите аналогию?
реинакрнация капитана?