2016-07-29 16 views
0

私はPlay2フレームワークを学習しており、暗黙の関数の使用を開始しています。私は、JSONに、いくつかのPositionオブジェクトを変換しています:スカラ:オブジェクトまたはクラス内の暗黙の関数を定義する

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 
    ) 
    } 
} 

そしてこのclassまたはobjectどここれらの暗黙の関数をインポート使用されます。

このような暗黙的な関数のインスタンスとスケーラビリティの根本的な違いは、たとえば並行して呼び出される場合などです。

+0

「どのようにクラスをインポートするのですか」それを試してみてください... – Dima

答えて

1

本当にどちらもありません。すべてのドメインをまとめて維持するための、よりクリーンな方法があります。人々は通常、忘れる傾向があります。あなたが実際にそれらを置くべき場所あなたがここにコンパニオンオブジェクトに

をimplictを置くことができます

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

Tank you Soroosh Sarabadani、PositionをJsonに変換する各関数のスコープにインスタンス(インスタンス化されたクラス:objectifではなくシングルトンではない)を持つことを考えていましたか?副作用がないという事実は、その関数がシングルトンから同時に呼び出されることを意味しますか? – Antonin

+0

あなたはそれを本当に行う必要はなく、スケーラビリティについて心配する必要はありません。 クラスには状態がないので、何回もインスタンス化すると結果はありません。 参照透過性は、問題なく並行してメソッドを呼び出す正当な理由です。 これらの種類の関数の並行呼び出しのビルリオンは、ボトルネックや問題を何ら作成せずに実行できます。 –

+0

ありがとうSoroosh! – Antonin

関連する問題