JJUG CCC 2013 Springへ参加まとめ
日本Javaユーザーグループ主催のクロスコミュニティカンファレンス 2013 Spring(通称:JJUG CCC 2013 Spring)へ参加してきました。 因みに、午後からのみの参加です。
日時: 2013年5月11日(土) 9:30-20:05(開場9:15)
場所: ベルサール西新宿(東京都新宿区西新宿4-15-3住友不動産西新宿ビル3号館)
Java EE 6 から Java EE 7 に向かって
- JavaEEの歴史
- JavaEE6
- JavaEE7
Java Small-Object Programming
Starrignt & Stormの長谷川 裕一さんによるDDD関連の話です。
1 S-OPとはなにか
- 小さい部品でアプリケーションを作ろう
- 背景
- テストや変更の容易性、可読性の悪いアプリケーションの多さ
- FWの定番化
- DDDや9つのルール等の登場
- S-OPの実現
2 アプリケーションの現状
- ビジネスロジックが理解しづらい
- メソッドの行数が多い etc
- ビジネスの変更がシステムに与える影響は、ビジネスロジックの変更である。
- S-OPは何を解決するか
- 上記の問題を解決するため、可読性が良く、変更容易性の高いシステムにする
3 Javaの抱える問題
- JavaはSmallTalkと比較して、純粋なオブジェクト指向ではない
- 構文の冗長性
- 例)Employeeクラス等、2つの属性を持つクラスで合っても複数のメソッドを記述しなければならない
- Validation処理が複数のクラスに散らばってしまう
4 S-OPの実現
プリミティブ・文字列をラップしてクラスにする(フィールドクラス)
- 例)Priceクラス
- Priceに関するルールを知っている
例) Codeクラス
- Codeに関するルールを知っている
先程のEmployeeクラスの場合も、nameとかcodeとかを一つのクラスにすることで処理を纏めることが可能。
- Employeeクラスに対してValidationのアノテーションをつければ良い?
- Controller等で、name, codeをEmployeeから離れて独自に扱う事があるからそれでは冗長になる。
- Employeeクラスに対してValidationのアノテーションをつければ良い?
フィールドクラスを利用するメリット
- フィールド名が分散する事が無いので検索が便利
- 例)商品コードがString shohinCode, String sc...
- 修正は常に一箇所
- フィールド名が分散する事が無いので検索が便利
フィールドクラスを利用するデメリット
- ヒープを圧迫する
- 多すぎると可読性が下がる
- 例)Priceクラス
不必要なSetter-Getterは記述しない
- 本当に必要かを考える
- 例) 倉庫の場合、set在庫はおかしいよね
- 1から在庫をセットするのは文脈的におかしい。増やしたり減らしたりする方が文脈的には正しい。
フレームワークを利用する
- Lombokで@Dataを利用すると、setter, getter, toString等を裏側で生成してくれるので、見た目がすっきりする
- Springで例外、try-catch、loging等のコードを省略
5 9つのルール
- 1つのメソッドにつきインデントは1段階までにすること
- else句を使用しないこと
- すべてのプリミティブ型と文字列型をラップすること
- 1行につきドットは1つまでにすること
- 名前を省略しないこと
- すべてのエンティティを小さくすること
- 1つのクラスにつきインスタンス変数は2つまでにすること
- ファーストクラスコレクションを使用すること
- Getter/Setter/プロパティを使用しないこと
- S-OPにDDDのパターンを利用する
- DDDを実施しないとS-OPにならない?
- S-OPはトランザクションスクリプトに不向き?
- ドメインロジックが余り無い場合にも、S-OPは使える
- フィールドクラスでValidationをすると、使い回しが効く
- ドメインロジックが余り無い場合にも、S-OPは使える
6 DDDからDSLへ
- 単純なプログラムであればDSLで自動生成で高速開発可能
- プレゼンテーション
- DBアクセス
- 最低限必要なフィールドクラス等の基本的なコンポーネントはDSLで生成する
- 開発者はこれをライブラリとして利用する。
JIRA開発の舞台裏 ~世界19,000社で使われる課題管理システムはどのように開発されているのか?
- JIRAの解説
JIRAの開発
- 年間3回のリリース
- 開発メンバ
- 74人
- Devが8割
- 74人
PM : Confluenceの利用によるストーリ管理
- ペルソナ機能の利用
- 利用者に関する情報を管理
- 利用者がどの様な課題を持っているか?
- 利用者はどの様なスキルセットを持っているか?
- 個別の機能から始めるのではなく、ストーリを作る
- JIRAの価値は何か?
- ConfluenceはSNSプラットフォームなので、フィードバックが得られる
- JIRAの価値は何か?
- 利用者に関する情報を管理
- ペルソナ機能の利用
Design : Atlassian Design Guidelineの作成(共通のデザインコンポーネント)
- 開発者は見た目を気にしなくてもよくなった
- Keynoteのテンプレートも作った
- プレゼンなどでページのモックも作り易い
Dev : Gitへの移行(Stashというアトラシアンツールへの移行)
QA : Quality AssuranceからQuality Assistanceへ
- テスティングノートの作成
- テストの時に必要なガイドライン
- ペアテスティング
- Devと協力して品質を保証していく
- 9ヶ月リリース -> 2週間へ短縮
- テスティングノートの作成
失敗から学ぶAPI設計
いいライブラリとは
- コストパフォーマンス高い
- 機能が豊富
- 品質高い
- コミュニティが活発
- 拡張しやすい
- 使いやすい
Twitter4JのAPI
Twitter4Jの開発指針
- シンプルにYAGNI
- クラス数は極力少なく
- インタフェースは使わない
- インタフェースが分からない初心者にも優しく
- 拡張ポイントはなるべく少なく
- 柔軟さ < 使いやすさ の重視
- なるべくImmutableに
- クラス継承はさせない(final)
- finalじゃないクラスはモッククラスとして使いたい場合のみ
- strategyパターンはやらせない
- 分かりづらいから
- 認証の部分で使っているくらい?
- Twitter4Jの拡張ポイント
- 認証
- ログ
- httpクライアント
- 非同期ディスパッチャ
- デザインパターンを適用しない
- 多くのプログラマはFactoryとか知らない
- IDEの補完を活かせるように
- なるべく同一パッケージに
- 一般的すぎるクラス名にしない
- IDEの補完がいき過ぎないように
- 使うべきでないクラス名を異様にする
- z_T4JInternal***
- zを付けてるのはIDEの補完で一番最後に来るようにしてる
- z_T4JInternal***
- 使うべきでないクラス名を異様にする
- 互換性維持の苦労
- 互換性維持のために大事なこと
パッケージ訳の失敗
API設計の失敗
- シンプルにYAGNI
参考図書
参加してみて
始めてのJJUG CCCだけど、参加してよかった!しかし、セミナの醍醐味は懇親会にあるので、次回は是非参加せねば。