java エンジニアチームが始めやすい scala コーディングスタイル #ichigayageek

41
Java エンジニアチームが始めやすい Scala コーディングスタイル 瀬良 和弘 @seratch_ja #ichigayageek

Upload: kazuhiro-sera

Post on 21-Jan-2018

14.189 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Java エンジニアチームが始めやすい Scala コーディングスタイル瀬良 和弘 @seratch_ja#ichigayageek

Page 2: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

自己紹介

• Scala を初めて触ったのは 2009 年 • ScalikeJDBC プロジェクトリード(2011~) • Skinny Framework プロジェクトリード(2013~) • Scalatra、json4s、Scalate メンテナ

Page 3: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

はじめに

• この発表の内容は「Java を得意とする Scala 初学者のプログラマ」を想定してそうした方々が馴染みやすそうな一つのスタイルを紹介するものです

• 既に世の中には様々な Scala のコーディングガイドがありますので、そちらもご参照ください

• Scala Style Guide • Databricks Scala Coding Style Guide • PayPal Scala Style Guidelines • Twitter's Effective Scala (ちょっと古い)

Page 4: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 5: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 6: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

まず、私が関わる OSS の宣伝を少しだけ..

• ScalikeJDBC - シンプルな DB アクセスライブラリ、GitHub スター数では Slick に次いで 2 位

• Skinny Framework - Rails に強く影響を受けた Web フレームワークを中心としたプロジェクト、Scaffolding をはじめ必要なものは一通り揃っている

• Skinny Micro New! - Skinny Framework 2 のコア部分を切り出したマイクロフレームワーク、Sinatra 風の DSL で簡単に Scala で Web アプリを作りことができる

• Scalatra、json4s、Scalate も PR 待っています

Page 7: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Skinny Micro はこれだけで動く

Page 8: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Servlet だから Future 使いづらいを過去のものに

Page 9: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

ぜひお試しください(気に入ったら star を)

Page 10: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

それでは、本題へ・・

Page 11: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 12: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 13: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

重厚な設計を忘れて、まずシンプルに書き始める

• 特に Java の人はあえて Scala を静的型を持つ Ruby と捉えて、バランス感覚を養うとよい

• case class を value object の入れ物としてまず慣れる(Java beans より楽!→パターンマッチの理解へ)

• 単純な結果のキャッシュはメソッド定義の代わりに lazy val を使うだけで済むことも多い

• Scala は言語機能だけでテスタビリティを保てる • val で定義したメンバも override できる • 必ずしも DI の仕組みに頼る必要はない

Page 14: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 15: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 16: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 17: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Java プログラマらしい整然としたプロジェクト

• sealed を使うとき以外は 1 ファイル 1 モジュール(class/companion or trait)

• public なメンバ・メソッドは型を明示する • 適当にトップレベルに放り込まず package 階層を持つ • 暗黙の型変換を使った既存 class 拡張を乱用しない(デフォルトで有効になる使い方を安易にやらない)

• 「とりあえず interface 定義」をやるなら中途半端にやらない(実装を適切に分離/隠蔽する)

Page 18: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

型の明示に IntelliJ IDEA が便利

Page 19: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

型の明示に IntelliJ IDEA が便利

Page 20: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 21: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

文でなく式であることを意識して if/else も使う

• 再代入不可で var を書かない制約はさほど厳しくない • メソッド・コードブロックが返すべき型を明示する • ローカル変数でもコードブロックをうまく使う • 返すべき型の値を返す if/else 式やパターンマッチ(early return しない、else のない if を書かない)

• try/catch でも値を返せる特性を活かす • Option(..).map(..).getOrElse(..) というイディオム • チェインしすぎず、適度に名前をつける

Page 22: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 23: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 24: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 25: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

例外を否定するかどうかはスタンスをとる

• Scala は Java と違ってチェック例外の仕組みがない(理由:Open-Closed Principle に従う)

• 例外を保持しうるデータ型:Try、Either、Future • 例外を否定した API と決めたなら徹底的にやる(Try/

Either/Future を返すメソッドが例外投げるのは最悪) • 常に標準のデータ型である必要はなく、成功・失敗を反映した結果オブジェクトを返してもよい

Page 26: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 27: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 28: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 29: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 30: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Future はスレッドプールを強く意識する

• 標準で提供される ExecutionContext.global は一つの ForkJoinPool が裏で動いている

• 用途ごとにプールを分けた方がよければ implicit で渡す ExecutionContext を自前で作って使い分ける

• Future と同期処理を包んだものを混ぜるときはただ型を合わせるだけでなく、挙動を理解し想像する • Future の中の同期処理がスレッドプールを浪費するリスクはないか、そのプール設定は妥当か

Page 31: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 32: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 33: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 34: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

Java モジュールの知識を活かす

• 目的を達成するために Java の既存コードを組み合わせることは何ら問題ない • 手元の既存コードの流用だけでなく JDBC など標準規格、主要サービス提供 Java SDK の利用

• Java っぽくなるが、局所的に使えばよい(完全にラップするのはそれなりにコストがかかる)

• バイナリ互換問題から解放されるメリット • Collection API 変換は JavaConversions ではなく

JavaConverters を使う(asScala で明示的変換)

Page 35: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 36: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 37: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

サンプル例

Page 38: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

アジェンダ

• まず、私が関わる OSS の宣伝を少しだけ.. • 重厚な設計を忘れて、まずシンプルに書き始める • Java プログラマらしい整然としたプロジェクト • 文でなく式であることを意識して if/else も使う • 例外を否定するかどうかはスタンスをとる • Future はスレッドプールを強く意識する • Java モジュールの知識を活かす • チームが目指したい Scala プロジェクトとは

Page 39: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

チームが目指したい Scala プロジェクトとは

• 長くメンテしていきたい Scala プロジェクト? or 使い捨てのプロジェクト?

• 一つのプロジェクトに専念? or 更新頻度のまちまちな小さなアプリケーションを複数かけもち?

• 依存ライブラリがどんどん互換性崩してもコンパイルエラーになるから大丈夫?

• 何でも Scala でやりたがる病..(皆かかります) • 最近、自分の中で流行っている新しいスタイル.. • このプロジェクト、後任はどう思うか?

Page 40: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

たまには精神論でも..

• チームの納得感 + 客観的な目線 • この発表のスタイルがしっくり来るチームもあれば、ほとんど納得できないチームもあるはず

• 組織の中で排他的なチームをつくってしまうと、中長期的には負債になる(みんなが追いつくべき?)

• Scala は楽しい、なぜなら・・ • 自分の好きなようにやっていて楽しい? • チームで開発しやすいから楽しい?

• Scala にしてよかったと認識される状況とは?

Page 41: Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek

まとめ• 凝りすぎず、シンプルに書く • Java プログラマ的美徳は Scala でも活きる • 基本 return を書かない、全ては式 • 例外を保持するデータ型はその設計に慣れてから • Future はマルチスレッドプログラミング • Java を流用するのは全然アリです • チームのための Scala コードを書く