我想知道在Scala中应用函数式编程风格是否是一个好习惯,即使它是一个简单的switch case工作流程。
例如:
计划1:
def myMethod1():Unit = {
....
}
def myMethod2():Unit = {
...
}
def execFunc(myMethod: Unit=>Unit): Unit ={
myMethod(...)
}
def main((args:Array[String]) {
if(args(0) == "1")
{
execFunc(myMethod1)
}
else
{
execFunc(myMethod2)
}
}
计划2:
def myMethod1():Unit = {
....
}
def myMethod2():Unit = {
...
}
def execFunc(methodID:String): Unit ={
if(methodID == "1")
{
myMethod1()
}
else
{
myMethod2()
}
}
def main((args:Array[String]) {
execFunc(args(0))
}
程序1直接传递方法作为参数,程序2是处理切换任务的传统方式。
我想知道,在Scala中,哪种风格更好,为什么?
答案 0 :(得分:3)
是的,因为函数式语言往往具有作为第一类对象的函数,并且强调传递函数以简化代码,所以可以认为使用更高阶函数更具功能性。
那说,传递函数只是为了传递函数并不是很有用。如果您有合法的用例,请务必!如果您认为它可以帮助您编写更好的代码,请使用您需要的任何工具。请确保您正确使用这些工具。
您的第一段代码的问题是,至少在此示例中,您通过传递method1
和2
来获得 nothing 。您只是在不同的范围内调用该功能,单独一点,我看不到任何帮助。
您可以从使用更高阶函数中获得什么?假设您有几个方法,并且所有方法都可能抛出相同的异常,并且它们都需要以相同的一般方式处理它们的异常。你有什么选择?
您可以在每次调用每个方法时写出重复的try
块。但是,这可能会变得臃肿,当您需要更改功能时会发生什么?
你可以编写一个包含公共代码的高阶函数,并传递throw函数;在try块中执行它(我的Scala非常生疏):
def handle(f: () => Int, throwDefault: Int): Int = {
try {
return f();
} catch {
case e: SomeException => {
logOrWhatever(e);
return throwDefault;
}
}
}
println(handle(method1, 5))
println(handle(method2, 10))