2010-05-27 8 views
18

¿Cuál es el problema de la clase base frágil en Java?¿Cuál es el problema de la clase base frágil?

+3

resistir impulso para hacer referencia a un premio importante! o un álbum de NIN ... – scunliffe

+3

Lamento decírtelo, @scunliffe, pero fallaste ;-) –

+0

Si se dice que el problema de FBC es tener una clase base con un contrato poco claro (o incompleto) especificado para que cambiar la clase posiblemente romperá los derivados que dependen de él, ¿será eso suficiente? ¿Y podemos tener interfaces derivadas, por cierto? – mlvljr

Respuesta

18

Una clase base frágil es un problema común con la herencia, que se aplica a Java y a cualquier otro lenguaje que admita la herencia.

En pocas palabras, la clase base es la clase que está heredando, y a menudo se llama frágil porque los cambios en esta clase pueden tener resultados inesperados en las clases que heredan de ella.

Existen algunos métodos para mitigar esto; pero no hay un método sencillo para evitarlo por completo sin dejar de usar la herencia. Puede evitar que otras clases hereden de una clase etiquetando la declaración de clase como final en Java.

Una buena práctica para evitar el peor de estos problemas es etiquetar todas las clases como definitivas a menos que específicamente intente heredarlas. Para aquellos de los que pretendan heredar, diseñelos como si estuviera diseñando una API: oculte todos los detalles de implementación; Sea estricto con lo que emite y tenga cuidado con lo que acepta, y documente el comportamiento esperado de la clase en detalle.

11

Una clase base se llama frágil cuando los cambios realizados en ella rompen una clase derivada.

class Base{ 
    protected int x; 
    protected void m(){ 
     x++; 
    } 

    protected void n(){ 
     x++;  // <- defect 
     m(); 
    } 
} 


class Sub extends Base{ 
     protected void m(){ 
      n(); 
     } 
    } 
+0

Es frágil cuando los simples cambios en la clase principal rompen la clase hija. Si está cambiando todo en el padre y eso hace que los hijos se rompan, eso no necesariamente significa que el padre era frágil; si cambias algo aparentemente benigno y las cosas se desmoronan, era frágil. –

+3

Pero, ¿qué cambios son simples entonces, es decir, cuál es el criterio? – mlvljr

0

Todo lo que "Colin Pickard" ha dicho es cierto, y aquí quiero añadir a la lista de las mejores prácticas para conseguir protegidos cuando se escribe código que puede causar este tipo de problemas en el lenguaje Java .. .

  1. hacer todas sus clases final, ya que no quiere que se heredan
  2. Si no puede y tiene que utilizar la herencia (ejemplo de la clase abstracta) a continuación, hacer que todos sus métodos implementados final sea no modificado por sus subclases (incluso los métodos protegidos son una mala idea en términos generales, las subclases no deberían saber tanto sobre sus subclases) ...
  3. Trate de no usar una relación [es un] en lugar de tratar de usar la [utiliza un] relationsheap entre las interfaces de uso del diagrama de clases para evitar el problema se extiende ..
  4. Cada extiende puede ser reemplazado por implementa y si tiene que hacer una aplicación por defecto aquí es una espineta código:

public interface MyBehavior { 
 
    void doAction(); 
 

 
    static class Implementation implements MyBehavior { 
 
     public void doAction() { 
 
      //do some stuff 
 
     } 
 
    } 
 
} 
 

 
// instead of doing extends To a class that have the doAction method 
 
// we will make a [use a] relationShip between the Example class & the Implementation class 
 
public class Example { 
 
    private MyBehavior.Implementation helper = new MyBehavior.Implementation(); 
 

 
    public void doAction() { 
 
     this.helper.doAction(); 
 
    } 
 
}

Cuestiones relacionadas