1 Востаннє редагувалося funivan (15.01.2013 21:38:37)

Тема: Задачі - визначення дублікатів коду (хоча б sql)

Всім привіт =) Зайшов в одну тему побачив що народові не вистачає задач, ось реальна задача.

Дублікати коду це головний чинник який порушує принцип DRY
Давайте глянемо що є і чого немає в сучасному світі програмування. На даному етапі я не знайшов адекватних тулз які допоможуть визначити подібний код. Є тулзи які визначають рядок в рядок. Наприклад у вас 200 файлів у 3х з них повторяється 1-3 рядки підряд можна таку штуку визначити це не проблема

А от наступний приклад буде цікавий
Файл 1

$pdo->execute('Select * from user where id = ?', array($id));

Файл 2

$pdo->execute('
 Select * 
  from `user` 
 WHERE 
`id` = ? limit 1
', array($userId));

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

Мій підхід. на даній задачі треба витягнути з файлів всі sql запити і порівняти їх
Ну що вперед ;)

2 Востаннє редагувалося miroslav.chandler (15.01.2013 16:43:07)

Re: Задачі - визначення дублікатів коду (хоча б sql)

тобто треба визначити, чи не повторюються запити в пдо і все?

pew pew :D
Блоґ

3 Востаннє редагувалося Vo_Vik (15.01.2013 19:31:46)

Re: Задачі - визначення дублікатів коду (хоча б sql)

Як варіант, об’єднати всі строки в файлі в одну. Забрати всі подвійні пробіли. І після цього використати ті тулзі що існують.

4 Востаннє редагувалося funivan (15.01.2013 21:38:27)

Re: Задачі - визначення дублікатів коду (хоча б sql)

тобто треба визначити, чи не повторюються запити в пдо і все?

так. Але ми не можемо виконати всі запити, у вас є просто 1000 рнр файлів в них різні скл запити ;)

Як варіант, об’єднати всі строки в файлі в одну. Забрати всі подвійні пробіли. І після цього використати ті тулзі що існують.

Якщо зробити таке:

$pdo->execute('Select * from user where id = ?', array($id));
$pdo->execute('Select * from `user` WHERE `id` = ? limit 1', array($userId));

Поточні аналізатори не розпізнають цей код як дублікат так як дані відрізняються. в першу чергу це дужки лапки і тд)
В другу чергу ліміт
По логіці цей код треба винести хоча б як мінімум у функцію

function getUser($id){
  return $pdo->execute('Select * from `user` where `id` = ? limit 1', array($id));
}

5

Re: Задачі - визначення дублікатів коду (хоча б sql)

А те що там user, а там id це так і повинно бути?

6

Re: Задачі - визначення дублікатів коду (хоча б sql)

Replace написав:

А те що там user, а там id це так і повинно бути?

Глюк. Спс поправив ;)

7

Re: Задачі - визначення дублікатів коду (хоча б sql)

можна ще забрати символи ` і капіталізацію. Тоді ті тулзі знайдуть як мінімум отакий кусок
select * from user where
далі напевно все ж в ручну треба буде дивитись.
Або визначити правила по яких 2 частини коду можна вважати еквівалентними. Маючи такі правила можна робити ту ж заміну, що і вище. Тобто " "="  " це одне з правил.

8

Re: Задачі - визначення дублікатів коду (хоча б sql)

funivan, Тоді цікава задачка :)

9

Re: Задачі - визначення дублікатів коду (хоча б sql)

шукаємо рядки, які не закінчуються на крпаку з комою, зліплюєм в один

pew pew :D
Блоґ

10 Востаннє редагувалося funivan (16.01.2013 11:29:45)

Re: Задачі - визначення дублікатів коду (хоча б sql)

miroslav.chandler написав:

шукаємо рядки, які не закінчуються на крпаку з комою, зліплюєм в один

непоняв. які це рядки не закінчуються на крапку з комою?

далі напевно все ж в ручну треба буде дивитись.

Ну вручну дивитись це да але не зразу тобто треба знайти дублі і поітм просто поглянути.
А якщо видалити зайві символи як ви казали тулзи не знайдуть дублі рядків так як рядки ці не будуть співпадати навіть після видалення зайвих символів. Це ж треба не рядки порівнювати а стрічки фактично,

11

Re: Задачі - визначення дублікатів коду (хоча б sql)

funivan
Мається на увазі, наприклад:

$db->query('
SELECT id, name
FROM users
WHERE id=1
');

привести до вигляду:

$db->query('SELECT id, name FROM users WHERE id=1');

Але там є проблемка, а якщо і справді потрібні переноси всередині рядка?

12

Re: Задачі - визначення дублікатів коду (хоча б sql)

гм, здається в ПХП переноси не мають значення для інтерпритатора.

13

Re: Задачі - визначення дублікатів коду (хоча б sql)

В середині рядка ще як має значення

14

Re: Задачі - визначення дублікатів коду (хоча б sql)

Replace написав:

В середині рядка ще як має значення

Це в якому випадку? Інтерпритатор обробляє стрічки вроді без проблем, так що можна сміло замінити \n на пробіл в sql запитах