Robustum / robustum-core

A core library for robustum mods
Mozilla Public License 2.0
3 stars 1 forks source link

Improve Tag<T>.values() method #15

Open Hiiragi283 opened 2 months ago

Hiiragi283 commented 2 months ago

実装次第ではTag<T>.values()を呼ぶと例外を吐かれる 現状らぎマテで使ってるのはこれ

fun <T : Any> Tag<T>.safeValues(): List<T> = try {
    values()
} catch (e: Exception) {
    listOf()
}

これを改善して

fun <T: Any> Tag<T>.valueResult: Result<List<T>>
  get() = runCatching { values() }

的なのをつくれないだろうか

Hiiragi283 commented 2 months ago

これTag.Identified<T>にも使えるんじゃね?

fun <T: Any> Tag<T>.idResult: Result<Identifier>
  get() = runCatching { (this as Tag.Identified<T>).id }
Hiiragi283 commented 2 months ago

ただなんでもかんでもResult<T>で包んじゃっていいのだろうか

turtton commented 2 months ago

失敗する可能性を型で表現するためにResultを使うのは良いことだと思いますよ ただ命名はtryGetId()みたいにしたほうが良いかも?

Hiiragi283 commented 2 months ago

そもkotlinでメソッドの表記を括弧つけるかつけないかのルールってあるんすかね(素朴な疑問)

toliner commented 2 months ago

Resultを使うか使わないか、全体を通して方針を統一しないと無秩序になるので、何かしらの統一はしたい そんでぱっと思いついた指針

Tag<T>.values()は、「値が存在しない」事に起因すると思うので、nullを返す(か空のリストを返す)のが良いと思う

Hiiragi283 commented 2 months ago

List<T>?は気持ち悪いからemptyList()すかね

turtton commented 2 months ago

Tag.values()は、「値が存在しない」事に起因すると思うので、nullを返す(か空のリストを返す)のが良いと思う

これちゃんと確認したんですけど、吐かれる可能性あるのは IllegalStateException みたいですね。例外潰してemptyList返すなら一応warnで例外をログに流すとかはした方が良いかもしれません

Hiiragi283 commented 2 months ago

こんな感じかな

fun <T : Any> Tag<T>.safeValues(): List<T> = runCatching { values() }
    .onFailure { e: Throwable -> HTLogger.log { logger: Logger -> logger.throwing(e) } }
    .getOrDefault(emptyList())