Два больших вопроса:
О каких изменениях мы говорим здесь?
Какой у вас есть существующий код? Это уже соответствует каким-либо твердым принципам?
Предположим, нам нужно внести некоторые изменения в хорошо спроектированное существующее приложение. Рассмотрим, возможно, приложение для расчета заработной платы. У нас может быть Interafce (это просто надуманный пример)
public Interface EmployeeContract {
public int computeSalaryForMonth(int month);
}
и у нас есть реализации:
public class SalesContract implements EmployeeContract {
public int computeSalaryForMonth(int month){
// computation involving sales figures and base salary
}
}
public class HourlyContract implements EmployeeContract {
public int computeSalaryForMonth(int month){
// computation involving hours worked and overtime payments
}
}
Теперь все остальные части приложения кодируются с точки зрения интерфейса.
Теперь мы можем добавлять новые виды контрактов, не меняя существующий код, мы открыты для расширения и добавления, возможно, довольно сложной новой бизнес-логики.
НО это потому, что оригинальный дизайнер ожидал такого рода изменений, добавляя новые типы ежемесячных контрактов. Не так хорошо, если бы мы хотели принять на работу сотрудников, которые получают зарплату еженедельно? Теперь наш интерфейс не подходит, нам нужно его изменить, и эффекты будут распространяться через другой код.
Реально, программное обеспечение не будет открыто для безболезненного изменения произвольной бизнес-логики, и, действительно, попытка быть гибкой заранее может поглотить много усилий. Однако обратите внимание, что, хотя в моем примере интерфейс не так гибок, как нам сейчас нужно, поскольку интерфейс - это точка соединения, очень легко идентифицировать части кода, которые необходимо изменить.
Резюме: в вашей ситуации:
- Понимать структуру существующего кода и его гибкость. Примите, что некоторый код нужно будет изменить, и неудивительно, что значительные изменения в бизнесе могут потребовать значительных изменений в коде.
- Структура обычно помогает с удобством сопровождения, поэтому при добавлении нового кода обращайте внимание на структуру. Обеспечьте «брандмауэры» в своем коде, кодируя интерфейсы, соблюдая баланс между выполнением работы и возможностью расширения.