簡體   English   中英

使代碼更符合Scala習慣

[英]Making code more scala idiomatic

我在Scala項目中遇到了以下類似Java的代碼。 如何使它更符合Scala習慣用法而沒有副作用(適當地處理異常)?

我正在考慮使用scalaz析取/(我知道我也可以使用Scala,但我猜想像右偏)。 在一個函數中,有一些這樣的if校驗(上面的一個示例)拋出了一種或另一種異常。 如何使這樣的代碼更符合Scala習慣?

編輯:問題不在於如何將Java空檢查轉換為我已經在做的Scala Idiomatic。 例如

hpi.fold(throw new Exception("Instance not found for id " + processInstanceId)) { h =>
  val pi = new ProcessInstance(taskResponse)

現在,現有函數的返回類型是某個值,例如“ ProcessInstance”,但在我看來是令人誤解的。 調用者永遠不會知道這是否會引發異常,因此我的問題更多是關於從此類函數返回Either [Error,Value]。 如果我將少數此類異常捕獲到單個函數中,那么如何將它們全部累加並反映為返回類型?

有一種想法可能會使processDefinition.getDiagramResourceName()返回一個Option ,因此您可以檢查結果是Some(x)還是None

使用scalaz並習慣用法,這可能是我最終會遇到的問題(需要重構):

for {
    pd <- Option(processDefinition.getDiagramResourceName()).\/>("Diagram resource could not be found")
} yield pd

因此,如果您為null,則返回Left("Diagram resource could not be found")否則返回Right(DiagramResourceName)

一種基於案例類的方法,其中可以定義名稱,引用或標簽的不同子類,

trait ResourceName
case object MissingName extends ResourceName
case class DiagramResourceName(name: String) extends ResourceName
case class AnotherResourceName(ref: Int) extends ResourceName

processDefinition.getDiagramResourceName() match {
  case DiagramResourceName(name) => println(s"name $name")
  case MissingName               => throw new ActivityException(errorMessage)
}

暫無
暫無

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

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