Является ли клонирование кода обычной практикой в ​​C,Java и Python?

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

  1. Мне интересно, можно ли увидеть этот дублированный код в стандартных API или других зрелых инструментах.
  2. Если это действительно так, то какой язык (например, C,Java,Python, Common Lisp и т. Д.), По вашему мнению, должен ввести code clone практиковаться с большей вероятностью?

2 ответа

Решение

Клонирование кода чрезвычайно распространено независимо от того, какой язык программирования используется, да, даже в C, Python и Java.

Люди делают это, потому что это делает их эффективными в краткосрочной перспективе; они делают повторное использование кода. Это, возможно, плохо, потому что это приводит к неэффективности группы в долгосрочной перспективе: клоны повторно используют ошибки и допущения в коде, и когда они обнаруживаются и должны быть исправлены, все клоны кода должны быть исправлены, а программист, исправляющий это, не делает знать, где находятся клоны, или даже если они есть.

Я не думаю, что клоны плохи из-за эффекта повторного использования кода. Я думаю, что плохо не управлять ими.

Чтобы справиться с последней проблемой, я создаю детекторы клонов (см. Наш CloneDR), которые автоматически находят точный и почти пропущенный дублирующий код, используя структуру языка программирования для руководства поиском. CloneDR работает для широкого спектра языков программирования (включая набор OP).

В любой программной системе 100K SLOC или более клонируется не менее 10% кода. (Хорошо, хорошо, JDK от Sun создан исключительно хорошей командой, у них всего 9,5%). Это имеет тенденцию быть хуже в более старых традиционных заявлениях; Я подозреваю, потому что программисты клонируют больше кода для самозащиты. (Я видел приложения, в которых клоны составляют более 50% кода, да, эти программы, как правило, ужасны по многим причинам, а не просто клонируют).

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

Весь код одинаков, независимо от того, кто его пишет. Любой API, который вы цитируете, был написан людьми, которые принимали решения на этом пути. Я еще не видел идеальный API - все они возвращаются к вещам задним числом.

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

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

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

Другие вопросы по тегам