I think reusability is something that comes with practice. And I&#x27;m starting to think that &quot;write once, reuse forever (without modifications)&quot; is just a pipe dream.<p>Lately I&#x27;ve been realizing how easy it is to fall into the &quot;abstraction trap&quot;. It&#x27;s exactly your situation: I have a Thing. I need a new Thing that&#x27;s slightly different, but I don&#x27;t want to copy all the code! That&#x27;s not DRY! It&#x27;s paralyzing.<p>So instead of duplicating code I spend time trying to tweak Thing, passing in parameters, adding special rendering cases, and finally it works as Thing and a smaller Thing2. But it&#x27;s a mess, and it&#x27;s not factored well, and it&#x27;ll be a nightmare when Thing3 comes along.<p>Check out this article from the other day:
<a href="http:&#x2F;&#x2F;programmingisterrible.com&#x2F;post&#x2F;139222674273&#x2F;write-code-that-is-easy-to-delete-not-easy-to" rel="nofollow">http:&#x2F;&#x2F;programmingisterrible.com&#x2F;post&#x2F;139222674273&#x2F;write-cod...</a><p>In line with his idea of copy-pasting code, I think that&#x27;s the way to go: copy all the code from Product, paste it into ProductThumbnail, and make it work. THEN refactor it, and pull out reusable bits... or compose the two somehow... etc.