java - 遵循所有 SOLID 原则的正确版本的类

标签 java oop solid-principles

我想创建一个将激活函数应用于某个值的类。类如下

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 函数,但会添加更多函数。

问题

我认为它违反了开闭原则,这是 OOP 的 5 个SOLID原则之一(可能它违反了更多)。那么,编写此类以适应将来添加更多功能的正确方法是什么?

感谢任何帮助。

最佳答案

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

类似这样的事情:

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 就变得非常容易编写 - 它甚至可能不再有用。

关于java - 遵循所有 SOLID 原则的正确版本的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43737522/

相关文章:

java - 将 xml 插入 pdf

Java 类收集所有子属性

c++ - clockTick 函数未在此范围内声明

ruby - 猴子修补与。坚硬的。原则?

java - 这是对里氏替换原则的正确理解吗

ruby-on-rails - 有没有办法涂干而结实的本金

java - 使用公钥进行数字签名

java - IntelliJ 从爆炸 war 中排除文件夹

java - Spring Boot 中从 org.joda.time.Interval 迁移

Java : Duplication of methods