【发布时间】:2012-05-24 07:49:14
【问题描述】:
我正在尝试使用 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 的入门项目),并且我希望所有对象的事情都保持一致。
- 通话中有一些数据可能不是每个人都需要的。使用第二种方法,如果对象列表变得更大,我可以将惰性 val 用于对象列表,否则使用正常的 val。对程序员来说,这没什么区别。
- 另一方面,创建对象所需的数据解析现在与对象本身分离(如上例所示)
哪种方法更好地解决问题?
【问题讨论】:
标签: xml scala lazy-evaluation