2017-10-19 58 views
3

目前我有一種方法,接受ModelA並知道對它執行操作。斯卡拉的最佳做法是什麼將有一種方法接受兩種不同的模型

因此,在我的控制器中,我接受ModelA的請求並使用它調用此方法。

現在,我想能夠接受ModelB的請求,將請求映射爲ModelA(導致它具有相同的數據,而不是全部和不同的名稱),並調用此方法。

可以說,該方法將如下所示:

def myMethod(data: ModelA): ResModel = { 
    // do something with data 
} 

我控制器currrently是:

def doActions(): Action[JValue] = { request => 
    val dataExctracted = request.body.extract[ModelA] 
    myMethod(dataExctracted) 
    ... 
} 

和我的兩個型號都是在單獨的文件只是case類:

case class ModelA(a: String, b: String, c: String) 

case class ModelB(aAsDifferentName: String, bAsDifferntName: String) 

Scala的最佳實踐是讓myMethod接受兩種模型(沒有Either)?以及控制器應該如何反應?

是否還有一種經典的方式來返回不同的模型,而不必接受不同控制器方法中的調用?

謝謝!

+2

讓他們實現一個虛擬特質並對類型進行模式匹配。 –

+1

你如何決定從request.body中提取什麼類型? – laughedelic

回答

-1

您可以嘗試建立聯合類型的模型(如Dotty中的Int | String)。

事情是這樣的:

scala> case class Or[A, B](a: A, b: B) 
defined class Or 

scala> def test(v: Int Or String): String = { 
    | v.toString 
    | } 
test: (v: Or[Int,String])String 

scala> implicit def Int2Or(x: Int): Int Or String = Or(x, "") 
Int2Or: (x: Int)Or[Int,String] 

scala> implicit def String2Or(x: String): Int Or String = Or(-1, x) 
String2Or: (x: String)Or[Int,String] 

scala> test(1) 
res0: String = Or(1,) 

scala> test("") 
res1: String = Or(-1,) 

很酷的事情是,你可以使用Or類這樣String Or Boolean,但是這絕對不是從斑點狗真正聯合類型。

在我看來,海峽前沿的解決方案是使用密封的特質並進行模式匹配。

+0

問題是你怎麼知道'Or(-1,「)是什麼?案例類是一種產品類型,當我們想要的是一個聯合類型(密封特質)。直接的解決方案是既不做也不使用不同的路線! :p –

+1

@AndyHayden好點!當然,正如我所說,更簡單的解決方案是使用特質或甚至重載的方法。 – leshkin

+0

這只是使用'Either'的改進? OP表示他們不想使用'Either',但是你的'Or'只是用另一個名字'Either',除了(正如Andy所指出的)錯誤實施的情況。 –

相關問題