我目前正试图围绕斯卡拉思考,并打算将它用于我的下一个必须处理DICOM的项目。 DICOM具有相当广泛的规范,涵盖了数千页标准。我对DICOM的理解非常有限,但简而言之,DICOM对象 - IOD(信息对象定义)由模块组成,而模块是类型化的名称 - 值属性对的集合。某些模块和属性的选择性使其更加复杂。例如:斯卡拉 - 域对象建模
SimpleImageIOD: {
PatientModule: {
name: String
dateOfBirth: DateTime
}
StudyModule: {
name: String
date: DateTime (optional)
}
SeriesModule: {
name: String
}
ImageModule: {
height: Integer
width: Integer
pixelSize: Double (optional)
}
EquipmentModule: { (optional)
type: String
}
}
有很多模块,它们可能以不同的组合形成不同的IOD。斯卡拉反过来拥有所有特性,案例类,动态类等丰富的建模能力。你将如何在Scala中建模这样的领域?我很新的语言,但我一直在想使用一成不变的情况下类来定义模块,然后在不同的IOD聚集他们,并用镜头更新:
case class Patient(name: String, dateOfBirth: DateTime)
case class Study(name: String, date: Option[DateTime])
case class Series(name: String)
case class Image(height: Integer, width: Integer, pixelSize: Option[Double])
case class Equipment(type: String)
case class SimpleImageIOD(patient: Patient, study: Study, series: Series,
image: Image, equipment: Option[Equipment])
object Patient {
val nameL: Lens[Patient, String] = ...
val dateOfBirthL: Lens[Patient, DateTime] = ...
}
object SimpleImageIOD {
val patientL: Lens[SimpleImageIOD, Patient] = ...
val patientNamel = patientL andThen Patient.nameL
}
等等等等,对于镜头它可能会成为一个问题,编码所有的样板 - 将有M x N x L
镜头的订单覆盖整个域的M
IOD,N
模块和L
属性。另外一些领域的可选性使得任务极其复杂,至少在scalaz-seven
。
还有哪些其他可行的方法可以与Scala的精神保持一致?
你是什么意思的“嵌套镜头”? – 2013-03-23 23:33:34
@ak。 - 好吧,“写作”真的。如果你有'Long => Patient'和'Patient => SimpleImageIOD'这样的东西,你可以编写它们来得到一个'Long => SimpleImageIOD'。你不需要建立所有的可能性;你可以在你使用它们的地方做到这一点。 – 2013-03-23 23:49:37
在斯卡拉镜片方面,你可能意指'和那么'而不是'撰写'。我认为将'compose'应用于两个镜头'Long => Patient'和'String => Patient'会产生一个镜头,它能够做到(Long,String)=> Patient'。但重点不在镜架上套上镜头,对吗? – 2013-03-24 15:17:16