Evet - nevi ... 8.> P
biraz sen public void method1()
imzayı kaldırmak ne de tüm düzgün uygulayarak teslim edilecek (onun semantik değiştirmemelidir diyor "değişikliklere Closed" beton sınıfları.
"Uzantıya aç" bit, önceki arabirim öğelerinin olduğu gibi (yapısal ve semantik olarak) olduğu sürece arabirimi (dikkatli bir şekilde) değiştirmenize izin verir.
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
}
}
NOT: argüman yararlı bir # Sentinal # değeri yoktur, bu yaklaşım çalışmayabilir, örneğin Böyle bir şey deneyebilirsiniz Bu bir int
ve tüm değerler geçerlidir.
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: Genellikle olsa da, bir şey vb böyle sentinal mevcut olduğunda, herhangi bir MİN veya MAX değeri, negatif boş veya null bir nesne gibi, sen gibi özel ortak yöntem, oluşturabilir, orada - Sınıf kullanıyorsanız bile "arayüz" diyorum. Sadece arayüzü, sınıfın uygulandığı aynı zamanda ilan edilen sınıfın genel öğeleri olarak düşünün. Genelde kod-arası arayüzleri tercih ederim, fakat bu OP'nin sorusu değil, ya da benim noktayı değiştirir (yalnızca kodunun değiştirilmesinin yapıldığı - Java 8 arayüz-varsayılan uygulamaları kullanılıyorsa).
Birden fazla 10 değiştirmek zorunda bu parametrenin bir sağlayıcı enjekte sınıflar. Bu çağıran argümanlardan hiçbiri artık geçerli olmadığından * call1 'method1()' olacak her sınıfı değiştirmelisiniz. OCP konusunda basit geriye dönük uyumluluk konusunda çok endişelenmem. Tabii ki, tüm arama kodunu kontrol ederseniz, sorun yok. Gerçekten içeriğe bağlı. –
http://programmers.stackexchange.com/questions/310603/is-it-appropriate-to-not-follow-the-oc-principle-if-you-have-unit-test-coverage –
@JonSkeet, Genel arayüzünü değiştirebileceğim tüm çağrı kodlarını kontrol ediyorum. Kontrol etmezsem eski yöntem sürümünü kaydetmeli ve yeni bir versiyon eklemeliyim? Bundan sonra eski sürümü kullanımdan kaldırılabilir mi? –