如何将这个简单的OOP程序转换为函数式编程语言?

Tin*_*uSa 2 java oop haskell functional-programming clojure

在过去的几个月里,我尝试使用函数式编程范例进行编码.现在我有一个OOP解决方案,我正在尝试找到一个功能性解决方案.

问题很简单.我有一个算法,它产生两个不同的数组作为结果(a和b).现在,我想检查结果有多好.因此,我为他们写了几个评估标准.我希望伪java源代码对你没问题!

// first the Algorithm class
class Algorithm {
    private []a;
    private []b;

    Algorithm(input) {
        computeResult();
    }

    getA(){return a;}
    getB(){return b;}

    void computeResult() { 
        ... 
        ... // time-consuming operations 
        ... // set values for a and b
        ...
    }
}

// this class tests the Algorithm using a list of evaluation criteria
class AlgorithmTest {

    AlgorithmTest() {
        ... 
        ... // Definition of input
        ... // Definition of list of evaluation criteria evals
        ...
        Algorithm algorithm = new Algorithm(input); // Compute the result

        for (EvaluationCriterion eval : evals) {
            System.out.println(eval.getClassSimpleName()); // Print name of class
            System.out.println(eval.evaluate(algorithm));  // Print evaluation result
        }
    }

    main () {
        new AlgorithmTest();
    }
}

interface EvaluationCriterion {
    double evaluate(Algorithm a);
}

// an example implementation of a criterion
class EvaluationA implements EvalutationCriterion{
    double evaluation(Algorithm algorithm) {
        a = algorithm.getA();
        b = algorithm.getB();
        double c = anotherComputation(a, b);
        return c;
    }

    double anotherComputation(a, result){
        ... // compute and return result
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用函数式编程范例"转换"此源代码?我很确定,但是你还能像OOP方法一样轻松添加新的评估标准吗?

我可以编写一个名为algorithm的模块,其中包含计算a或b的纯函数.在这种情况下,我必须计算两次,这需要很多时间.

但是如何使用多个评估函数进行评估?

kee*_*gan 11

但是如何使用多个评估函数进行评估?

您将传递要使用的函数作为一等值.

您的类型EvaluationCriterion基本上只是函数类型Algorithm -> Double(在Haskell语法中). EvaluationA,EvaluationB等,并不需要有新的类型.它们只是类型的价值EvaluationCriterion.您可以将它们作为值传递,构建类型列表[EvaluationCriterion]等.

具有讽刺意味的是,您已经在解决方案中使用了一流的功能.这种抽象弱的OOP语言缺乏一流的功能,因此您必须应用标准化的解决方法("设计模式").将其转换为函数式语言(或仅仅是合理的OOP语言)是一个消除复杂性的问题.

现在,关于如何消除状态Algorithm,我没有想到这一点.但请记住,FP并不意味着"没有状态".缓存纯函数结果是很常见的事情.