We have an application where the customer has changed their mind about a large area of functionality and this area requires a large amount of re-work.
Whilst the re-work itself is not an issue, it has introduced a situation where the impact of the changes is wide ranging including:
- Data
- Query Logic / Table structure
- Business logic
- Display / Presentation
Ideally we'd like to incorporate these changes at the same time as several other development streams, but we're worried that the impact of the changes will have a negative impact on how frequently we can deliver. We can cater for some of this through branches, but it made me wonder what the possibilities are for guarding against this kind of thing from an application architecture or development practice point of view.
Things we currently do:
- Abstract query logic into repositories - This is great for small changes, but when the overall logic in an area changes, e.g. instead of getting a list of users which meet a certain criteria, we now need to get a list of organisations which joined to locations.
- Abstract business logic into services - This is exactly the same as the repositories in that we can't really guard against entire logic shifts, but small changes can be accommodated with limited impact.
- Ensure configuration is kept out of code which needs re-deployment, a combination of database rows or web.config values.
- Other patterns which promote aspects of flexibility like factories where appropriate etc.
- Feature flagging for selection of functionality if two approaches were developed originally. etc
Are there any other current best practices to guard against changes, without incorporating branches etc?