I am not aware of any such document. I think it's hard to say when to do one vs the other because the answer is really "it depends." If you only ever plan to build a single application, then sure, it's easier to build it as a straightforward implementation. If you absolutely know you are going to have multiple applications, then investing the time to build components for reuse is definitely the way to go. If you are not sure if you'll ever have another application but expect you might, then you probably want to find some middle ground. If there are bits that clearly should be components and making them so isn't going to impact project timelines, by all means, do so. That will avoid rework if you decide to leverage them for future applications. If something is more targeted to a specific area that isn't likely to get another application built any time soon, maybe that's something to leave in the implementation layer, knowing a few years down the line you may end up needing to invest in some refactoring. Hopefully by that point, you will have a clearer idea of how you want to implement things so the refactoring won't just be pulling something out and making it a component, but also refining and making the implementation more effective.