私は現在、DICOM を扱う必要がある次のプロジェクトで Scala を使用するつもりで、Scala に取り組もうとしています。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 には、すべてのトレイト、ケース クラス、動的クラスなどを備えた多くのモデリング機能があります。そのようなドメインを 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 の精神に沿った実行可能なアプローチは他にあるでしょうか?