我想制作一个将Activation Function应用于值的类。该类如下

public class ActivationFunction {

    public static double function(double value, Functions functions) {
        if(functions.equals(Functions.SIGMOID)) {
            return sigmoid(value);
        }
        return 0f;
    }
    public static double derivativeOfFunction(double value, Functions functions) {
        if(functions.equals(Functions.SIGMOID))
            return sigmoidDerivative(value);

        return 0f;
    }

    private static double sigmoid(double value) {
        return 1 / (1 + Math.exp(0 - value));
    }
    private static double sigmoidDerivative(double value) {
        return ( Math.exp(0 - value) / ( (1 + Math.exp(0 - value)) * (1 + Math.exp(0 - value)) ) );
    }

}


其中Functions是定义不同功能的enum。现在只有sigmoid功能,但还会添加更多功能。



我认为这违反了Open-Closed Principle,这是OOP的5条SOLID原则之一(也许是违反更多)。那么,编写此类以适应将来添加更多功能的正确方法是什么?

任何帮助表示赞赏。

最佳答案

您可以将公共接口的实现放在枚举本身中。

像这样:

public enum Functions {
  SIGMOID {
    public double function(double value) { return 1 / (1 + Math.exp(0 - value)); }
    public double derivative(double value) { return ...; }
  },
  OTHER_FUNCTIONS { ... }

  public abstract double function(double value);
  public abstract double derivative(double value);
}


这样,您的ActivationFunction变得非常易于编写-可能不再有用。

08-29 00:17