2016-07-27 32 views
2

我有一個方法,像這樣怎樣一個布爾值傳遞給方法用一個變量名

def uploadFile(String fileName, boolean performCleanup = false) { 
    //upload file 
    if (performCleanup == true) { 
     //delete local file 
    } 
} 

我把這種方法有兩種方式:

  1. uploadFile("/some/path/to/file.txt")
  2. uploadFile("/some/path/to/file.txt", true)

在第二種情況下,爲了更好的可讀性,我想傳遞一個變量名, st通過true的意義是什麼。

喜歡的東西,uploadFile("/some/path/to/file.txt", performCleanup: true")

這可能嗎?

+0

也許[這](http://mrhaki.blogspot.com/2009/09 /groovy-goodness-named-parameters-are.html)文章將會有所幫助。 – Opal

回答

2

通過引進和額外的關閉,你可以創建一個很好的可讀微DSL:

def performCleanup = { 
    println "cleanup $it" //delete local file 
} 
def upload(fileName) { 
    println "upload file $fileName" //upload file 
    [then: { action -> 
    action(fileName) 
    }] 
} 

upload "path" 
upload "path" then performCleanup 
2

可以使用Map來模擬命名ARGS:

def uploadFile(Map args) { 
    String fileName = args.fileName 

    // will default to false if omitted 
    boolean performCleanup = args.performCleanup 

    //upload file 
    if (performCleanup == true) { 
     //delete local file 
    } 
} 

然後,您可以調用使用

uploadFile(fileName: "/some/path/to/file.txt") 
uploadFile(fileName: "/some/path/to/file.txt", performCleanup: true) 

這種風格的方法有一些優點和相比,更典型風格利弊(其中每個值作爲單獨的參數傳遞):

  • 改善的呼叫站點可讀性
  • 聲明網站可讀性降低
  • 靈活性,例如您可以在不更新每個呼叫者的情況下向該方法添加/刪除參數
  • 編譯時安全性降低即使啓用了靜態編譯,你不能告訴每個呼叫者是否在提供必需的參數
0

我會想建議另一種方式在DSL上下的方式來使用它,通過返回的地圖可以響應performCleanup

def uploadFile(String fileName) { 
    //upload file 
    println "uploading file" 

    [performCleanup: { 
     //delete local file 
     println "cleaning up" 
    }] 
} 

uploadFile 'file' performCleanup() 

輸出:

$ groovy Clean.groovy 
uploading file 
cleaning up 

通過後不調用performCleanup(),它不會發生:

uploadFile 'file' 

輸出:

$ groovy Clean.groovy 
uploading file 
相關問題