Refactoring is not a goal by itself. It becomes necessary when structure raises the cost of every change, makes failures unpredictable, or prevents business rules from being tested clearly.

1. Small changes touch too many areas

If a coupon rule requires changes across a controller, model, job, and several endpoints, the problem is the absence of a clear responsibility boundary.

Does the code structure help the team predict the impact of change?

Start with a risk map, not a rewrite

Identify the highest-impact flows, protect current behavior with tests, and improve one boundary at a time.