目次
Kotlin を スタイルガイド に沿って美しく書くための予備知識をまとめました。
Kotlin には、公式ページにスタイルガイドがあります (Coding Conventions) 。
スタイルガイドのためのツール
エディタでのスタイルガイド適用
IntelliJ IDEA でのスタイルガイドの適用は、 「ファイル」メニューから [Settings] を (mac の場合は IntelliJ IDEA メニューから [Preferences] を) 選び、 左ペインから [Editor] -> [Code Style] -> [Kotlin] を選択します。 右上に “Set from …”というリンクがあるので、それをクリックして 「OK」をクリックします。
スタイルガイドチェック
IntelliJ IDEA では、コードがスタイルガイドに沿っているかをチェックすることもできます。「ファイル」メニューから [Settings] を (mac の場合は IntelliJ IDEA メニューから [Preferences] を) 選び、 左ペインから [Editor] -> [Inspections] を選択します。 そして、右ペインの [Kotlin] -> [Style Issues] -> [File is not formatted according to project settings] チェックをオンにします。
こうすることで、 スタイルガイドにそぐわない Kotlin のインデント、改行などが警告表示されます。
スタイルガイドの基本
特に間違えやすい部分を取り上げました。
コメント
1行のコメントを作る スラッシュ2つ (//
) の後には必ずスペースを入れます。
1 |
// one line comment |
インデント
インデントはスペース4つです。 タブではありません。 式の途中で改行すると、IDEによってスペース8個のインデントになることがありますが、スペース4つで書くのが Kotlin のスタイルガイドに沿った書き方です。 上述の スタイルガイドチェック をオンにしていると、 インデントがスペース8個になっている場合にも波線で警告表示されます。
演算
2項演算子(+
, -
, *
, /
, %
等)の前後にはスペースを入れます。 Range を作る 2項演算子 (..
) は例外で、 前後にスペースを入れません。
修飾子
lateinit
, private
などの修飾子には順番があります。
変数定義
変数定義では、コロンの後にスペースを入れます。
1 2 |
val a: String = "" var b: Int = 1 |
クラス定義
クラスの定義で間違えやすいのは継承のある場合とコンストラクタ引数の書き方です。
継承する場合は、 コロン(:
) の前後にスペースを入れます。 変数宣言の時とは異なります。 変数宣言の際はコロンの後のみにスペースをつけていました。
1 2 3 |
class Something : Another { ... } |
コンストラクタ引数がある場合で、改行をする場合には注意が必要です。 コンストラクタ引数の前に改行し、最後のコンストラクタ引数の後で改行します。
1 2 3 4 5 6 7 |
class Some( one: String, two: String, three: String ) : Parent { ... } |
クラスの中身は 一般的には次の順序で記述されます。
- プロパティ宣言、イニシャライザ
- セカンダリコンストラクタ
- メソッド宣言
- コンパニオンオブジェクト
アルファベット順や可視性(visibility)でまとめて記述するのではなく、コードを読む人が処理を追いやすいように、関連のあるものをまとめて書くのが良いとスタイルガイドにあります。
プロパティ宣言
プロパティ宣言時に get
, set
を記述する場合は、 インデントを加えて get
, set
を記述します。
1 2 3 4 5 6 7 |
val magicString: String get() { return "a" + field } set(value) { field = value + "a" } |
プロパティのバッキングフィールドを別に宣言する場合は、その名前をプロパティ名の前にアンダースコアをつけたものにします。 これは .Net Framework 4 でプロパティ宣言時に自動生成されるフィールド名と同じですね。
1 2 3 4 5 6 7 |
var _prop: String = "" var prop: String get() = _prop set(value) { _prop += value } |
関数定義
関数はシグネチャの後の括弧((
)の前にはスペースを置かず、関数本体を記述するブロックの最初の括弧({
)の前にスペースを入れます。 型を指定する場合のコロン(“:
“)の後にはスペースを入れます。 コロンの前にはスペースを入れません。 返り値の型が Unit
の場合には、 返り値の型の記述を省略します。
1 2 3 4 5 6 7 |
function example() { ... } function sample(): String { ... } |
引数が複数存在する場合は、カンマ(,
)で区切り、カンマの後にスペースを入れます。 引数にデフォルト値がある場合は、 代入演算子(=
)の前後にスペースを入れます。
1 2 3 |
fun sample(a: Int, b: Int = 1): Int { ... } |
引数が複数存在し、1行に収まらないために改行をする場合、 関数の引数を囲む括弧の開始((
)の直後に改行をします。 関数の返り値の型は閉じ括弧()
)と同じ行に書きます。 そして、関数本体を始める括弧({
)も同じ行に書き、 次の行から関数本体を記述します。
1 2 3 4 5 6 |
fun sample( longNameParameter1: Int = 1, longNameParameter2: Int = 2 ): Int { ... } |
無名関数の定義では、 fun
のすぐ後に 括弧を書きます。
1 |
val f = fun() { ... } |
ラムダを記述する際、 関数ボディを囲む括弧それぞれ({
, }
)の前後はスペースまたは改行にします。 {
の前はスペース、後はスペースまたは改行、 }
の前はスペースまたは改行、 後は改行です。
1 2 3 4 |
val f = { 1 + 1 } val g = { 2 + 2 } |
フロー制御
if
式, when
式, while
ループ, for
ループ はよく間違って書かれる場合が多いです。
if 式
条件を入れる括弧の前後にはスペースを入れます。 処理を囲む括弧それぞれ ({
, }
) の前後にもスペースを入れます。
1 2 3 4 5 |
if (condition) { ... } else { ... } |
when 式
if式と同じです。 (
の前、 )
の後、 {
の前後、 }
の前後 にスペースを入れます。
1 2 3 4 |
when (value) { a -> b else -> c } |
for ループ
0 から n – 1 までをイテレートする場合は until
を使います。 for (i in 0.(n - 1))
のようには書きません。
1 |
for (i in 0 until n) { ... } |