Kotlin コード規約（ Formatting 後半 ）

[公式](http://kotlinlang.org/docs/reference/coding-conventions.html)の和訳（意訳）です．

- [IDEでスタイルを設定する, ソースコード構成](https://qiita.com/hmiyado/items/2531be40b3369173a2cd)
- [命名規約](https://qiita.com/hmiyado/items/feea2cdd196ef53b1a1a)
- [フォーマット 前半](https://qiita.com/hmiyado/items/2ad86df1d0cb842beee6)
- フォーマット 後半(この記事)
- [ドキュメントコメント，冗長な記述を避ける](https://qiita.com/hmiyado/items/05cae7df64d6d0138594)
- [慣用表現の使用](https://qiita.com/hmiyado/items/94792e428e5993bc8fc6)
- [ライブラリのコード規約](https://qiita.com/hmiyado/items/f1e84c7870b8a5864a7b)

## プロパティ

とても短い read-only なプロパティは1行で書いてもよい.

```kotlin
val isEmpty: Boolean get() = size == 0
```

より複雑なプロパティには常に `get`, `set` を別々の行に書く.

```kotlin
val foo: String
    get() { /*...*/ }
```

初期化処理のあるプロパティで初期化処理がとても長い場合, `=` の後で改行して, インデント(スペース4つ)を空ける.

```kotlin
private val defaultCharset: Charset? =
    EncodingRegistry.getInstance().getDefaultCharsetForPropertiesFiles(file)
```

## 制御構文

`if` や `when` の条件が複数行になる場合, 常に式の本文は波括弧 `{` で囲う.
条件式の中の後続の条件は,条件式の書きはじめの位置に対して,スペース4つ分のインデントを空ける.
条件式の終わりの丸括弧 `)` は,条件式の中の条件から改行し, 始まりの波括弧 `{` と同じ行に書く.

```kotlin
if (!component.isSyncing &&
    !hasAnyKotlinRuntimeInScope(module)
) {
    return createKotlinNotConfiguredPanel(module)
}
```

このようにすることで条件と式の本文のインデントを揃えることができる.

`else`, `catch`, `finally` や `do-while` における `while` は後続の波括弧と同じ行に書く.

```kotlin
if (condition) {
    // body
} else {
    // else part
}

try {
    // body
} finally {
    // cleanup
}
```

`when` 式では,分岐先が1行以上になる場合,直前の分岐先と1行空けることを検討する.

```kotlin
private fun parsePropertyValue(propName: String, token: Token) {
    when (token) {
        is Token.ValueToken ->
            callback.visitValue(propName, token.value)

        Token.LBRACE -> { // ...
        }
    }
}
```

短い分岐先は括弧無しで1行で同じ行に書く.

```kotlin
when (foo) {
    true -> bar() // good
    false -> { baz() } // bad
}
```

## メソッド呼び出し

引数が長いとき，開き括弧の後に改行を入れる．
引数はインデントする（スペース4つ）．
関連性が高い引数は同じ行に書く．

```kotlin
drawSquare(
    x = 10, y = 10,
    width = 100, height = 100,
    fill = true
)
```

`=` の前後には空白を1つ書き，引数の名前と値を分離する．

## メソッドチェーン

メソッドチェーンを使うときは， . か `?.` 演算子を次の行に1回インデントして書く．

```kotlin
val anchor = owner
    ?.firstChild!!
    .siblings(forward = true)
    .dropWhile { it is PsiComment || it is PsiWhiteSpace }
```

チェーンの最初の呼び出しは，はじめに改行する．
これを省略してもよい．

## ラムダ式

ラムダ式では，波括弧やパラメータと本体を分けるための矢印の前後にスペースを書く．
メソッド呼び出しで単一のラムダ式を引数に取るときは，可能な限り丸括弧の外側に書く．

```kotlin
list.filter { it > 10 }
```

ラムダ式にラベルを貼るときは，ラベルと始めの波括弧の間にスペースを書かない．

```kotlin
fun foo() {
    ints.forEach lit@{
        // ...
    }
}
```

複数行のラムダ式でパラメータ名を宣言するとき，最初の行にパラメータ名と矢印を書き，改行する．

```kotlin
appendCommaSeparated(properties) { prop ->
    val propertyValue = prop.get(obj)  // ...
}
```

パラメータのリストがとても長いときは，矢印を別の行に書く．

```kotlin
foo {
   context: Context,
   environment: Env
   ->
   context.configureEnv(environment)
}
```

## 末尾カンマ

末尾カンマは,複数の要素の中で最後の要素の後ろにつくカンマである.

```kotlin
class Person(
    val firstName: String,
    val lastName: String,
    val age: Int, // trailing comma
)
```

末尾カンマの利用はいくつかのメリットがある.

- バージョン管理の差分をきれいにすることができる - 変更差分による集中できる
- 要素の追加や順番の変更が簡単になる - 要素の操作の際にカンマをつけたり消したりする必要がない
- コードの自動生成が簡単になる.例えば、オブジェクト初期化など.最後の要素もカンマがついていてよい

末尾カンマの利用は完全に任意である - 末尾カンマがなくてもコードは動作する.
Kotlin スタイルガイドとしては末尾カンマの利用を推奨するにとどめ,利用は委ねる.

IntelliJ IDEA のフォーマッターで末尾カンマを有効にするには, **Settings/Preferences | Editor | Code Style | Kotlin** を開き, **Other** タブを選択して `Use trailing comma` オプションを有効にする.