この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
+、* の演算子で1年たす、1日たすを実装しよう。
Implement a kind of date arithmetic. Support adding years, weeks and days to a date. You could be able to write the code like this: date + YEAR * 2 + WEEK * 3 + DAY * 15.
At first, add an extension function 'plus()' to MyDate, taking a TimeInterval as an argument. Use an utility function MyDate.addTimeIntervals() declared in DateUtil.kt
Then, try to support adding several time intervals to a date. You may need an extra class.
import TimeInterval.*
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)
enum class TimeInterval { DAY, WEEK, YEAR }
operator fun MyDate.plus(timeInterval: TimeInterval): MyDate = TODO()
fun task1(today: MyDate): MyDate {
return today + YEAR + WEEK
}
fun task2(today: MyDate): MyDate {
TODO("Uncomment") //return today + YEAR * 2 + WEEK * 3 + DAY * 5
}
import java.util.Calendar
fun MyDate.addTimeIntervals(timeInterval: TimeInterval, number: Int): MyDate {
val c = Calendar.getInstance()
c.set(year, month, dayOfMonth)
when (timeInterval) {
TimeInterval.DAY -> c.add(Calendar.DAY_OF_MONTH, number)
TimeInterval.WEEK -> c.add(Calendar.WEEK_OF_MONTH, number)
TimeInterval.YEAR -> c.add(Calendar.YEAR, number)
}
return MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE))
}
狙い
ここで考えて欲しい問題の意図はなんだろうか?
today + YEAR * 2 + WEEK * 3 + DAY * 5
こういう記述が、本当に幸せかっというのはおいておいて、作れる技術は身につけよう。いつか役に立つはず。
解答例
operator fun MyDate.plus(timeInterval: TimeInterval) = addTimeIntervals(timeInterval, 1)
class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)
operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval) = addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)
今回もこちらのルールに則りoverloadします。
Operator overloading - Kotlin Programming Language
MyDate.addTimeIntervalsをすでに用意してくれている状態なので、それぞれの演算子の意味に合わせて呼んであげればいいだけです。
オレオレ演算子の規約は簡単につくれます。
この章は毎日連続した課題です。だんだんついてくるのがしんどくなってきたと思います。この章の終わりにハイライト記事をかくので、お楽しみに。
あとがき
Day20.でまたお会いしましょう。