Повторение кода - что делать?

Духовность™

Продвинутый новичок
Повторение кода - что делать?

Имеем код:

PHP:
// Получаем все регионы.
$res = $db->query('SELECT id_region, region_name FROM regions ORDER BY region_name');
$_HTML['regions'] = array();
while ($row = $res->fetch_assoc())
{
	$_HTML['regions'][$row['id_region']] = $row['region_name'];
}
код повторяется 2 раза.

Его по идее, надо вынести в функцию. Но я не уверен, что это хорошая практика. Во-первых, ИМХО, функции должны быть универсальными, а не функциями-"однодневками". А во-вторых, придется обращаться к GLOBALS за $db.

Как быть?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
// Получаем все регионы.
$_HTML['regions'] = array();
..................
....................
код повторяется 2 раза.
:confused:

а 2-й раз использовать массив уже полученных значений $_HTML['regions'] ну никак нельзя?
 

melo

однажды
подумай как можно сделать универсальной, вынести надо. ну или до следующего рефакторинга :)
 

Духовность™

Продвинутый новичок
Mr_Max
прикинь, это в разных скриптах используется, да!

Видимо плохо, ео использую GLOBALS

melo
универсальней наверно уже не получится - надо ООП наверно юзать для таких целей
 

С.

Продвинутый новичок
Re: Повторение кода - что делать?

PHP:
// Получаем все регионы.
$_HTML['regions'] = query2array('SELECT id_region, region_name FROM regions ORDER BY region_name', 'id_region');
...
...
...
...
...
function query2array($query,$key_col=false)  // super puper universal function
{
   $array= array();
   $res= sql_query($query);
   if (mysql_num_rows($res)>0)
   {
     if ($key_col) while ($item= mysql_fetch_assoc($res)) $array[$item[$key_col]]=$item;
     else while ($item= mysql_fetch_assoc($res)) $array[]=$item;
   }
   mysql_free_result($res);
   return $array;
}
 

Pigmeich

Новичок
triumvirat
однознчно выносить в отдельную функцию.

Это же защита от изменений (когда в одном месте исправили, а в другом забыли). Все повторяющеся и содержащее SQL код должно выноситься в функции в принудительном порядке.
 

Pigmeich

Новичок
triumvirat
содержащие SQL запрос, если тебе так удобнее.

Просто SQL это отдельная епархия и там очень просто внести изменения не исправив остальные куски.
 

dimagolov

Новичок
Pigmeich
даже если и вынести все ф-ии с SQL запросами в отдельный модуль/класс, то при изменении структуры БД неминуемо надо просматривать ВСЕ запросы на предмет того, надо их менять или нет чтобы они соответствовали новой структуре. так что контекстный поиск по-любому. так что ИМХО рельно не принципиально, вынесены ли все SQL запросы в одно место или нет, все равно проверять их все придеться. у меня, кстати, еще немерянно тригеров и хранимых процедур, их тоже подправлять приходиться в таких ситуациях, ну так что тут такого?

Другое дело, что если в двух местах надо получать одинаковый РЕЗУЛЬТАТ запроса к базе, то код, который запрашивает этот результат конечно нужно выносить в отдельную ф-ю.
 

Ermitazh

Новичок
Во-первых, ИМХО, функции должны быть универсальными, а не функциями-"однодневками".
Функции нужны для того чтобы не полвторять код. Золотое правило программирования - ни одной строчки повторяющегося кода за исключением вызова функций...

прикинь, это в разных скриптах используется, да!
а кто include i require отменял?...
 

AmdY

Пью пиво
Команда форума
Автор оригинала: dimagolov
даже если и вынести все ф-ии с SQL запросами в отдельный модуль/класс, то при изменении структуры БД неминуемо надо просматривать ВСЕ запросы
Но придётся просматривать каждый запрос ОДИН раз, а не ДВА-ТРИ в разных местах.
Выборка данных как и html нужно стараться выносить отдельно. если делать функцию, то можно передовать $db в функцию в виде параметра, можно использовать $GLOBALS, можно использовать ООП
 

dimagolov

Новичок
AmdY, так про это мой второй абзац.
первый абзац был ответ на пост Pigmeich-а:
и содержащее SQL код должно выноситься в функции в принудительном порядке.
содержащие SQL запрос, если тебе так удобнее.

Просто SQL это отдельная епархия и там очень просто внести изменения не исправив остальные куски.
просто я сильно не уверен, что ВСЕ SQL надо помещать в один класс/модуль и включать везде. Во-первых, опыт показывает, что объем такого модуля получаеться до неприличия большим. Кроме того, при таком подходе регулярна ситуация, когда модуль с парой десятков-сотен методов подключяеться ради вызова 1-2х из них. Чтобы такого не было я по крайней мере вижу 2 решения.
1. делать иерархию классов запросов "по интересам" так, чтобы методы одного класа более или менее полно использовались в скриптах, которые их подключают.
2. не маяться дурью и держать SQL в модулях, которым нужны результаты их отработки, а класс работы с БД делась самым простым, который бы получал SQL запросы как аргументы.
 

Pigmeich

Новичок
dimagolov
ты как-то не так меня понимаешь. :)

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

У себя, я, обычно группирую по смыслу запросы в классы. Подключение может выполняться в классе, а может и в глобальной области, не суть. Классов несколько, для каждой сущности свой.

С классами работы с БД не мешаю и призываю не мешать.
 

Духовность™

Продвинутый новичок
Я призываю делать по функции для каждого запроса.
Зачем? Что бы использовать их по одному разу? Большинство SQL-запросов используются по одному разу, какой смысл это все пихать в функции? Тут я солидарен с dimagolov -- объем такого модуля получается до неприличия большим. Кроме того, при таком подходе регулярна ситуация, когда модуль с парой десятков-сотен методов подключается ради вызова 1-2х из них.

Золотое правило программирования - ни одной строчки повторяющегося кода за исключением вызова функций...
да, но есть ещё и правила хорошего тона - это универсальность функций. А это значит, по-минимуму ГЛОБАЛС, привязкам к существующим движкам и т.д. Я сто тысяч раз видел говнокод, в котором функции были функциями-однодневками. Объем их был велик, а универсальности = 0. Тогда зачем это нужно?

а кто include i require отменял?...
и буду я на каждые 4 строчки кода делать отдельный файл для include!? Замечательно! Это опять к правилу хорошего тона относится. Что будет с проектом, когда он разрастется? Как его поддерживать? Ради четырех строк кода лезть в отдельный файл? Сумасойти.
 

fixxxer

К.О.
Партнер клуба
хватит спорить, то что приведено в первом постинге уже говнокод)
 

fixxxer

К.О.
Партнер клуба
не, ну приведенный кусок конечно ничем таким особенным не является, но по сопутствующему обсуждению становится ясно как там оно все.

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

Духовность™

Продвинутый новичок

Bakti9rov

!*|=?
DRY рулид? :D

$db заменить на вызов метода фабрики объектов
PHP:
class Factory {
  static function &getDb() {...}
}

$db = Factory::getDb();
$result = $db->query(...);
// etc.
а лучше еще будет определить метод Db::execute_assoc(), который по известным колонкам возвращает результат в виде хэша
 
Сверху