簡體   English   中英

低階函數式編程,在Scala中是一種好的樣式嗎?

[英]Lower Order Functional Programming, is it a good style in Scala?

我想知道在Scala中應用函數式編程風格是否是一個好習慣,即使這是一個簡單的切換案例工作流。

例如:

程序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中哪種風格更好,為什么?

是的,因為函數語言傾向於將函數作為第一類對象,並且強調傳遞函數以簡化代碼,所以可以認為使用更高階的函數更傾向於函數。

就是說 ,傳遞函數只是傳遞函數沒有用。 如果您有合法的用例,請確保! 如果認為可以幫助您編寫更好的代碼,請利用所需的任何工具。 不過,請確保您正確使用了這些工具。

至少在本示例中,第一部分代碼的問題是,您無法通過傳入method12來獲得任何收益。您只是在不同的范圍內調用該函數,僅此而已,我看不出有什么幫助。

使用高階函數可以從哪里獲得收益? 假設您有幾種方法,並且所有方法都可能引發相同的異常,並且它們都需要以相同的常規方式處理其異常。 您有什么選擇?

  • 您可以在對每個方法的每次調用周圍寫出重復的try塊。 但是,這很快就會腫,當您需要更改功能時會發生什么?

  • 您可以編寫一個包含通用代碼的高階函數,然后將throwing函數傳入其中。 在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)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM