Scala を使用してlast.fmからのartist.getInfo呼び出しを解析しようとしています。scala の Xml API は非常に優れていますが、デザイン (およびおそらく個人的な趣向) について疑問があります。
現在、コンパニオン オブジェクトの XML からデータを解析し、次のようにクラスのコンストラクターに渡します。
class ArtistProfile (
name: String,
musicBrainzId: String,
url: String,
images: List[Image],
streamable: Boolean,
listeners: Int,
plays: Int,
similarArtists:List[SimpleArtist])
object ArtistProfile {
def apply(xml: NodeSeq) : ArtistProfile = {
val root = xml
val name = SimpleArtist.extractName(root);
val url = SimpleArtist.extractUrl(root);
val musicBrainzId = root \ "musicBrainzId" text
val images:List[Image] = Image.findAllIn(root)
val streamable = (root \ "streamable" text) eq ("1")
val listeners = (root \ "stats" \ "listeners").text.toInt
val plays = (root \ "stats" \ "plays").text.toInt
new ArtistProfile(
name,
url,
musicBrainzId,
images,
streamable,
listeners,
plays,
SimpleArtist.findAllIn(xml \ "similar"))
}
}
ご覧のとおり、これらは多数のパラメーターです。私の質問は、xml NodeSeq を ArtistProfile コンストラクターに渡す方が (scala の機能の点で) より良いスタイルになるかどうかです。そのため、クラス自体がコンパニオン オブジェクトではなく解析を引き継ぎます。
独自の last.fm scala ライブラリ (scala の入門プロジェクトとして) を作成しようとしており、すべてのオブジェクトで一貫性を保ちたいため、これを求めています。
- 通話には、すべての人が必要としない可能性のあるデータがいくつかあります。2 番目のアプローチでは、オブジェクト リストが大きくなる場合は遅延 val を使用し、それ以外の場合は通常の val を使用できます。プログラマにとっては、違いはありません。
- 一方、オブジェクトの作成に必要なデータの解析は、オブジェクト自体から分離されています (上記の例のように)。
問題へのより良いアプローチはどれですか?