SlideShare a Scribd company logo
1 of 24
KOTLIN DSL パターン
2019/9/9 Kotlin Fest Rejected Conference 2019
小山 健太 (Koyama Kenta)
Twitter/Github @doyaaaaaken
自己紹介
• 活動領域:
・サーバサイドメインのフルスタックエンジニア(という名のなん
でも屋)
・SaaSの立ち上げ期が好きで3度ほど経験
• 趣味:
・漫画・ボードゲーム・麻雀・テニス・ポーカー…
・最近はKotlin製OSSへのコントリビュート(ktor, Exposed,
kotlintest, kohttp)、自作OSS(kotlin-csv)とかも
会社紹介
smartround株式会社で
起業家・投資家間の
資金調達プロセスを管理する
SaaSの開発をしています
(ktorが1.0.0-betaの頃に開
発スタートしました)
https://jp.smartround.com/
発表のゴール
1. Kotlin DSLについてパターン化
⇒ 記憶・整理の手助けとなる
2. 詳細な実装方式を紹介
⇒ 明日から書きたくなる
DSL例1
• kotlintest (testing library)
DSL例2
• ktor (web framework)
DSL例3
• Exposed (O/R Mapper)
• よく見るパターンを4つ紹介します
• 覚えやすいようにパターンには仮の名前をつけてます
• Kotlinの機能をそのまま使っているものも
便宜上パターンと呼んでいます
• ちなみにMartinFowlerは50パターンぐらい紹介してましたw
https://martinfowler.com/dslCatalog/
1. SENTENCE PATTERN
• ドット・括弧無しのメソッド呼び出しにより、文っぽくするやつ
1. SENTENCE PATTERN
2. OPERATOR OVERRIDE PATTERN
• +, -, * /などの演算子に独自の意味を定義する機能
2. OPERATOR OVERRIDE PATTERN
3. NESTED STRUCTURE PATTERN(1)
• ネストにより構造化された情報を表現するパターン
3. NESTED STRUCTURE PATTERN(1)
3. NESTED STRUCTURE PATTERN(1)
これだけでは足りない
3. NESTED STRUCTURE PATTERN(2)
• 大抵の場合ネストの内側のスコープで
状態を保持するかメソッドを定義してやる必要がある
3. NESTED STRUCTURE PATTERN(2)
3. NESTED STRUCTURE PATTERN(2)
レシーバ付きLambda
(拡張関数Lambdaという理解でOK)
3. NESTED STRUCTURE PATTERN(2)
空のHttpRequestContextを作成後、拡張関数lambdaを実行
3. NESTED STRUCTURE PATTERN(2)
レシーバとしてHttpRequestContextが使える
⇒ 結果スコープ内でのみ利用できる
Mutableなオブジェクトとなる
3. NESTED STRUCTURE PATTERN(2)
4. PROPERTY ACCESS DELEGATION
PATTERN
• 委譲プロパティを使ってプロパティの値取得・セット時に
追加の処理をやる
4. PROPERTY ACCESS DELEGATION
PATTERN
HAVE A NICE
KOTLIN!

More Related Content

Similar to 2019 kotlin-rejected-fest-doyaaaaaken

テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望
テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望
テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望Futa HIRAKOBA
 
ODC 2020 : "Rocky 8"
ODC 2020 : "Rocky 8"ODC 2020 : "Rocky 8"
ODC 2020 : "Rocky 8"Naoto Gohko
 
今後のContainerの行く末の感じたこと、思ったこと 〜JKD参加報告〜
今後のContainerの行く末の感じたこと、思ったこと〜JKD参加報告〜今後のContainerの行く末の感じたこと、思ったこと〜JKD参加報告〜
今後のContainerの行く末の感じたこと、思ったこと 〜JKD参加報告〜Tsukasa Kato
 
リモート先へログインする時環境あるある
リモート先へログインする時環境あるあるリモート先へログインする時環境あるある
リモート先へログインする時環境あるあるRyota Sakamoto
 
openstack_neutron-dvr_os5thaniv_20150713
openstack_neutron-dvr_os5thaniv_20150713openstack_neutron-dvr_os5thaniv_20150713
openstack_neutron-dvr_os5thaniv_20150713Takehiro Kudou
 
5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについてMasanori Kusunoki
 
OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向NTT Software Innovation Center
 
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏Daisuke Ikeda
 
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayerNobuyuki Matsui
 
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)シスコシステムズ合同会社
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所Toru Makabe
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考えるryuz88
 
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京Kentaro Ebisawa
 
SendGrid SDKを捨てた話
SendGrid SDKを捨てた話SendGrid SDKを捨てた話
SendGrid SDKを捨てた話Yuta Matsumura
 
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度Katz Ueno
 
ベアメタルプロビジョニング(Ironic)について
ベアメタルプロビジョニング(Ironic)についてベアメタルプロビジョニング(Ironic)について
ベアメタルプロビジョニング(Ironic)についてMitsuhiro SHIGEMATSU
 

Similar to 2019 kotlin-rejected-fest-doyaaaaaken (20)

テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望
テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望
テスト漏れを無くしたい!ワークフロー単位でトリガーを自由に設定したい要望
 
ODC 2020 : "Rocky 8"
ODC 2020 : "Rocky 8"ODC 2020 : "Rocky 8"
ODC 2020 : "Rocky 8"
 
今後のContainerの行く末の感じたこと、思ったこと 〜JKD参加報告〜
今後のContainerの行く末の感じたこと、思ったこと〜JKD参加報告〜今後のContainerの行く末の感じたこと、思ったこと〜JKD参加報告〜
今後のContainerの行く末の感じたこと、思ったこと 〜JKD参加報告〜
 
リモート先へログインする時環境あるある
リモート先へログインする時環境あるあるリモート先へログインする時環境あるある
リモート先へログインする時環境あるある
 
2018 07-23
2018 07-232018 07-23
2018 07-23
 
openstack_neutron-dvr_os5thaniv_20150713
openstack_neutron-dvr_os5thaniv_20150713openstack_neutron-dvr_os5thaniv_20150713
openstack_neutron-dvr_os5thaniv_20150713
 
2018 07-19dist
2018 07-19dist2018 07-19dist
2018 07-19dist
 
5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて5月中旬の仮想通貨Re-orgについて
5月中旬の仮想通貨Re-orgについて
 
OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向OpenStack Swiftとそのエコシステムの最新動向
OpenStack Swiftとそのエコシステムの最新動向
 
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
 
Try IoT with Node-RED
Try IoT with Node-REDTry IoT with Node-RED
Try IoT with Node-RED
 
Katib
KatibKatib
Katib
 
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
 
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考える
 
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
 
SendGrid SDKを捨てた話
SendGrid SDKを捨てた話SendGrid SDKを捨てた話
SendGrid SDKを捨てた話
 
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度
CloudFormation ことはじめ - JAWS UG 名古屋 2019年7月度
 
ベアメタルプロビジョニング(Ironic)について
ベアメタルプロビジョニング(Ironic)についてベアメタルプロビジョニング(Ironic)について
ベアメタルプロビジョニング(Ironic)について
 

2019 kotlin-rejected-fest-doyaaaaaken