Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   ООП головного мозга (https://javascript.ru/forum/server/34095-oop-golovnogo-mozga.html)

Gozar 20.12.2012 11:30

ООП головного мозга
 
Наткнулся тут на CodeIgniter и мне это напомнило ООП головного мозга.

public function getData($id = 0, $offset = 0, $limit = 30) {
  $result =  $this->db->select('table1.id, table2.name')
                      ->from('table1')
                      ->join('table2', 'table2.id=table1.id', 'left');
  if ($id) return $result->where('table1.id', (int)$id)->limit(1)->get()->row();
  return $result->limit($limit, $offset)->get()->result();
}


SQL на выходе:

"SELECT table1.id, table2.name
FROM table1
LEFT JOIN table2 ON table2.id = table1.id
LIMIT 10, 30"


ЗАЧЕМ?

Чтобы не учить синтаксис SQL? Неужели он настолько сложный, что нужно делать новый язык и возможно забивать на мощь самого sql ограничивая его собственной реализацией?

Да, я долго обходился простыми запросами, но доучить join-ы и прочую мелочь не составило труда. Стоило прочитать на досуге пару страниц.

Не, я не понимаю.

Sanda 20.12.2012 11:52

Вероятнее, для того, чтобы иметь возможность не задумываться над правильной обёрткой user-defined данных. Чтобы не заморачиваться над тем, как вычесть два месяца из данной даты. Чтобы не строить трёхэтажную конкатеацию строки в зависимости от различных условий, а обходиться более привычными конструкциями. Чтобы иметь один(!!!) синтаксис для обращения к любой реляционной базе данных, будь она MySQL, MSSQL или Oracle.
Ну, то есть это должно быть в правильной реализации подобных вещей. Судя по ->limit, тут только обёртка над MySQL, и тогда подобное нечто теряет глубинный смысл. Лучше реализовать java-like PreparedStatement и на этом успокоиться.
P.S. Если что, я вообще-то большой любитель трёхэтажных запросов с использованием оконных функций, cte и прочей sql-ной радости (: Но подобные обёртки иногда сильно уменьшают количество требуемых проверок в простых запросах.

Shaci 20.12.2012 12:09

причем похоже, что синтаксис SQL все равно надо знать, чтобы составить запрос такой

Gozar 20.12.2012 13:26

Цитата:

Сообщение от Sanda
Чтобы не заморачиваться над тем, как вычесть два месяца из данной даты.

Это делается с помощью встроенных в sql конструкций. Нет там заморочек.

Цитата:

Сообщение от Sanda
Чтобы иметь один(!!!) синтаксис для обращения к любой реляционной базе данных, будь она MySQL, MSSQL или Oracle.

Зачем? Эта идея - бредовая. Можно настоящий(реальный) пример, где это помогло в работе? А лучше три таких примера!

Такие реализации только добавляют ненужные тормоза в программу. И в какой-то момент точно не подойдут или не смогут решить ту или иную задачу. В этот момент и возникает вопрос - wat?

Sanda 20.12.2012 14:02

Повторюсь про отсутствие необходимости обёртки пользовательского ввода. Это действительно очень удобно.
Пример из жизни: проект начинался под неким фреймворком, который изначально разрабатывался под Oracle. Под него было сделано N моделей и прочей полезной лабуды. После чего выяснилось, что заказчику очень нужен MSSQL, "потому что одна наша база уже там крутится, вдруг интегрировать будем". Вместо переписывания килотонн кода потребовалось доработать фреймворк, чтобы он кушал чужой синтаксис.
Ещё двух примеров, к сожалению, пока привести не могу (:
По поводу дат - да, действительно, есть встроенные конструкции. С одной проблемой - в каждой БД они свои. Я, как MSSQL-щик, испытываю большие трудности, когда мне приходится общаться с MySQL-ными датами, потому что привык работать с dateadd, datediff и прочим своеобразным синтаксисом.
Разводить холивар не буду. Добавлю только, что любому такому врапперу обязательно нужна функция execQuery - именно для того, чтобы конструкции языка можно было применять в полной мере.
Ещё раз повторюсь, что я сам с удовольствием пишу длинные запросы в виде текста, "потому что так удобнее и быстрее". Но плюсы для начинающих юзеров в таком подходе, несомненно, присутствуют.

Gozar 20.12.2012 15:39

Выносим запросы в методы и не нужно менять килотонны кода. Даже на сложный проект запросов получается не так уже много. Зато мы имеем бонус в виде скорости.

Поэтому не убедил.

Shaci 20.12.2012 16:08

Цитата:

Чтобы иметь один(!!!) синтаксис для обращения к любой реляционной базе данных, будь она MySQL, MSSQL или Oracle.
знаю, в RoR используется active record,
http://ru.wikipedia.org/wiki/ActiveRecord

Например
part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()

создает новую запись в таблице parts с данными значениями
и нам не важно, какая БД у нас используется, Mysql или MongoDB

Что-то в этом есть

Антон Крамолов 20.12.2012 17:12

в этих фреймворках полно нагромождения подобных конструкций, единственное для чего позвалительно написать обертки это для INSERT, UPDATE и DELETE

$db->insert('t', $arr)
$db->update('t', $arr)
$db->delete('t', $id)

micscr 20.12.2012 20:07

Цитата:

Сообщение от Gozar (Сообщение 222560)
Выносим запросы в методы и не нужно менять килотонны кода. Даже на сложный проект запросов получается не так уже много. Зато мы имеем бонус в виде скорости.

Поэтому не убедил.

В друпале тысячи строк с запросами. SQL в базах данных отличается.
И чтобы один и тот же код работал с разными БД нужна прослойка.

Раньше в друпале она была процедурная, а сейчас, после pdo, типа такая как ты привел.

Зато можно сайт запустить на какой хочешь базе данных - sqllite, mysql, postgresql, ...

Tim 20.12.2012 23:45

Цитата:

ЗАЧЕМ?
Представь что в зависимости от некоторых условий нужно слегка изменить запрос. Например добавить сортировку или WHERE. Как поступишь со своим лесом из точек и кавычек?

Для простых запросов можно юзать ->query("SLECT ....")
(Это в Zend, в CodeIgniter думаю тоже есть что то подобное)

Хочется ещё более высокого уровня абстракции - ORM к вашим услугам. В Yii мне нравится его использовать. В Zend своего нету, но можно доктрину прикрутить. Про CodeIgniter не знаю.

Цитата:

И чтобы один и тот же код работал с разными БД нужна прослойка.
+1

Цитата:

SQL на выходе:
да, красиво. но мы о PHP. перепиши код на чистый php и посмотрим что получится

Gozar 21.12.2012 01:47

Цитата:

Сообщение от Tim
Представь что в зависимости от некоторых условий нужно слегка изменить запрос. Например добавить сортировку или WHERE. Как поступишь со своим лесом из точек и кавычек?

Ответ содержится в вопросе. Добавлю сортировку или where. При чем тут лес из кавычек? SQL синтаксис родной для SQL.

Да, да, в идеале переносимость на всё и вся. Всё и вся всеядность. В итоге тормоза и завышенные требования к хостингу. Это работает медленно. И медленно из-за этого всё и вся.

А вся эта переносимость от неправильной постановки задачи и методов её решения.

Tim 21.12.2012 10:19

Тогда всё можно на асме писать вообще.

Суть в более высоком уровне абстракции, не только в переносимости.

Цитата:

Добавлю сортировку или where. При чем тут лес из кавычек?
Да, в простом случае всё просто. По мере добавления всяких условий и тп мы получим именно лес из точек и кавычек.

$where = array();
		$where[] = '`cpu` LIKE "'.$url.'%"';
		$where[] = '`id`!='.$id;
		if(!empty($item_catids)) 
			$where[] = '`i2c`.`cat_id` IN ('.implode(',',$item_catids).')';
		$query = 'SELECT `cpu` FROM `'.$kernel->pub_prefix_get().'_catalog_'.$kernel->pub_module_id_get().'_items` `items`'
					.'JOIN `'.$kernel->pub_prefix_get().'_catalog_'.$kernel->pub_module_id_get().'_item2cat` `i2c` ON `i2c`.`item_id`=`items`.`id`'
					.'WHERE '.implode(' AND ',$where);
		$result = $kernel->runSQL($query);
		while($row = mysql_fetch_assoc($result))
			$cpu_list[] = $row;

Неужели такой стиль лучше?

micscr 21.12.2012 11:11

Tim, а ты yii знаешь?
Что то начал его смотреть, та официальная документация что на их сайте - это что, - все описание что есть? Типа этого должно хватить для освоения?

Tim 21.12.2012 11:40

micscr,
Немного знаю теперь. У нас проект один на Yii, пришлось разбираться.

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

С документацией действительно не оч хорошо всё. Ещё есть сайт русскоязычного сообщества http://yiiframework.ru/.
Там есть пример создания блога http://yiiframework.ru/doc/blog/ru/start.overview

Ещё есть API

Gozar 21.12.2012 11:43

Цитата:

Сообщение от Tim
мы получим именно лес из точек и кавычек.

01	$where = array();
02	        $where[] = '`cpu` LIKE "'.$url.'%"';
03	        $where[] = '`id`!='.$id;
04	        if(!empty($item_catids))
05	            $where[] = '`i2c`.`cat_id` IN ('.implode(',',$item_catids).')';
06	        $query = 'SELECT `cpu` FROM `'.$kernel->pub_prefix_get().'_catalog_'.$kernel->pub_module_id_get().'_items` `items`'
07	                    .'JOIN `'.$kernel->pub_prefix_get().'_catalog_'.$kernel->pub_module_id_get().'_item2cat` `i2c` ON `i2c`.`item_id`=`items`.`id`'
08	                    .'WHERE '.implode(' AND ',$where);
09	        $result = $kernel->runSQL($query);
10	        while($row = mysql_fetch_assoc($result))
11	            $cpu_list[] = $row;

Что это за каша? Я такой код года два не видел.

Цитата:

Сообщение от Tim
Неужели такой стиль лучше?

Это вообще не стиль.

Почитай про pdo что ли. Раз уж ты используешь $kernel->, зачем использовать mysql_fetch_assoc, а не $s->fetch(). Как минимум ты будешь в одном стиле писать, про комбу в рукаве я вообще молчу.

Tim 21.12.2012 11:57

Цитата:

Почитай про pdo что ли.
Читал, не вдохновило.

Цитата:

Раз уж ты используешь $kernel->, зачем использовать mysql_fetch_assoc
Не я. Я сам в шоке с этого кода.

Цитата:

про комбу в рукаве я вообще молчу
Расскажи пожалуйста. Я что то не в теме.

Tim 21.12.2012 15:57

micscr,
вот ещё в догонку http://yupe.ru/ . Вроде прикольная штука. Сегодня только нашёл её

micscr 21.12.2012 21:42

спасибо, гляну, а то что то с первого взгляда немного разочаровало, т.к. объясняется система имхо плохо.
Хотя может мне непривычно, я друпалил до этого, там все по другому, но друпал для программиста идет куда то непонятно куда :(

Tim 21.12.2012 22:09

micscr,
фреймворк достаточно интересный. да, документация такая что хочется всё бросить

Tim 21.12.2012 22:41

micscr,
Я даже знаю людей писавших пару лет на CodeIgniter и попробовавших Zend но потом остановившихся на Yii. Сам я больше к Zend склоняюсь. Хочу ещё Symfony попробовать.

Цитата:

но друпал для программиста идет куда то непонятно куда
можно подробнее? я просто тоже хотел попробовать

melky 21.12.2012 22:44

Цитата:

Сообщение от Gozar
Чтобы не учить синтаксис SQL? Неужели он настолько сложный, что нужно делать новый язык и возможно забивать на мощь самого sql ограничивая его собственной реализацией?

вы что??? декларативный язык (SQL) в моём PHP ?!

Цитата:

Сообщение от Gozar
Зачем? Эта идея - бредовая. Можно настоящий(реальный) пример, где это помогло в работе? А лучше три таких примера!

м-м. только ради удобной смены базы данных. micscr ответил.

Gozar 21.12.2012 22:48

Цитата:

Сообщение от melky
только ради удобной смены базы данных

Бывает. Мне за 7 лет писанины не приходилось прыгать ни разу с базы на базу. Буду считать, что мне повезло. ;)

Shaci 21.12.2012 23:16

Цитата:

Сообщение от Gozar (Сообщение 222828)
Бывает. Мне за 7 лет писанины не приходилось прыгать ни разу с базы на базу. Буду считать, что мне повезло. ;)

всякое возможно

melky 22.12.2012 00:26

Цитата:

Сообщение от Gozar
Бывает. Мне за 7 лет писанины не приходилось прыгать ни разу с базы на базу. Буду считать, что мне повезло.

действительно, я не могу понять, они что, так часто меняют базы?

остаётся один вариант - непереносимость к декларативному программированию.

micscr 22.12.2012 10:22

Цитата:

Сообщение от Tim
можно подробнее? я просто тоже хотел попробовать

1) друпал спрограммирован достаточно сложно (т.к. замахнулся на большое) и поэтому понимать как кодить под него довольно долго
2) Раз в 2 года они меняют апи, и надо переучиваться. Старые наработки уже не пашут. 8-я версия уже как то с Симфони будет связана.
3) Там смысл что нужно сайт собирать по максимуму модулями. Я приводил пример той сборки, помнишь? В этих всех тонкостях тоже долго разбираться и это ни разу не программирование. Многие даже толкают религию, что в друпал сайте вообще не должно быть "своего" кода от программиста, а только модули с drupal.org. Вот, если не лень читать, недавние бурления.

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

Вон yii я смотрю до 2015 продлили поддержку текущей версии, прям как прозрение.

Но зато у друпала есть классная админка, через которую владелец сайта может очень мощно управлять контентом сайта и настройкой сайта. И куча модулей, готовых к работе, подключением из админки.
А у yii есть что то для админки сайта?
А то мне этот момент не ясен, в друпале самая масса усилий потрачена именно на реализацию админки и идей управления контентом, а в yii что самому писать все? Хотя бы управление синонимами, метатегами, титлами, блоками,... ?

Tim 22.12.2012 10:56

Цитата:

Я приводил пример той сборки, помнишь?
не, не помню

Цитата:

а в yii что самому писать все?
думаю да. это же framework а не CMS. Я приводил ссылку в предыдущем посте на Юпи. Можно попробовать поискать CMS на Yii. Вроде что то должно быть. Я сам сейчас обычную CMS использую. Дальше думаю перейти на CMS на фреймворке, в идеале на Zend. Или самому выпилить админку и потихоньку запасаться модулями.

Сейчас пока CMS на фреймворк поставлю. Кусок кода который я привёл как раз из неё )) Нужно что то с этим делать

Gozar 22.12.2012 11:01

Цитата:

Сообщение от micscr
в друпал сайте вообще не должно быть "своего" кода от программиста

Друпал для друпал гиков. :)

must die.

Gozar 22.12.2012 11:03

Цитата:

Сообщение от Tim
Кусок кода который я привёл как раз из неё ))

Круто.

Цитата:

Сообщение от Tim
выпилить админку

Мухаха. Выпили из друпала.

Gozar 22.12.2012 11:09

Хватит засирать мою тему мусором про друпал, с которым было все понятно ещё лет пять назад.

Скоро перепишу ядро и может поделюсь с миром своей админкой. Дизайн уже полностью проработан и переделываться не будет, только улучшения и добавление модулей.

Паттерн core есть у кого-нибудь с протоколом?

micscr 22.12.2012 11:29

Цитата:

Сообщение от Tim
не, не помню

Вот

micscr 22.12.2012 11:44

Цитата:

Сообщение от Gozar
Хватит засирать мою тему

А что не так с твоей темой?
Ты спросил вопрос, тебе на него ответили, объяснили зачем так сделано. Тема закрыта.

Gozar 22.12.2012 11:46

Давай я под итожу:

Цитата:

Сообщение от micscr
может быть сложней кодинга с нуля.

Цитата:

Сообщение от micscr
те кто научились так настраивать - они понимают. Этому надо учиться и немало.

Цитата:

Сообщение от micscr
Старые наработки уже не пашут.

Цитата:

Сообщение от micscr
Раз в 2 года они меняют апи, и надо переучиваться.

Цитата:

Сообщение от micscr
Старые наработки уже не пашут.

Цитата:

Сообщение от micscr
зато у друпала есть классная админка, через которую владелец сайта может очень мощно управлять контентом сайта и настройкой сайта

Цитата:

Сообщение от micscr
Раз в 2 года они меняют апи, и надо переучиваться.

Цитата:

Сообщение от micscr
Старые наработки уже не пашут.

Продукт сырой и слишком сложный, чтобы на его базе строить что-либо, так как любой апдейт убивает предыдущий функционал. :lol:

Будем ждать продолжения банкета.

Tim 22.12.2012 11:57

Цитата:

Сообщение от Gozar (Сообщение 222861)
Мухаха. Выпили из друпала.

Сказал человек и продолжил пилить свой велосипед который далеко не фак что будет лучше друпала.

Gozar 22.12.2012 12:09

Цитата:

Сообщение от Tim
велосипед который далеко не фак что будет лучше друпала.

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

Сама админка написана давно. Она лишь версии меняет.

x-yuri 22.12.2012 12:17

builder'ы позволяют разбить создание запроса на несколько функций. Например, у меня все запросы создаются (build) в моделях, а в вызывающем коде:
m('user')->select(
    ['deleted' => FALSE,
    'has_login_role' => TRUE,
    'select_n_images' => TRUE,
    ...
    'offset' => ...,
    'limit' => ...,
    'order by' => ...]);


ORM мне самому не нравятся. Обычно через непродолжительное время наступает момент "извините, но в данной ORM это не возможно". И код у них обычно сложный. Единственный "завершенный" вариант, который я видел - Entity Framework (MS). Но он статический, а мне это как минимум непривычно.

Абстракция от БД - миф. При переходе на другую БД в любом случае надо будет просмотреть все запросы. Если ты не используешь Entity Framework.

Цитата:

Сообщение от Gozar
Такие реализации только добавляют ненужные тормоза в программу.

Тебе не нужен ORM/builder'ы или ты так думаешь. Зачем приплетать к этому какие-то тормоза? Я в свою очередь мог бы сказать: "Мой ООП код так же тормозит как твой процедурный код". Не важно, что при 1000000 тысячах итераций ООП-страничка отобразится медленнее, чем процедурная страничка. Важен компромисс между удобством разработки, скоростью разработки и производительностью. Ведь цель - создать сайт, а не абстрактно ускорить сайт, м? Но можем попробовать написать небольшой сайт, ты на своем фреймворке, я на kohana. Сравним... В прицнипе есть еще php fat-free framework, но тогда скорее всего в моем коде будет недостаточно ООП.

По поводу документации, в kohana ее наверное не очень много. Хотя сейчас наверное документации больше. Они по этому поводу сильно не парятся. Говорят, что чтобы использовать kohana нужно быть готовым заглядывать в исходный код. Код хороший и с комментариями. У меня проблем не было. И мне нравится эта позиция - отсеивает лишних кандидатов. Либо с другой стороны, учит нужных кандидатов.

Gozar 22.12.2012 12:27

Цитата:

Сообщение от x-yuri
Зачем приплетать к этому какие-то тормоза?

Это была не главная мысль, а лишь следствие. Можно было не акцентировать на этом внимание.

Основная была:
Цитата:

Сообщение от x-yuri
Абстракция от БД - миф


x-yuri 22.12.2012 12:49

Цитата:

Сообщение от Gozar
Это была не главная мысль

ну я все равно немного дополню, для полноты картины. Мне самому не нравится Zend и java/c# мне кажутся излишне сложными. Но может им так лучше... Важно адекватно выбирать инструменты: не нужно - не используй, нужно - используй.

p.s. по поводу производительности
Цитата:

Сообщение от Дмитрий Бородин
[5] Highload и архитектура крупного проекта - это особый вид решения задачи. Это вообще не программирование, в традиционном понимании. Например, забудьте, что вы эксперт по EXPLAIN. Он вам практически никогда не понадобится, т.к. в хайлоде применяются только примитивные запросы, типа SELECT по primary key. Много вещей, знанием и опытом которых вы гордитесь, как гуру программирования - не нужны! Голова - да, нужна.

Необходимо думать на этапе проектирования о важных вопросах. И не нужно - о несущественных вопросах: какой язык программирования выбрать, какую базу данных. Особо глупый вопрос - какой фреймворк выбрать, например, на PHP их десятки (доказательства - позже). Так же неважно, какую базу данных выбрать, т.к. мы будем использовать 1% ее возможностей, примитивные SELECT/UPDATE. Уважаемые авторы MySQL и PostgreSQL чуть ли не дерутся за графики мультитредовой производительности на всяких конференциях DevConf и Highload++, только забывают мелочь - в хайлоде это не интересно (т.е. не самое важное). Ну, нет у нас сложных запросов или критических нагрузок на один инстанс.

Первые шаги на правильном пути - осознать несущественность этих вопросов и спроектировать каждый из компонентов проекта горизонтально масштабируемым. Сложно объяснить, что именно делать. Зато легко показать, каким глупостям не нужно уделять внимание. Относительно выбора между MySQL и PostgreSQL: наша задача сделать так, чтобы ни на одном SQL инстансе, какой бы общей нагрузка ни была, не случился затык по производительности. Мы просто покупаем новый сервер и нагрузка сама перетекает туда. Вы достигли этого состояния? Тогда смело плюйте на графики производительности, вы - выше этого!

http://spb-borodin.livejournal.com/596.html
http://spb-borodin.livejournal.com/779.html

Tim 22.12.2012 13:00

Цитата:

Абстракция от БД - миф
Ну и отлично. А где тормоза? Лишние классы для не нужных БД просто не подключатся и всё.
В принципе я согласен что это не нужно, но и вреда от этого не много.

Цитата:

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

Я вообще о БД как то не задумываюсь. Мне достаточно удобно с ней работать и всё. Может быть то что возникла такая тема говорит о том что ТС не удобно работать с БД в таком стиле в каком он сейчас это делает? .....

Цитата:

Хватит засирать мою тему
Извини. Просто она не очень интересна. Я реально не думаю о том как я работаю с БД.

Gozar 22.12.2012 13:02

Цитата:

Сообщение от x-yuri
p.s. по поводу производительности

По поводу своего сервера(ров) и горизонтальной масштабируемости понятно.

Другое дело, когда мы берем 40 дешевых и средних хостингов от разных компаний и вешаем на них какое-нибудь друпал или ещё что-то подобное и на 39 из них будут тормоза.

Да если с сайтом не работать то тормозов не будет, но если начинаешь выращивать на таком хостинге проект из 50 человек в день на 10000 - 100000 и с ним ещё нужно работать через админку, то всё становится гораздо печальней.

И первый вопль - бабла дай! На сервер, хостинг ...

По поводу окупаемости да, хостинг легко окупится, а кто окупит программистов, операторов, фотографов и т.д.

Идея разворачиваемости приложения за кратчайшие сроки хороша, но нужна не только идея быстроты разворачиваемости, но и схема затраты/скорость/расширяемость/окупаемость. И там где нужна скорость ООП и шаблонизаторы идет лесом. Как и по цитате выше.

Tim 22.12.2012 13:06

P.S.: я ещё не дорос до Highload


Часовой пояс GMT +3, время: 21:49.