mizoguche memo

Kotlinの公式コーディング規約で気になったところの話

Kotlinの公式コーディング規約が公開された。

Coding Conventions - Kotlin Programming Language

気になってたところに方針が示されてめっちゃ嬉しい。

ソースファイル名

Source file names - Coding Conventions - Kotlin Programming Language

複数のクラスとか、トップレベルの関数とかしか含んでないソースファイル名に方針が出た。

GitHubを見てて、たまにlowerCamelCaseあったりしてどういよ…となってたが、この度UpperCamelCaseでいこうぜ! との公式見解。

こういうどうでもいい決め事にコストを割かれるのもったいないので公式に規約があるの重要(このあたりの重要性をGoは認識しててすごいなーと思った)。

クラスのレイアウト

Class layout - Coding Conventions - Kotlin Programming Language

この辺も結構どうしよう感あったけど、

という順番にしろとのお達し。

メソッドはアルファベット順とか可視性ではなく、高いレベルから低いレベル(もしくはその逆)にして、何が起こってるかのロジックをわかりやすくしろ、という強いメッセージが発せられてる。

クラスのヘッダーのフォーマット

Class header formatting - Coding Conventions - Kotlin Programming Language

class Person(
    id: Int,
    name: String,
    surname: String
) : Human(id, name) {

    // ...
}

コンストラクタ引数が多いときのフォーマットはこんなノリで。

自然とこうしてたけど、公式に言われると引数の削除とか順番入れ替えを簡単にするためにTrailing Commaを無視して欲しい気持ちが生まれますね…

とりあえずKotlin/KEEPをtrailing commaで検索してもヒットしなかった。

ループを使う

Using loops - Coding Conventions - Kotlin Programming Language

ループよりも高階関数(filter とか map とか)が望ましいけど、forEach より for ループの方が望ましい(レシーバがnullableだったり長めの呼び出しのチェーンのときはええけど)。

リーダブルなコードにすることとコストのトレードオフをちゃんと考えていこうねといってはる。

最適化はするなという教えに従っていきつつも公式に言われたら少なくともここに限ってはそうしましょうか、という気持ちになった。

スコープ関数(apply/with/run/also/let)を使う

Using scope functions apply/with/run/also/let - Coding Conventions - Kotlin Programming Language

スコープ関数は学習コスト払っても必ずペイできるくらいコードがシンプルになると思ってて、その考えを公式に後押ししてくれたみたいな印象。

何を使うかはこのチャートを参考にしていきたい。

見るたび思うけど with の「人とは違うことをしたい!」がツボ。

まとめ

IntelliJのKotlin Pluginバージョン1.2.20-eap-33以上からこの公式のフォーマットでフォーマットできるようになるらしいのでやっていきましょう。