?

Log in

No account? Create an account

Программистская стилеметрия - Общество дровосеков Бердичева по изучению Мишны

Jan. 21st, 2010

04:01 pm - Программистская стилеметрия

Previous Entry Share Next Entry

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

Как эффективно определить избыточность исходника (в предположении, что его автор не предпринимал countermeasures)? Я беру файл, удаляю из него пробелы и табуляции, пустые строки и строки, состоящие лишь из ограничителей составных операторов, и считаю отношение уникальных оставшихся строк к общему числу оставшихся строк.

Какой интервал, по-вашему, приемлем для плотного кода, и начиная с какого значения можно начинать говорить, что код нуждается в рефакторинге?

Comments:

[User Picture]
From:zebra24
Date:January 22nd, 2010 12:39 am (UTC)
(Link)
На мой взгляд это всё очень зависит от языка и пр.
Хочу заметить, что более компактный код хоть и красив, но часто требует больше времени и усилий на отладку.

Имхо главный признак, что требуется рефакторинг:
# Дублирование кода
# Длинные методы (больше одной страницы)

При оценке дублирования кода глупо исходить из "отношение уникальных оставшихся строк к общему числу оставшихся строк".

Например есть вызов
lalalala(param1, param2);
Если написано стильно, табуляция и имена переменных могут совпадать, а смысл вызовов (их может быть десятки) будет разный и дублированием это сложно назвать.

С другой стороны две функции с дублирующим друг друга поведением, но обрабатывающие разные поля структуры, это 100% дублирование, а Ваш методы выдаст что разные функции.

lalala_for_left_hand() {
left_hand = ...
};
lalala_for_right_hand() {
right_hand = ...
};

Ещё я-бы заметил, что пробелы и табуляция тоже работа. :)
И комментарии, 30% от сложного кода это нормально.



про рефакторинг хорошо написано здесь.
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3

К сожалению про тулы с помощью которых можно автоматизировать code_review вики молчит..
http://ru.wikipedia.org/wiki/Code_review
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 22nd, 2010 04:59 pm (UTC)
(Link)
Вот самое лютое, бешеное дублирование кода я и хочу отловить в первую очередь. Мой способ занизит повторяемость, не отловив дублирование с заменой имен, но и то хлеб.

Комментарии, если они разные, снижают повторяемость, это нормально.

Длина методов - это отдельная грустная песня. Пока найденный мной рекорд - около 2100 строк.
(Reply) (Parent) (Thread)
[User Picture]
From:zebra24
Date:January 25th, 2010 07:58 pm (UTC)
(Link)
Ну осторожней тогда, т.к.

lalalala(param1, param2);

в разных местах будет скорей всего восприниматься как одно и тоже, а по сути могут быть разные вещи..
(Reply) (Parent) (Thread)
[User Picture]
From:dz
Date:January 22nd, 2010 10:14 am (UTC)
(Link)
анализировать на повторы нужно, наверное, не сырец, а AST. Но это уже грепом и верёвкой не сделаешь, конечно.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 22nd, 2010 04:52 pm (UTC)
(Link)
Теоретически - да, но моя первоочередная задача - выяснить, где индусы в наибольшей степени cut-n-paste'ом программировали. Бритва Хэнлона, такскть.
(Reply) (Parent) (Thread)
[User Picture]
From:_windwalker_
Date:January 22nd, 2010 11:00 pm (UTC)
(Link)
+1
(Reply) (Parent) (Thread)
[User Picture]
From:relyef
Date:January 23rd, 2010 12:11 am (UTC)
(Link)
Избыточность кода можно проверить по тому, как файл сжимается zip'oм :), как source, так и binary. Второе даже интереснее, потому как комментарии не учитываются.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 23rd, 2010 12:18 am (UTC)
(Link)
Я думал об этом, но это слишком грубо, потому что сжимаемость и source, и отдельных объектных файлов (а меня интересует статистика по файлам) зависит от выбора идентификаторов.
(Reply) (Parent) (Thread)
[User Picture]
From:relyef
Date:January 23rd, 2010 12:20 am (UTC)
(Link)
Если в качестве идентификаторов используется что-то типа c1, n03, _a5 - тут не рефакторинг, а публичные казни устравать надо.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:January 23rd, 2010 12:30 am (UTC)
(Link)
Это понятно. Но зипу все равно, что сжимать - длинные, годные идентификаторы (с ними как раз все в порядке) или cut-n-paste код, а я как раз хочу эти два случая различать, поэтому приходится выдумывать альтернативные способы.
(Reply) (Parent) (Thread)
[User Picture]
From:relyef
Date:January 23rd, 2010 12:35 am (UTC)
(Link)
http://en.wikipedia.org/wiki/PMD_(software), scroll to CPD
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:January 23rd, 2010 12:43 am (UTC)
(Link)
Спасибо, заработало!
(Reply) (Parent) (Thread)
[User Picture]
From:malaya_zemlya
Date:January 23rd, 2010 02:35 am (UTC)
(Link)
Стиль программиста измеряется, как известно, количеством WTF в минуту чтения кода. Остальное есть профанация
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 23rd, 2010 02:44 am (UTC)
(Link)
Ну хорошо. Есть программа для подсчета WTF-ов?
(Reply) (Parent) (Thread)
[User Picture]
From:vlad_gor
Date:February 7th, 2010 09:09 am (UTC)
(Link)
Строкам ведь бесполезно рефакторинг делать.
Надо искать не повторяющиеся строки, а повторяющиеся блоки.

Надо еще убрать комментарии, всем переменным одно и тоже имя присвоить. И убрать переносы строк внутри внутреннего блока.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 7th, 2010 09:14 am (UTC)
(Link)
Мне хотелось сделать что-то совсем на скорую руку, а посоветованный и с успехом использованный CPD ищет как раз повторяющиеся группы токенов, и - опционально - игнорирует различия в именах переменных и значениях констант.
(Reply) (Parent) (Thread)