我目前正试图围绕 Scala 进行思考,打算将其用于我的下一个必须处理 DICOM 的项目。DICOM 具有相当广泛的规范,跨越标准的数千页。我对DICOM的理解相当有限,但总之DICOM对象——IOD(Information Object Definition)是由Modules组成的,Modules是typed name-value属性对的集合。由于某些模块和属性的可选性,它变得更加复杂。例如:
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 具有强大的建模能力,包括所有特征、案例类、动态类等。你将如何在 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
}
等等。关于镜头,编码所有样板文件可能会成为一个问题——镜头的顺序将覆盖IOD、模块和属性M x N x L
的整个域。此外,某些领域的可选性至少使任务变得非常复杂。M
N
L
scalaz-seven
那里还有哪些符合 Scala 精神的可行方法?