mirror of
https://github.com/github/codeql.git
synced 2025-12-30 23:58:15 +01:00
49 lines
2.4 KiB
XML
49 lines
2.4 KiB
XML
<!DOCTYPE qhelp PUBLIC
|
|
"-//Semmle//qhelp//EN"
|
|
"qhelp.dtd">
|
|
<qhelp>
|
|
|
|
<overview>
|
|
<p>When most of the lines in one method are duplicated in one or more other
|
|
methods, the methods themselves are regarded as <em>mostly duplicate</em> or <em>similar</em>.</p>
|
|
|
|
<p>Code duplication in general is highly undesirable for a range of reasons. The artificially
|
|
inflated amount of code is more difficult to understand, and sequences of similar but subtly different lines
|
|
can mask the real purpose or intention behind them. Also, there is always a risk that only one
|
|
of several copies of the code is updated to address a defect or add a feature.</p>
|
|
|
|
</overview>
|
|
<recommendation>
|
|
<p>Although completely duplicated methods are rare, they are usually a sign of a simple
|
|
oversight (or deliberate copy/paste) by a developer. Usually the required solution
|
|
is to remove all but one of them.</p>
|
|
|
|
<p>It is more common to see duplication of many lines between two methods, leaving just
|
|
a few that are actually different. Decide whether the differences are
|
|
intended or the result of an inconsistent update to one of the copies.</p>
|
|
<ul>
|
|
<li>If the two methods serve different purposes but many of their lines are duplicated, this indicates
|
|
that there is a missing level of abstraction. Look for ways of encapsulating the commonality and sharing it while
|
|
retaining the differences in functionality. Perhaps the method can be moved to a single place
|
|
and given an additional parameter, allowing it to cover all use cases. Alternatively, there
|
|
may be a common pre-processing or post-processing step that can be extracted to its own (shared)
|
|
method, leaving only the specific parts in the existing methods. Modern IDEs may provide
|
|
refactoring support for this sort of issue, usually with the names "Extract method", "Change method signature",
|
|
"Pull up" or "Extract supertype".</li>
|
|
<li>If the two methods serve the same purpose and are different only as a result of inconsistent updates
|
|
then treat the methods as completely duplicate. Determine
|
|
the most up-to-date and correct version of the code and eliminate all near duplicates. Callers of the
|
|
removed methods should be updated to call the remaining method instead. </li></ul>
|
|
|
|
</recommendation>
|
|
<references>
|
|
|
|
<li>E. Juergens, F. Deissenboeck, B. Hummel, S. Wagner.
|
|
<em>Do code clones matter?</em> Proceedings of the 31st International Conference on
|
|
Software Engineering,
|
|
485-495, 2009.</li>
|
|
|
|
|
|
</references>
|
|
</qhelp>
|