Yan*_*eve 6 java functional-programming scala idiomatic
我是一名Java程序员,正在迈向Scala编程.
我已经定义了一个类似的函数(可能是惯用错误,我不知道......):
def someGenericAlgorithm(param1: String, param1: String, param3: String) = {
    val triedResult1 = someFunction(param1)
    triedResult1 match {
      case Success(result1) =>
        val triedResult2 = someOtherFunction(param2)
        triedResult2 match {
          case Success(result2) =>
            val triedPolymorphicResult = someToBeReplacedAccordingToSpecificLogicFunction(result1, result2, param3)
            triedPolymorphicResult match {
              case Success(polymorphicResult) =>
                doSomethingGeneric(polymorphicResult)                    
                ....
              case Failure(exception) =>
                ....
            }
          case Failure(exception) =>
            ....
        }
      case Failure(exception) =>
        ....
    }
  }
因此该函数接收3个参数,按顺序处理前两个参数,获取处理结果并将其传递给someToBeReplacedAccordingToSpecificLogicFunction第三个参数的旁边.
现在我希望编写一个类似的函数,因为前两个函数调用存在,错误逻辑是相同的,唯一的区别someToBeReplacedAccordingToSpecificLogicFunction是现在是aReplacementLogicFunction.
如果两个函数具有相同的签名,我想这不会是一个问题,但是,它们没有,它aReplacementLogicFunction有不同的参数,更具体地说,还有两个参数.那么你可以说,我可以在第一种情况下传入Option这两个Options的参数None,这样我就可以将我的两个函数对齐为相同的签名,因此:
def someToBeReplacedAccordingToSpecificLogicFunction(result1: Int, result2: Int, param3: String, unused1:Option[String] = None, unused2:Option[String] = None)
def aReplacementLogicFunction(result1: Int, result2: Int, param3: String, used1:Option[String], used2:Option[String])
但是,存在第三个流,其中第一个函数的不存在的参数是不同类型的,例如MyClass,例如:
def anotherReplacementLogicFunction(result1: Int, result2: Int, param3: String, used1: MyClass, used2: MyClass)
那么问题是,如何将这些函数通知为一些重构的通用算法函数,该函数将接收函数作为参数.有没有办法定义像:
def refactoredOutCoreLogic(param1: String, param1: String, param3: String, polimorphicFunction: SignatureUnknown)
用Java回答我自己的问题:
我在Java中解决这个问题的方法是定义一个类层次结构,类似于:
abstract class ResultKeeperRunnable implements Runnable {
    protected int param1, param2;
    void setParam1(...) {...}
    void setParam2(...) {...}
}
class SomeToBeReplacedAccordingToSpecificLogicFunctionClass extends ResultKeeperRunnable  {
    String param3;
    // ctor receiving all params omitted for brevity 
    void run() {
      // do specific Logic
    }
}
class AReplacementLogicFunctionClass extends ResultKeeperRunnable {
    String param3, param4, param5;
    // ctor receiving all params omitted for brevity 
    void run() {
      // do specific Logic
    }
}
class AnotherReplacementLogicFunctionClass extends ResultKeeperRunnable {
    String param3;
    MyClass param4, param5;
    // ctor receiving all params omitted for brevity 
    void run() {
      // do specific Logic
    }
}
最后,核心逻辑方法的因素将是:
void refactoredOutCoreLogic(String param1, String param2, String param3, ResultKeeperRunnable polimorphicLogic) {
    // error handling logic removed for brevity
    int result1 = someMethod(param1);
    int result2 = someOtherMethod(param2);
    polymorphicLogic.setParam1(result1);
    polymorphicLogic.setParam2(result2);
    polymorphicLogic.run()
    ...
}
Scala解决方案不再是上面提到的Java解决方案的语法上不同的克隆吗?似乎应该有一个更优雅的解决方案.
您有一个接受result1、result2和一堆其他参数的函数。
您想要result1一个只接受和 的函数result2。
为此,请使用部分应用程序。像这样编写可替换函数,并在末尾添加第二组括号来保存公共参数:
def aReplacementLogicFunction(param3: String, used1:Option[String], used2:Option[String])(result1: Int, result2: Int)
然后将部分应用的函数传递到您的通用函数中,如下所示:
someGenericAlgorithm(param1, param2, aReplacementLogicFunction(param3, used1, used2))
就通用算法而言,它完全不知道额外的参数。这些都是在调用函数之前应用的。
| 归档时间: | 
 | 
| 查看次数: | 157 次 | 
| 最近记录: |