Как насчет использования экземпляра java.util.Properties
в качестве единственного параметра для конфигурации Shader
? Или другой тип java.util.Map
?
Когда у всех шейдеров есть простой набор общих параметров (некоторые из них все, некоторые нет, другие - выбор), вы можете создать некоторый тип DSL для конфигурации , который проверяет каждое значение параметра, и каждый тип шейдера определяет в списке, какие аргументы допустимы для него.
Это позволит вам максимально использовать код. Это позволило бы также иметь геттеры и сеттеры. Посмотрите на классы в java.time
для примера, как это могло бы выглядеть…
Это может выглядеть так:
public interface IChromaColors
{
Set<Parameter> getParameters();
void configure( Map<Parameter,Object> values );
Object get( Parameter parameter );
void set( Parameter parameter, Object value );
}
Parameter
может выглядеть так:
public interface Parameter<T>
{
String getName();
Class<T> getType();
boolean validate( T value );
}
Теперь ваш класс может выглядеть так:
public class ChromaColor implements IChromaColor
{
private Map<Parameter,Object> m_Values;
private Set<Parameter> m_ValidValues;
private Shader shader;
public Chroma( Map<Parameter,Object> values )
{
shader = loadShader("chroma.glsl");
m_ValidValues = Set.of( SmoothingParameter );
m_Values = values;
if( !m_Values.contains( SmootingParameter ) )
{
m_Values.put( SmoothingParameter, Float.valueOf( 0.1F ) );
}
configure( m_Values );
}
public Chroma set( Parameter parameter, Object value
{
if( m_ValidValues.contains( parameter )
{
…
}
return this;
}
public Object get( Parameter parameter )
{
return m_Values.get( parameter );
}
public Shader shader() {
return shader;
}
}
Это просто грубый, очень грубый набросок моей идеи! Поэтому я пропустил проблемы с обобщениями для Parameter
, и интерфейсы можно оптимизировать (значительно!), Но я надеюсь, что вы получите слабый намек на то, что я имею в виду.