時間間隔を処理するための単純な API を作成しようとしています。(私は joda time を認識しており、それを再発明しようとしているわけではありません。これはむしろ演習です)。
私が達成したいのはこれです:
(1)
assert(from("20:30").to("20:50") == Interval("20:30", "20:50") )
//same thing, but without implicit defs
assert(from(Time(20, 30)).to(Time(20, 50)) == Interval(Time(20, 30), Time(20, 50)))
(2)
assert(from("20:30").forMinutes(10) == from("20:30").to("20:40"))
次のように(1)を実装することができました:(toString、Ordered trait、asoを無視)
case class Time(hour: Int, minute: Int)
case class Interval(start: Time, end: Time)
object Interval {
case class HalfInterval(half: Time => Interval) {
def to(time: Time): Interval = half(time)
def forMinutes(minutes: Int): Interval = ???
}
def from(start: Time): HalfInterval = HalfInterval(Interval(start, _))
}
object Time {
def apply(hourMinute: String): Time = {
val tries = hourMinute.split(":").map(s => Try(s.toInt))
tries match {
case Array(Success(hour), Success(minute)) => Time(hour, minute)
case _ => throw new IllegalArgumentException
}
}
implicit def stringToTime(hourMinute: String) = Time(hourMinute)
}
ただし、(2) (つまり Interval.forMinutes) の実装方法がわかりません。
def forMinutes(minutes: Int): Interval = {
val time = ?? // Based on what Time object could I construct a new Time object here?
half(time)
}
これについて頭を包むことはできないようです。
この「HalfInterval」ラッパーTime => Interval
はまったく意味がありますか? 機能概念モデルを念頭に置くのではなく
、呼び出しが計画どおりに機能するように、経験的に設計しました。
このAPIを達成するためのより良い方法はありますか?from(..).to(..)
ありがとう