SmartDB - умный драйвер СУБД.

Статус
В этой теме нельзя размещать новые ответы.

Frol

Новичок
Та же история с квики, те кто код не понимает, чтобы скрыть собственное невежество ругают код, хотя код не может быть понятным и непонятным, т.к. это код.
на досуге открой картинку в блокноте, правда мало отличий от твоего кода? :]
Он не может врать.
если мне начнет что-то рассказывать японец, я сомневаюсь, что смогу понять врет он или нет.
Не знаю как вы, а я люблю код за быстроту и четкость выполнения задачи, а на наличие комментариев мне плевать, я их не читаю, т.к. написать в комментариях можно что угодно... проще прочесть код, это наилучший комментарий.
я тоже редко читаю, и пишу их не часто. собственно, я не пропагандирую за комментарии. ты меня с кем-то перепутал.
Можно написать:
...
А можно:
...
Или
...
да, особенно все три вида подряд. а если в одну строчку -- то вообще восхитительно.

Насчет скорости - Frol посетовал на то что у меня много кода в одном методе.
не я. но я тоже посетовал бы, если б смог разглядеть в коде методы.
 

Alexandre

PHPПенсионер
за такой код надо лишать зарплаты
ничего, скоро научится правильно кодить. Для 17 лет - вполне приемлемо. Ему бы в хорошую команду попасть.
те кто код не понимает, чтобы скрыть собственное невежество ругают код, хотя код не может быть понятным и непонятным
Собственно, как писал Фаулер, код должен быть понятным не машине, а программисту.
WP, а вот флейм по замечаниям ты зря развел. книга Рефакторинг - мне очень помогла.
и еще хорошая книга: Анализ программного кода

PS. мой код - тоже не идеален... я стараюсь воспринимать критику. Хотелось бы в адрес больше критики, а не оскарблений.
 

WP

^_^
Alexandre
> ничего, скоро научится правильно кодить...
Смеялся.

-~{}~ 17.02.08 20:27:

джамшут
Спасибо за ссылку, но это мало имеет отношения к жизни.
 

ustas

Элекомист №1
WP
Для разнообразия можно писать ногами(большим пальцем правой ноги), будешь программистом с нод до рук ;)
 

FractalizeR

Новичок
Автор оригинала: WP
Alexandre
> ничего, скоро научится правильно кодить...
Смеялся.
Думаю, лет через пяток ваш юношеский максимализм перестанет так сильно над вами довлеть... А до тех пор можно смеяться :)
 

джамшут

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

fixxxer

К.О.
Партнер клуба
WP
ну у тебя реально код сложно читается, поверь ;)
я понимаю что тебе так удобно/привычно, но при работе в команде обычно принято более каноническое оформление ;)
ну и методы некоторые неприлично длинные
 

FractalizeR

Новичок
Автор оригинала: fixxxer
WP
ну у тебя реально код сложно читается, поверь ;)
я понимаю что тебе так удобно/привычно, но при работе в команде обычно принято более каноническое оформление ;)
ну и методы некоторые неприлично длинные
Согласен. Большая часть имен переменных состоит из одной буквы:
PHP:
public function prepare_mixed($mixed,$mode = 1)
 {
  if (is_array($mixed))
  {
   if ($mode == 1 || $mode == 2)
   {
    $r = '';
    $s = sizeof($mixed);
    $i = 0;
    foreach ($mixed as $k => $v)
    {
     if (!ctype_digit((string) $k)) {$as = $v; $v = $k;}
     else {$as = '';}
     if (strpos($v,'.') !== FALSE)
     {
      $e = explode('.',$v);
      $r .= '`'.$e[0].'`';
      if (isset($e[1])) {$r .= '.`'.$e[1].'`';}
      if (isset($e[2])) {$r .= '.`'.$e[2].'`';}
     }
По этому поводу все хорошо расписано Макконнелла в Совершенном коде.

-------------------------------------------------------

Достаточно странные соглашения об именовании методов...
PHP:
 public function _restore_memorycache($p)
<...>
PHP:
public function fetchRowset()
Обычно с _ начинаются имена внутренних методов. protected или private. Регистр в первом случае почему-то отличается от второго. Логичнее было бы ожидать (_restoreMemoryCache и fetchRowset) или на худой конец (_restore_memorycache и fetch_rowset) но не такой разнобой.

-------------------------------------------------------

На мой взгляд, неудачно реализован механизм кеширования. Из-за кучи этих
PHP:
if ($this->query->cacheStorage == 'memory')
я не могу просто взять и легко добавить свой собственный механизм кеширования.
PHP:
if (defined('SMARTDB_MYSQL_LOADED')) {
return self::$db = new SmartDB_mysql();
Почему бы не воспользоваться include_once вместо череды if, проверяющей, доступны ли функции?

-------------------------------------------------------

PHP:
public function begin() {
    return $this->query('BEGIN');
}
Если движок претендует на универсальность по отношению к серверам баз данных, я бы назвал этот метод startTransaction, согласно стандарту, чтобы не смущать разработчиков. BEGIN - это чисто MySQL вариант.

-------------------------------------------------------

PHP:
$query = 'SELECT' . ($this->type !== '' ? ' ' . $this->type : '') . ' ' . $this->prepare_mixed(
$this->fields, 1) . ($this->from !== NULL ? ' FROM ' . $this->prepare_mixed(
$this->from, 2) : '') . $join . ($this->where !== NULL ? ' WHERE ' . $this->prepare_mixed(
$this->where, 3) : '') . (($this->limit !== NULL || $this->offset !== NULL) ? ' LIMIT ' .
($this->offset > 0 ? $this->offset . ',' : '') . $this->limit : '');
Долго смотрел на это и понял, что мне так не написать...

-------------------------------------------------------

Никаких абстрактных классов или хотя бы интерфейсов. Т.е. написать драйвер под другой тип БД без автора невозможно (вернее, конечно, возможно, но не рентабельно), поскольку код ВООБЩЕ не документирован.

-------------------------------------------------------
PHP:
function flock_wait($fp, $lock) {
			if ($fp === FALSE) {
				return FALSE;
			}
			while ( TRUE ) {
				if (flock($fp, $lock)) {
					return TRUE;
				}
				usleep(100000);
			}
		}
Эта реализация меня немного удивила. У flock есть третий параметр, который можно установить в 1, чтобы вызов flock оказался блокирующим скрипт на время, пока блокировка не освободится. Тут же мы видим цикл, отнимающий время процессора (несмотря на usleep).

-------------------------------------------------------

PHP:
$t2 = unpack('Nl', substr($r, $seq + 8 * $i + 4, 4));
Собственный механизм сериализации (если я правильно понял код) - это здорово. Но вот сложный он очень... Попробовать бы сравнить его по скорости с serialize...

-------------------------------------------------------

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

-------------------------------------------------------

Интегрировать в движок, скажем, профайлер или логгер slow-queries будет довольно трудно....

-------------------------------------------------------

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

WP

^_^
Если движок претендует на универсальность по отношению к серверам баз данных, я бы назвал этот метод startTransaction, согласно стандарту, чтобы не смущать разработчиков. BEGIN - это чисто MySQL вариант.
Согласен, сделал.
Интегрировать в движок, скажем, профайлер или логгер slow-queries будет довольно трудно....
Профайлер это дело не драйвера, а логгер slow-queries есть в СУБД.
Собственный механизм сериализации (если я правильно понял код) - это здорово. Но вот сложный он очень... Попробовать бы сравнить его по скорости с serialize...
Друг, у тебя нет температуры? Это не механизм сериализации. Сериализация подразумевает чтение всей последовательности, т.к. позицию того или иного элемента установить нельзя пока не прочтешь все что до него. По скорости даже близко не стоит.
Сложный это для твоего понимания, а для машины он очень простой.
> Почему бы не воспользоваться include_once вместо череды if, проверяющей, доступны ли функции?
Потому что нужно создать экземпляр класса (объект), от класса чье название неизвестно. Можно конечно сделать два файла, один mysql5.driver.php, а другой mysql5.driver.loader.php.. но я сделал одним.

> я не могу просто взять и легко добавить свой собственный механизм кеширования.
Почему не можешь? Можешь.
> В целом, код показался мне писанным с тем расчетом, что его никогда никто не будет читать, а тем более использовать.
Это не так.

з.ы. люди, подумайте сами... если подстраиваться под когнитивный аппарат каждого человека который может открыть код... получится жутко медленное громоздкое решение на которое из-за этого никто и внимания не обратит. принятие в рассчет ламеров - регресс. имхо, лучше написать быструю библиотеку, пусть и не всем понятную, а в код если непонятно и не надо лезть, можно сообщить автору об идеи нововведения (изменения).
fixxxer
Охотно верю :) Но я его пишу не с целью сделать каждому понятный код с кучей комментариев и описанием всей логики, а с целью быстрого и удобного решения поставленной задачи (конструирование динамических запросов и кеширование). Метод должен быть настолько длинным, насколько этого требуется, не понимаю каких-то ограничений. У меня есть метод и 50 кб (в клиенте аськи), и ничего - работает отлично, отвечает за генерацию SNAC-пакета.

-~{}~ 18.02.08 09:08:

з.ы. проект делается не ради мира во всем мире, а в первую очередь ради конкретных _работающих_ проектов, opensource его сделал т.к. не жадный, да и авось предложат что-нибудь дельное, две головы лучше чем одна.
 

atv

Новичок
Думаю, лет через пяток ваш юношеский максимализм перестанет так сильно над вами довлеть...
[offtop]
По этому поводу вспоминается замечательный мультик. Сидят в помещении китаец учитель и два китайца ученика. Ученики набивают руку о каменные плиты. Ту появляется расфуфыренный европеец, весть такой из себя каратист, и высокомерно так смотрит на занятие китайцев. Ухмыляется и начинает показывать свои умения. Китайцы на него ноль внимания. Тогда европеец начинает всё кругом крошить, и в конце концов развалил здание. Китайцы продолжают безмятежно заниматься своим делом. Тогда европеец хватает себе такую же плиту и ударяет по ней. О удивление, плита не поломалась. Ещё удар, следующий, ногой. Плита не поддаётся. Тогда европеец замахивается головой, и со всей силы бъёт лицом в плиту. Пауза. Европеец поднимает голову, плита прилипла к лицу. Наконец плита отпала и... встречайте ещё одного китайца. Он садиться рядом с двумя другими китайцами, и безмятежно начинает набивать руку о каменную плиту.
[/offtop]

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

У него есть желание выделиться, а для этого нужны совсем другие умения: уводить разговор в сторону, игнорировать неудобные вопросы, навешивать на собеседника ярлыки, называя других "недалёкими программистами", "невежами" и т.д. Всему этому он уже научился.
 

Wicked

Новичок
посмотрел код...

почему в функция hecho() сама ничего не выводит, хотя это, вроде бы, следует из ее названия?

чем метод insertId_real отличается от insertId?

зачем нужен метод nextid? f:confused:

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

методы query_fetchrow, query_fetchrow_object и query_fetchrowset отличаются, по большей части, только тем, что в них используются, методы fetchRow, (object) fetchRow и fetchRowSet соотвественно.

Код:
if (substr($query,0,1) == 'S' or substr($query,0,1) == 's')
...   $q->qtype = 'SELECT';
-- гениальный парсер запросов

дальше не осилил...
 

WP

^_^
> почему в функция hecho() сама ничего не выводит, хотя это, вроде бы, следует из ее названия?
Так надо, она служебная.
> чем метод insertId_real отличается от insertId?
Позволяет получать числа больше 4 байт.
> зачем нужен метод nextid? f:confused:
Совместимость.
> методы query_fetchrow, query_fetchrow_object и query_fetchrowset отличаются, по большей части, только тем, что в них используются, методы fetchRow, (object) fetchRow и fetchRowSet соотвественно.
Совместимость.
> -- гениальный парсер запросов
Свою задачу выполняет отлично.
 

Wicked

Новичок
Совместимость -- с чем? С версией 0.0.0.1? f:confused:

И каким образом совместимость (ну, допустим) оправдывает наличие метода nextid?

>>чем метод insertId_real отличается от insertId?
>Позволяет получать числа больше 4 байт.
как это следует из названия? Даже в этом смысле полная фигня получается.

>Так надо, она служебная.
Угу... "пользуйтесь, люди... только вот эта кнопочка не работает, а эту кнопочку не нажимайте, а то ё..ет еще ненароком" :)

>Свою задачу выполняет отлично.
не сомневаюсь... твой dbal, конечно же, запрещает использование запросов SET, SHOW, SOURCE, STATUS, SYSTEM, а также SELECT'ов, начинающихся с пробельных символов?

-~{}~ 18.02.08 14:29:

кстати, а почему SmartDB а не QuickDB?
 

WP

^_^
Wicked
> Совместимость -- с чем? С версией 0.0.0.1? f:confused:
Совместимость с предыдущем драйвером.
> как это следует из названия? Даже в этом смысле полная фигня получается.
Название меня устраивает. Никакого отношения к real number не имеет.
> не сомневаюсь... твой dbal, конечно же, запрещает использование запросов SET, SHOW, SOURCE, STATUS, SYSTEM, а также SELECT'ов, начинающихся с пробельных символов?
Не запрещает. Просто тип будет SELECT, можно кстати ограничить иначе, в следующей версии будет иначе, спасибо.

-~{}~ 18.02.08 11:35:

> кстати, а почему SmartDB а не QuickDB?
А почему QuickDB?
 

WP

^_^
berkut
Тогда присуди еще и разработчикам MySQL :) При проверке "можно ли кешировать запрос" - аналогичное условие.

-~{}~ 18.02.08 11:40:

.Wicked
:) Разные продукты. Думаю всё равно как называется, придумалось просто, так и назвал.

-~{}~ 18.02.08 11:42:

Сделал
PHP:
  $x = strtoupper(substr($query,0,4));
  if ($x == 'SELE' or $x == 'SHOW')
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху