Kotlin Academy · レッスン

ユースケース

ドメインモデリングを学びます

レッスン 3/413 ステップ

「ユースケース」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 型エイリアス
  2. インライン値クラス
  3. ユースケース
  4. 制限事項
← Kotlin Academyに戻る