2016-07-29 61 views
0

我正在學習Play2框架並開始使用隱式函數。我把一些Position對象JSON:Scala:定義對象或類中的隱式函數

implicit val locationWrites = new Writes[Position] { 
    def writes(position: Position) = Json.obj(
     "lat" -> position.lat, 
     "lon" -> position.lon 
    ) 
} 

我應該做的:

object JsonConversion { 
    implicit val locationWrites = new Writes[Position] { 
    def writes(position: Position) = Json.obj(
     "lat" -> position.lat, 
     "lon" -> position.lon 
    ) 
    } 
} 

,或者我應該做的事:

class JsonConversion { 
    implicit val locationWrites = new Writes[Position] { 
    def writes(position: Position) = Json.obj(
     "lat" -> position.lat, 
     "lon" -> position.lon 
    ) 
    } 
} 

,然後導入此classobject當這些隱函數將會被使用。

這些隱式函數的實例和可伸縮性方面的根本區別是什麼,例如,如果它們要以併發方式調用?

+0

你打算怎樣「導入班級」?試試吧...... – Dima

回答

1

也沒有。有一種更簡潔的方式來保持你所有的域名和人們通常會忘記的東西。 您可以在同伴對象

把隱在這裏你真的應該把他們:

class Position { ... } 
object Position { 
    implicit val positionWrites = new Writes[Position] { 
    def writes(position: Position) = Json.obj(
    "lat" -> position.lat, 
    "lon" -> position.lon 
    ) 
    } 
} 

默認情況下,隱式解析,將調查對象的同伴。這可以防止域名被分散,並且不會出現充滿JSON格式的奇怪文件。您可以將事情保持在正確的位置,並且如果您更新課程,則很容易知道哪些內容需要更改。

在附註中,Play使用一些有趣的宏來生成更高級的JSON格式。您可以使用Json.format[Type]Json.writes[Type]或僅使用Json.reads[Type]來簡單生成您需要的格式而無需手動操作。

implicit val positionFormat = Json.format[Position] 
+0

將領域模型與json職員耦合是你應該避免的事情之一。 格式化程序主要用於api/service/web模塊。然而,領域模型本身來自業務問題,並沒有任何關於如何將其表示給客戶端的問題。 我確定沒有人喜歡更改域模型來爲ProtoBuf,Avro,XML等添加新的格式化程序... –

+0

嗨@SorooshSarabadani你已經有一個簡單的遊戲應用程序爲剛剛開始的人。大多數人都有千變萬化的特質,這是一條路,但對於簡單的情況,你爲什麼過度複雜? – flavian

+0

嗨弗拉維安,我只是解釋爲什麼有經驗的開發人員往往會忘記這麼簡單的事情;) –

0

只要把你的隱式方法中的對象,並以這種方式導入:

import JsonConversion._ 

從性能的角度來看,你不應該有任何顧慮,因爲很多電話可以用無副作用執行。

+0

坦克你Soroosh Sarabadani,我想在每個函數轉換位置到Json的範圍內有一個實例(一個實例化的類:objectif但不是單例)?沒有副作用這一事實意味着函數可以從一個單一的併發方式調用? – Antonin

+0

你並不需要這麼做,也不必擔心可擴展性。 由於你的班級沒有任何狀態,所以多次實例化它對你來說沒有任何結果。 引用透明是以並行方式調用方法而沒有任何問題的一個很好的理由。可以執行這些類型函數的併發調用,而不會造成任何種類的瓶頸或問題。 –

+0

感謝Soroosh! – Antonin