Да - вроде ... # 8> P
«Closed изменения» бит говорит, что вы не должны удалить public void method1()
подпись и не изменяет свою семантику (которые должны быть поставлены все правильно реализации конкретные классы).
«Открыть для расширения» бит позволяет (тщательно) изменять интерфейс до тех пор, пока предыдущие элементы интерфейса остаются как есть (структурно и семантически). Вы могли бы попробовать что-то вроде этого:
public class SomeClass {
@Deprecated
default public void method1(){
method1(#SENTINAL#);
}
public void method1(#TYPE# arg){
if (arg == #SENTINAL#) {
// do something old
} else {
// do something new
}
}
public void method2(){
// do something
}
}
ПРИМЕЧАНИЕ: Этот подход может не работать, если аргумент не имеет полезный # Sentinal # значение, например, это int
и все значения действительны. Часто, однако, есть кое-что, как и любое отрицательное, значение MIN или MAX, пустой или нулевой объект, и т.д. Если нет такого Sentinal нет в наличии, вы можете создать частный общий метод, как:
public class SomeClass {
@Deprecated
default public void method1(){
method1(true);
}
public void method1(#TYPE# arg){
method1(false, arg)
}
private void method1(boolean isOldWay, #TYPE# arg) {
if(isOldWay) {
// snore - still old clients
} else {
// yea! new clients are much greener!
}
}
}
PS - Я говорю «интерфейс», даже если вы используете класс. Подумайте об интерфейсе как об открытых элементах класса, объявленных одновременно с реализацией класса. Обычно я предпочитаю использовать код-интерфейс, но это не вопрос OP, и он не изменит мою точку зрения (просто , где были внесены изменения - esp при использовании реализаций интерфейса Java 8 по умолчанию).
Вы должны изменить более чем на 10 классы. Вы должны изменить каждый класс, который будет * вызывать * 'method1()', потому что ни один из этих вызовов с 0 аргументами недействителен. Я бы не стал так беспокоиться об OCP как простой обратной совместимости. Конечно, если вы контролируете весь код вызова, все в порядке. Это действительно зависит от контекста. –
http://programmers.stackexchange.com/questions/310603/is-it-appro-to-not-follow-the-oc-principle-if-you-have-unit-test-coverage –
@JonSkeet, так что если Я могу управлять всем вызывающим кодом, который я могу, чтобы изменить открытый интерфейс? Если я не контролирую, я должен сохранить старую версию метода и добавить новую версию? После этого я могу объявить старую версию устаревшей? –