Является ли клонирование кода обычной практикой в C,Java и Python?
Клоны кода, также известные как дублирующий код, часто считаются вредными для качества системы.
- Мне интересно, можно ли увидеть этот дублированный код в стандартных API или других зрелых инструментах.
- Если это действительно так, то какой язык (например, 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, поэтому, конечно, рекомендуется не делать этого. Это вредно, потому что больше кода означает больше ошибок, а дублирование означает, что вам нужно помнить, чтобы исправить их во всех клонах.
Но у каждого правила есть свои исключения. Я уверен, что каждый может подумать об обстоятельствах, в которых они сделали что-то, что "лучшие практики", и догма сказала бы, что не должны, но они все равно сделали это. Время и другие ограничения не всегда позволяют вам быть идеальным.
Предположение, что разрешение должно быть предоставлено, чтобы допустить такое, смешно для меня. Будь сухим, как можешь. Если вы в конечном итоге нарушаете это, поймите, почему вы это сделали, и не забудьте вернуться и исправить это, если у вас есть шанс.