Slide 1

Slide 1 text

2025/02/28 Server-Side Kotlin Meetup LT
 detekt で学ぶKotlin 


Slide 2

Slide 2 text

2
 About Me
 ● Hiroki Inoue
 ● Software Engineer
 ● Engineering Manager at Smartround Inc.


Slide 3

Slide 3 text

3
 About Me
 ● Hiroki Inoue
 ● Software Engineer
 ● Engineering Manager at Smartround Inc.
 
 ● 元々PHPer
 ● 昨年10月から現職( Kotlinを使ってる会社) 
 ● ロールはEM(本業で手を動かす機会は少なめ) 


Slide 4

Slide 4 text

1 LTの概要
 2 学びの事例紹介 
 3 開発対象としての detekt
 4 まとめ
 目次


Slide 5

Slide 5 text

01 LTの概要


Slide 6

Slide 6 text

6
 誰向けのトーク? 
 ● Kotlinの学び方を模索している方 
 ● detektの開発に興味がある方 


Slide 7

Slide 7 text

7
 概要
 ● detektを読んだり書いたりしました 
 ● detektを通じてKotlinの書き方を学びました 
 ● 趣味と実益を兼ねた取り組みの話をしに来ました 


Slide 8

Slide 8 text

8
 detekt is 何?
 ● 静的解析ツール 
 ● https://github.com/detekt/detekt
 ● https://detekt.dev/


Slide 9

Slide 9 text

9
 detekt is 何?
 ● 静的解析ツール 
 ● https://github.com/detekt/detekt
 ● https://detekt.dev/
 つまり
 Kotlinに詳しいのでは? 
 (期待) 


Slide 10

Slide 10 text

10
 detekt is 何?
 ● 静的解析ツール 
 ● https://github.com/detekt/detekt
 ● https://detekt.dev/
 ならば
 Kotlinを教われるのではないか 
 (仮説) 


Slide 11

Slide 11 text

11
 detekt入門以前の Kotlinとの接点
 ● 入門書を読んだ 
 ● 採用選考で技術試験的なものを受けた 
 ● Kotlinを少し読んだり書いたりしたことがある 


Slide 12

Slide 12 text

02 学びの事例紹介 


Slide 13

Slide 13 text

13
 学びの経路 
 1. detektのルール から学ぶ
 2. detektそのもの から学ぶ
 3. issue から学ぶ


Slide 14

Slide 14 text

14
 学びの経路 
 1. detektのルール
 ○ Kotlinはこう書くべしというベストプラクティス(のひとつ) 
 2. detektそのもの
 3. issue


Slide 15

Slide 15 text

15
 学びの経路 
 1. detektのルール
 ○ Kotlinはこう書くべしというベストプラクティス(のひとつ) 
 2. detektそのもの
 ○ Kotlinで書かれた運用実績のあるプロダクションコード 
 3. issue


Slide 16

Slide 16 text

16
 学びの経路 
 1. detektのルール
 ○ Kotlinはこう書くべしというベストプラクティス(のひとつ) 
 2. detektそのもの
 ○ Kotlinで書かれた運用実績のあるプロダクションコード 
 3. issue
 ○ Kotlinの言語仕様や書き方に関する話題 


Slide 17

Slide 17 text

17
 学べること 
 公式ドキュメント、入門書で見たことの 
 実践例


Slide 18

Slide 18 text

18
 学べること 
 入門書にカバーされない 
 言語仕様、イディオムやベストプラクティス 


Slide 19

Slide 19 text

19
 前置き…
 この先、有識者にとってはあたり前のことと思いますが …
 ご容赦ください mm


Slide 20

Slide 20 text

20
 platform type


Slide 21

Slide 21 text

21
 platform type
 ??
 タイトルからしてわからない …


Slide 22

Slide 22 text

22
 platform type
 ??
 タイトルからしてわからない …
 母国語(PHP)には存在しない概念 …


Slide 23

Slide 23 text

23
 platform type
 "platform types — types which the Kotlin compiler uses, when interoperating with code written for another platform (e.g., Java)."
 
 https://kotlinlang.org/spec/type-system.html#platform-types


Slide 24

Slide 24 text

24
 inner class


Slide 25

Slide 25 text

25
 inner class
 母国語には …(ry


Slide 26

Slide 26 text

26
 このissueが示唆すること 
 ● UnnecessaryInnerClassはouter classのメンバにアクセスしないinner classを 指摘するルール
 ⇒outerにアクセスすることが inner classの個性


Slide 27

Slide 27 text

27
 このissueが示唆すること 
 ● UnnecessaryInnerClassはouter classのメンバにアクセスしないinner classを 指摘するルール
 ⇒outerにアクセスすることがinner classの個性
 ● しかし兄弟classにアクセスしてても指摘するというfalse positiveがある
 ⇒innerは、outerだけじゃなく outerの別のinnerにもアクセスできる 


Slide 28

Slide 28 text

28
 inner class
 “Nested and inner classes
”
 
 https://kotlinlang.org/docs/nested-classes.html


Slide 29

Slide 29 text

29
 nested class
 ● Kotlinではclassの中にclassをネストできる 


Slide 30

Slide 30 text

30
 inner class
 ● nested classにinnerを付けたもの 
 ● outer classのメンバにアクセスできる 
 ● outer objectの参照をもつ 


Slide 31

Slide 31 text

31
 it


Slide 32

Slide 32 text

32
 it
 “It's very common for a lambda expression to have only one parameter.
 
 If the compiler can parse the signature without any parameters, the parameter does not need to be declared and -> can be omitted. The parameter will be implicitly declared under the name it:”
 
 https://kotlinlang.org/docs/lambdas.html#it-implicit-name-of-a-single-p arameter


Slide 33

Slide 33 text

33
 このルールが強制すること 
 ● lambdaの引数が1つの場合、引数を省略し、 itで参照する。 


Slide 34

Slide 34 text

34
 このルールが強制すること 
 ● lambdaの引数が1つの場合、引数を省略し、 itで参照する。 
 ● 但し、以下の場合 itは使えない。 
 ○ 引数に型を明示する場合 
 ○ lambdaの引数が2つ以上ある場合 


Slide 35

Slide 35 text

35
 その他色々 
 カスタム アノテーション 拡張関数 by lazy with build.gradle.kts mavenLocal

Slide 36

Slide 36 text

36
 何が言いたいかというと 
 製品は出会いのチャンス 
 実践例との

Slide 37

Slide 37 text

37
 学べること 
 入門書だけ では学べないこと 


Slide 38

Slide 38 text

03 開発対象としての detekt 


Slide 39

Slide 39 text

39
 入門者フレンドリー 
 1. Contribution Guideが充実している 
 2. good first issue や help wanted ラベルがある 


Slide 40

Slide 40 text

40
 コードを改修するまでの流れ 
 1. ラベルでフィルターして Issuesを読み漁る 
 2. 仕様を理解する 
 ○ コードを読む 
 ○ 実行する
 ○ テストを読む 
 3. 開発流儀を理解する 
 ○ Contribution Guideを読む
 ○ マージ済みの PRを読む
 4. 開発に着手する 
 結果として見送った 
 issueからも学べる

Slide 41

Slide 41 text

41
 Contribution Guide
 ● commitメッセージの流儀 
 ● ユニットテストの実行方法 
 ● 新しいルールの作り方 
 ● ルール説明の書き方 
 ● エラー検出時のメッセージの書き方 
 etc.


Slide 42

Slide 42 text

42
 ルール説明 
 https://github.com/detekt/detekt/blob/main/.github/CONTRIBUTING.md


Slide 43

Slide 43 text

43
 ルールを追加した時に触れたもの 
 ● ルール
 ● テスト
 ● detekt.yml[1]
 ● default-detekt-config.yml
 ● RuleSetProvider[2]
 1. ルールの有効化・無効化の指定やパラメータを渡すことができる。 
 2. ルールにはカテゴリがあり、カテゴリ毎に RuleSetProviderがある。


Slide 44

Slide 44 text

44
 detekt.yml
 style: # ルールセット(カテゴリ的なもの) active: true # styleルールセットに含まれるルールを有効にする BracesOnIfStatements: # ルール名 active: false # BracesOnIfStatementsを無効にする singleLine: 'never' # パラメータ

Slide 45

Slide 45 text

45
 type resolution
 ● type resolution[1]が有効でないと実行されないルールがある 
 ● `--debug`オプションで確認できる 
 1. https://github.com/detekt/detekt/blob/main/website/docs/gettingstarted/type-resolution.md
 The rule 'AvoidReferentialEquality' requires type resolution but it was run without it.

Slide 46

Slide 46 text

46
 type resolution
 ● type resolution[1]が有効でないと実行されないルールがある 
 ● `--debug`オプションで確認できる 
 
 
 ● ./gradlew detektMain などして有効化できる 
 ● 手元ではmavenLocalで試せる
 1. https://github.com/detekt/detekt/blob/main/website/docs/gettingstarted/type-resolution.md
 The rule 'AvoidReferentialEquality' requires type resolution but it was run without it.

Slide 47

Slide 47 text

04 まとめ


Slide 48

Slide 48 text

48
 まとめ
 ● detektを読んだり書いたりしました 
 ● detektを通じてKotlinの書き方を学びました 
 ● 趣味と実益を兼ねた取り組み の話をしに来ました 


Slide 49

Slide 49 text

スマートラウンドでは新しいメンバーを募集中です 
 jobs.smartround.com 
 私たちと一緒に、スタートアップが可能性を最大限に発揮できる世界をつくりませんか? 


Slide 50

Slide 50 text

ご清聴ありがとうございました