Skip to content

Commit a0e50ab

Browse files
committed
Kotlin のサポートについてドキュメントを追加
1 parent 2c157c5 commit a0e50ab

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

docs/sources/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ User Documentation
5252
transaction
5353
annotation-processing
5454
build
55+
kotlin-support
5556

5657
Developer Documentation
5758
=======================

docs/sources/kotlin-support.rst

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
==================
2+
Kotlin サポート
3+
==================
4+
5+
.. contents:: 目次
6+
:depth: 3
7+
8+
Doma は `Kotlin <https://kotlinlang.org/>`_ を実験的にサポートしています。
9+
10+
Kotlin利用のベストプラクティス
11+
================================
12+
13+
クラスの定義やビルドに関する事柄について推奨する方法を記載します。
14+
15+
エンティティクラス
16+
-------------------
17+
18+
* Data Classで定義する
19+
* イミュータブルで定義する( `@Entity` の `immutable` 要素に `true` を設定する)
20+
* コンストラクタは1つだけ定義する
21+
* コンストラクタ以外でプロパティを定義しない
22+
* コンストラクタで定義するプロパティには `val` を使用する
23+
* 継承は使わない
24+
25+
.. code-block:: java
26+
27+
@Entity(immutable = true)
28+
data class Person(
29+
@Id
30+
@GeneratedValue(strategy = org.seasar.doma.GenerationType.IDENTITY)
31+
val id: Int? = null,
32+
val name: Name,
33+
val address: Address)
34+
35+
ドメインクラス
36+
-------------------
37+
38+
* Data Classで定義する
39+
* コンストラクタは1つだけ定義する
40+
* コンストラクタで定義するプロパティの名前は `value` にする
41+
* コンストラクタで定義するプロパティには `val` を使用する
42+
43+
.. code-block:: java
44+
45+
@Domain(valueType = String::class)
46+
data class Name(val value: String)
47+
48+
エンベッダブルクラス
49+
----------------------
50+
51+
* Data Classで定義する
52+
* コンストラクタは1つだけ定義する
53+
* コンストラクタ以外でプロパティを定義しない
54+
* コンストラクタで定義するプロパティには `val` を使用する
55+
* 継承は使わない
56+
57+
.. code-block:: java
58+
59+
@Embeddable
60+
data class Address(val city: String, val street: String)
61+
62+
Daoインタフェース
63+
-------------------
64+
65+
* SQLファイルとマッピングする場合は `@ParameterName` を使ってメソッドのパラメータに名前をつける
66+
* 更新処理の戻り値の型は `org.seasar.doma.jdbc.Result` や `org.seasar.doma.jdbc.BatchResult` を使う
67+
68+
.. code-block:: java
69+
70+
@Dao(config = AppConfig::class)
71+
interface PersonDao {
72+
@Select
73+
fun selectById(@ParameterName("id") id: Int): Person
74+
@Insert
75+
fun insert(person: Person): Result<Person>
76+
}
77+
78+
* 更新処理の戻り値を扱う際は `Destructuring Declarations <https://kotlinlang.org/docs/reference/multi-declarations.html>`_ を使う
79+
80+
.. code-block:: java
81+
82+
val dao: PersonDao = ...
83+
val person = Person(name = Name("Jhon"), address = Address(city = "Tokyo", street = "Yaesu"))
84+
val (newPerson, count) = dao.insert(person)
85+
86+
87+
katpによるビルド
88+
-------------------
89+
90+
Kotlin で記述されたクラスやインタフェースに対して注釈処理をするには `kapt <http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/>`_ を実行する必要があります。
91+
2016年5月現在、Kotlin 1.0.2のkaptは機能が不足しておりかつ動作が不安定です。また、ドキュメントがありません。
92+
Daoインタフェースで `@ParameterName` を用いて明示的に名前をつけることを推奨するのも kapt の不具合に由来します。
93+
不安定な挙動を避けるため、Gradleでビルドする際、常に `clean build` を実行することを推奨します。
94+
95+
.. code-block:: sh
96+
97+
./gradlew clean build
98+
99+
Eclispeを利用する場合設定を適切に行えばJavaの注釈処理は自動で行われますが、kapt(Kotlinの注釈処理)はGradleを実行しない限り行われないことに注意してください。
100+
101+
JavaとKotlinの混在
102+
-------------------------
103+
104+
kaptの不具合を避けるため、Domaに関するコードの全てもしくは一部をJavaで書くことは検討に値します。
105+
特に、DaoについてはJavaで書いても良いかもしれません。
106+
JavaとKotlinで記述量にほとんど差がなく、 `@ParameterName` を使う必要性を避けられるためです。
107+
Domaの利用において、JavaとKotlinの混在は特に問題ありません。
108+
109+
サンプルプロジェクト
110+
=====================
111+
112+
サンプルコードについては下記のプロジェクトを参照ください。
113+
114+
* `kotlin-sample <https://github.com/domaframework/kotlin-sample>`_
115+
No newline at end of file

0 commit comments

Comments
 (0)