es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo refactorizar para reducir el código duplicado?

Tengo la clase abstracta principal GLSubBuffer para modelar una subparte de un buffer:

@Getter(value = AccessLevel.PROTECTED)
public abstract class GLSubBuffer<t extends="" buffer=""> {

  private final T buffer;
  private final int position;
  private final int capacity;

  public GLSubBuffer(T buffer, int position, int capacity) {
    this.buffer = buffer;
    this.position = position;
    this.capacity = capacity;
  }

}

Aquí está la clase para una subparte de FloatBuffer:

public class GLSubFloatBuffer extends GLSubBuffer<floatbuffer> {

  public GLSubFloatBuffer(FloatBuffer buffer, int position, int capacity) {
    super(buffer, position, capacity);
  }

  public void update(float[] values) {
    int min = Math.min(values.length, getCapacity());
    for (int i = 0; i < min; i++) {
      getBuffer().put(i + getPosition(), values[i]);
    }
  }

}

Y la clase para una subparte de IntBuffer:

public class GLSubIntBuffer extends GLSubBuffer<intbuffer> {

  public GLSubFloatBuffer(IntBuffer buffer, int position, int capacity) {
    super(buffer, position, capacity);
  }

  public void update(int[] values) {
    int min = Math.min(values.length, getCapacity());
    for (int i = 0; i < min; i++) {
      getBuffer().put(i + getPosition(), values[i]);
    }
  }

}

¿Cómo refactorizar el método update() para poder moverlo a la clase principal y eliminar las dos clases hijo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para refactorizar el método update() y eliminar las dos clases hijas, podemos usar genéricos y hacer que la clase GLSubBuffer sea genérica para manejar todos los tipos de buffer en lugar de crear clases separadas para cada tipo de buffer.

    Así es como podemos refactorizar la clase GLSubBuffer:

    @Getter(value = AccessLevel.PROTECTED)
    public abstract class GLSubBuffer<t extends="" buffer,="" v=""> {
    
      private final T buffer;
      private final int position;
      private final int capacity;
    
      public GLSubBuffer(T buffer, int position, int capacity) {
        this.buffer = buffer;
        this.position = position;
        this.capacity = capacity;
      }
    
      public void update(V[] values) {
        int min = Math.min(values.length, getCapacity());
        for (int i = 0; i < min; i++) {
          setBufferValue(values[i], i + getPosition());
        }
      }
    
      protected abstract void setBufferValue(V value, int index);
    }
    

    En el código anterior, hicimos que la clase GLSubBuffer sea genérica con dos parámetros de tipo T y V. T representa el tipo de buffer (por ejemplo, FloatBuffer o IntBuffer), y V representa el tipo de valores con los que queremos actualizar el buffer (por ejemplo, float o int).

    También agregamos un nuevo método update(), que toma una matriz de valores de tipo V y actualiza el buffer con esos valores. Usamos el método setBufferValue() (que es abstracto) para establecer el valor del buffer en un índice particular. El método setBufferValue() se implementa en las clases hijas según el tipo de buffer.

    Así es como podemos crear una instancia de GLSubBuffer y actualizar sus valores:

    FloatBuffer floatBuffer = FloatBuffer.allocate(10);
    GLSubBuffer<floatbuffer, float=""> glSubFloatBuffer = new GLSubBuffer<floatbuffer, float="">(floatBuffer, 2, 3) {
      @Override
      protected void setBufferValue(Float value, int index) {
        getBuffer().put(index, value);
      }
    };
    
    float[] values = new float[] { 1.0f, 2.0f, 3.0f };
    glSubFloatBuffer.update(values);
    

    En el código anterior, creamos una instancia de GLSubBuffer con un FloatBuffer, posición y capacidad. Sobrescribimos el método setBufferValue() para establecer el valor del FloatBuffer en un índice particular.

    Luego creamos una matriz de valores de tipo float y llamamos al método update() en la instancia de GLSubBuffer para actualizar el FloatBuffer con esos valores.

    De manera similar, podemos crear una instancia de GLSubBuffer con un IntBuffer y actualizar sus valores con una matriz de valores int.</floatbuffer,></floatbuffer,>

Comments are closed.