ユースケース
ドメインモデリングを学びます
「ユースケース」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
ドメインをモデル化する
値クラスはドメインモデリングで特に力を発揮します。名前のないプリミティブ値を、実行時コストなしで意味のある、取り違えにくい型へ変えられます。
現実的なシナリオを見ていきましょう。
型付き識別子
独立したID型を使うと、注文IDが必要な場所にユーザーIDを渡すのを防げます。これはよくある、そして高くつくバグです。
@JvmInline
value class UserId(val value: Long)
@JvmInline
value class OrderId(val value: Long)
fun fetchUser(id: UserId) = "user " + id.value
fun main() {
println(fetchUser(UserId(7)))
}計量単位
数値を単位型でラップすると、誤ってメートルに秒を足すことを防げるうえ、その値の意味も明確になります。
@JvmInline
value class Kilograms(val value: Double)
fun describe(weight: Kilograms) = weight.value.toString() + " kg"
fun main() {
println(describe(Kilograms(72.5)))
}検証済み文字列
値クラスとinitブロックを組み合わせると、空白だけではないメールアドレスなどの不変条件を保証できます。
@JvmInline
value class Email(val value: String) {
init {
require(value.contains("@")) { "invalid email" }
}
}
fun main() {
println(Email("a@b.com").value)
}振る舞いを持つ金額
金額を最小単位で表現し、演算を追加することで、浮動小数点による通貨計算の誤差を避けられます。
@JvmInline
value class Cents(val value: Long) {
operator fun plus(other: Cents) = Cents(value + other.value)
fun format() = "$" + value / 100.0
}
fun main() {
val total = Cents(1500) + Cents(250)
println(total.format())
}自己説明的なAPI
値クラスを使った関数シグネチャは、意味の曖昧な3つの整数を受け取るシグネチャよりも、はるかに明確です。
@JvmInline
value class Width(val px: Int)
@JvmInline
value class Height(val px: Int)
fun area(w: Width, h: Height) = w.px * h.px
fun main() {
println(area(Width(4), Height(5)))
}機密データのラップ
値クラスでtoStringをオーバーライドすると、ログ内の機密情報をマスクしながら、元の値にはアクセスできます。
@JvmInline
value class Token(val value: String) {
override fun toString() = "Token(***)"
}
fun main() {
val t = Token("abc123")
println(t) // masked
println(t.value) // real value when needed
}範囲の強制
値クラスを使って範囲のルールを1か所に閉じ込めると、どこからも無効な状態を生成できないようにできます。
@JvmInline
value class Rating(val stars: Int) {
init {
require(stars in 1..5) { "stars must be 1..5" }
}
}
fun main() {
println(Rating(4).stars)
}スマートコンストラクター
値クラスに、入力が無効な場合はnullを返すコンパニオンファクトリーを組み合わせると、想定される失敗に対して例外を避けられます。
@JvmInline
value class Age(val value: Int) {
companion object {
fun of(n: Int): Age? = if (n in 0..150) Age(n) else null
}
}
fun main() {
println(Age.of(30)?.value)
println(Age.of(-5))
}パターンのまとめ
値クラスでよく使われるパターンは次のとおりです。
- 取り違えを防ぐ型付きID
- 計量単位
initで検証するプリミティブ値- 演算子によるドメイン操作
- 機密値のマスク
低コストな安全性
値クラスは通常インライン化されるため、これらのドメイン上の明確さと安全性を、ほぼゼロの実行時コストで得られます。違法な状態を表現できないようにするための、導入しやすい方法です。
理解度チェック
値クラスの利用例についての理解度を確認しましょう。
まとめ
値クラスの実用的な利用例を見てきました。
- 型付きID、単位、検証済み文字列
- 金額とドメイン操作
- 機密情報のマスクとスマートコンストラクター
次は、値クラスの制限を見ていきます。
AI チューターと学ぶ Kotlin — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「ユースケース」レッスンは無料ですか?
はい。「ユースケース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「ユースケース」で何を学びますか?
ドメインモデリングを学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ユースケース」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。