Hi Yulivee,

It depends on the nature of the duplication.

Do equally named subs have identical code?

Cut&paste programing involves mutations.

General approach for refactoring

a) identify all sub definitions in a file

Possible Tools

b) identify their dependencies
c) normalize sub code

Formatting can differ

d) diff potentially equal subs to measure similiarity

What "potentially" means depends on the quality your code.

probably changes happened to

e) try to visualize dependencies to decide where best to start

like with grapviz or a tree structure

f) create a test suite to assure refactoring quality
(The code might also show good inspection techniques)

g) start refactoring incrementally, while constantly testing the out come

depending on the quality of your tests you might first start with only one demon in production.

h) care about a fall back scenario

Especially use version control!

Conclusion

Sorry, very general tips, because it really depends on the structure of your legacy code. Probably grep is already enough...

(Think about it, you might also need "nested refactoring" because new modules still have duplicated code and need using other modules and so on)

research

I did some googling yesterday after our conversation for "refactoring" and "duplication" and the term "plagiarism detection" popped up.

like in these discussions:

Couldn't find a general refactoring project for Perl, but also didn't spend much time yet.

I think to cover all edge cases of a worst case scenario one certainly would need the use of PPI ( at least) or even a patched B::Deparse to scan the Op-Tree with PadWalker to identify variable dependencies and side effects.

HTH! :)

Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Je suis Charlie!


In reply to Re: Searching for duplication in legacy code (refactoring strategy) by LanX
in thread Searching for duplication in legacy code by yulivee07

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.