プログラミング
Codes – KotlinおよびJava向けの型付けされたアプリケーション結果
Codes – typed application outcomes for Kotlin and Java (github.com)
要約
Codesは、JVMアプリケーション向けの安定したアプリケーション結果識別子と明示的な境界マッピングを提供するライブラリです。HTTPやgRPCなどのプロトコルに依存せず、アプリケーション固有の結果モデルをシステム全体で一貫して扱うことを可能にします。GradleやMavenでの依存関係の追加方法や、カスタム結果の定義、標準結果、およびHTTPやgRPCへのマッピング方法が示されています。
全文翻訳
Codes Java 17+. ランタイム依存関係ゼロ。
Codesは、JVMアプリケーション向けの安定したアプリケーション結果識別子と明示的な境界マッピングを提供します。
アプリケーションは独自のドメイン結果またはエラーモデルを維持し、システム内の複数の部分がHTTP、gRPC、シリアライゼーション、またはフレームワークにその意味を結合することなく、結果の意味について合意する必要がある場合にCodesを使用します。
ドメインの結果は、境界を越えて同じ識別子を維持できます:com.example.payments:PAYMENT_DECLINED | +-- HTTP 422 +-- gRPC FAILED_PRECONDITION +-- logs/metrics keep Payment_DECLINED
インストール
Gradle:
dependencies {
implementation("io.github.aalsanie:codes:0.3.1")
}
Maven:
<dependency>
<groupId>io.github.aalsanie</groupId>
<artifactId>codes</artifactId>
<version>0.3.1</version>
</dependency>
Java 17+. ランタイム依存関係ゼロ。
Kotlinアプリケーションは、JSpecify nullabilityメタデータを使用して同じJava APIを利用します。
カスタム結果
OutcomeDefinition paymentDeclined = OutcomeDefinition.custom(
"com.example.payments",
"PAYMENT_DECLINED",
OutcomeState.FAILED,
"The payment was declined."
);
Outcome outcome = Outcome.of(paymentDeclined);
HttpOutcomeMapper http = HttpOutcomeMapper.standard()
.withMapping(paymentDeclined, HttpStatusCode.of(422));
GrpcOutcomeMapper grpc = GrpcOutcomeMapper.standard()
.withMapping(paymentDeclined, GrpcStatusCode.FAILED_PRECONDITION);
OutcomeCode は安定したマシン識別子です。プロトコルマッピングはその識別子を変更しません。
標準結果
OK
INVALID_ARGUMENT
UNAUTHENTICATED
PERMISSION_DENIED
NOT_FOUND
ALREADY_EXISTS
FAILED_PRECONDITION
OUT_OF_RANGE
RATE_LIMITED
CANCELLED
DEADLINE_EXCEEDED
ABORTED
UNIMPLEMENTED
UNAVAILABLE
INTERNAL
DATA_LOSS
RESOURCE_EXHAUSTED
OK は標準の成功結果です。
標準カタログが操作に一致しない場合、アプリケーションはドメイン固有の成功、保留中、および失敗の結果を定義します。
ランタイム発生例
Outcome outcome = Outcome.of(
StandardOutcomes.NOT_FOUND,
"customerId=123"
);
System.out.println(outcome.getCode());
System.out.println(outcome.getMessage());
System.out.println(outcome.getDetail());
メッセージは再利用可能な定義から来ます。詳細はその発生例に属します。
構造化された問題
ValidationResult validation = ValidationResult.invalid(
Issue.at("email", "Invalid email address.")
);
Outcome outcome = validation.toOutcome(StandardOutcomes.INVALID_ARGUMENT);
ValidationResult は問題を集約するための小さな便利なクラスです。アプリケーションの結果、検証、または関数型プログラミングモデルを置き換えることを意図したものではありません。
HTTP
HttpStatusCode status = HttpOutcomeMapper.standard()
.map(StandardOutcomes.NOT_FOUND)
.orNull();
assert status == HttpStatusCode.NOT_FOUND;
一部の標準結果は、正しいステータスがアプリケーションに依存するため、HTTPに対して意図的にマッピングされていません。
gRPC
GrpcStatusCode status = GrpcOutcomeMapper.standard()
.map(StandardOutcomes.NOT_FOUND)
.orNull();
assert status == GrpcStatusCode.NOT_FOUND;
標準gRPCマッパーはすべての標準結果をカバーしています。
Kotlin
Javaのgetterとスタティックファクトリは、Kotlinのプロパティと呼び出しとして直接使用できます:
val outcome = Outcome.of(StandardOutcomes.NOT_FOUND, "customerId=123")
val status = HttpOutcomeMapper.standard().map(outcome).orNull()
check(outcome.code == StandardOutcomes.NOT_FOUND.code)
check(status?.value == 404)
参照
セマンティック契約
HTTPおよびgRPCマッピング
互換性ポリシー
ライセンス
Apache License 2.0。