Here is a series of logical, defensible actions that end up with a sub-optimal result:
- We need to share some code between two applications (
App A
andApp B
), so we move it out ofApp A
into somewhere else (i.e. its own repo, or into components or essentials or some similar collection.) - The interface exposed by this shared code isn't quite right for
App B
. Perhaps it's not ergonomic for the application for some reason, so to keep things DRY, they create a wrapper to provide whatever configuration, defaults, or argument shifting makes sense forApp B
. Now, all call sites inApp B
go through the wrapper. - Time goes by, and something else changes. Perhaps
App A
changes a bit, and so the engineers do step 2 above (but -- to be clear, they implement it in a different,App A
specific way). Alternately,App B
becomes more complex and the lower level wrapper is no longer s