Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
コードをどまんなかに据えたモデリング-Scala版 / Modeling with code in the middle-Scala version
yoshiyoshifujii
April 14, 2020
Technology
0
68
コードをどまんなかに据えたモデリング-Scala版 / Modeling with code in the middle-Scala version
【オンライン開催】04/14(火) Scala関西勉強会 - 2020年04月版
https://connpass.com/event/163551/
yoshiyoshifujii
April 14, 2020
Tweet
Share
More Decks by yoshiyoshifujii
See All by yoshiyoshifujii
ここ数ヶ月でAkkaを勉強した方法について紹介 / I have studied Akka in the past few months
yoshiyoshifujii
1
160
Chatworkのドメインをモデリングした / Modeling Chatwork domain
yoshiyoshifujii
0
430
サマーインターンシップ2019で学生とDDDなScala開発に取り組んだ / Working on DDD and Scala development with students at Summer Internship 2019
yoshiyoshifujii
2
3k
Clean Architecture in Practice @ScalaMatsuri2019
yoshiyoshifujii
9
3.1k
実践 Clean Architecture
yoshiyoshifujii
14
8.6k
k8sもよく分かってないけどRancherを兎に角さわってみた
yoshiyoshifujii
1
420
すえなみチャンス忘年会
yoshiyoshifujii
0
59
Scala製プロダクトのJavaバージョン戦略
yoshiyoshifujii
1
610
ScalaのUnitテストでDocker
yoshiyoshifujii
1
310
Other Decks in Technology
See All in Technology
Kubernetesの上に作る、統一されたマイクロサービス運用体験
tkuchiki
1
1.3k
LINEのData Platform室が実践する大規模分散環境のCapacity Planning
line_developers
PRO
0
750
Remixの凄みを紹介したい
aiji42
1
550
A1A会社紹介資料-2022-05-20
a1a
2
1.1k
開発者のための GitHub Organization の安全な運用と 継続的なモニタリング
flatt_security
3
3.9k
runn is a package/tool for running operations following a scenario. / golang.tokyo #32
k1low
1
240
AWS ChatbotでEC2インスタンスを 起動できるようにした
iwamot
0
170
5分で完全理解するGoのiota
uji
3
2.1k
個人的に使って良かったUiPathアクティビティ
saoritakita
0
200
Data-Driven Healthcare - Techplay
kotaroito
0
120
[AKIBA.AWS] それ、t2.micro選んで大丈夫?
tsukuboshi
0
370
プログラミング未経験の学生をエンジニアにしてきたノウハウを公開
shinofumijp
0
160
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1351
200k
GitHub's CSS Performance
jonrohan
1020
410k
How to train your dragon (web standard)
notwaldorf
57
3.8k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
How to name files
jennybc
39
59k
Faster Mobile Websites
deanohume
294
28k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
38
12k
StorybookのUI Testing Handbookを読んだ
zakiyama
4
2k
How STYLIGHT went responsive
nonsquared
85
3.9k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
268
11k
The Most Common Mistakes in Cover Letters
jrick
PRO
4
24k
Transcript
Scala関西 Chatwork株式会社 FUJII Yoshitaka コードをどまんなかに据えた モデリング - Scala版
自己紹介 - FUJII Yoshitaka - @yoshiyoshifujii - Chatwork株式会社 - Scala関西
- 登壇 - ScalaMatsuri2019 - 実践 Clean Architecture - 趣味 - ⛰ ⛺ ♂ 庭DIY
アジェンダ 1. 課題感 2. JIG 3. sbt-jig 4. sbt-jig-tutorial 5.
コードへのフィードバック例 3
01 課題感
課題感 - モデリングどうやりますか - ホワイトボードに書く - ツールを使う - astah -
PlantUML - Miro 5
課題感 - 図に書いた通りに実装できていますか - 認識はズレていませんか - コードとドキュメントは同期されていま すか - どうやって担保しますか
6
課題感 - 図とコードとテストの変更のリズムは どうですか - さくさく変更できますか - 図からコード、コードをテスト、 コードを変更ってぐるぐるしてると、 図は…あとで良いや
ってなりがち 7
02 JIG
コードをどまんなかに - コードに軸足を置く - 最初はホワイトボードとかで認識合わせ る(Miroはいいぞ ) - 意図を込めてコードを書き、意図が表現 されたドキュメントを見る
9
コードをどまんなかに 10 https://speakerdeck.com/irof/kodowodomannakaniju-etashe-ji-apuroti
コードをどまんなかに - JIG Java Instant-document Gazer (ドキュメントは一時的に見るもの) - https://github.com/dddjava/jig -
JIGは、バイトコードおよびソースコードから、 一覧(Excel形式)やダイアグラム(SVG形式)を 出力するツールです 11
JIG 三層+ドメインモデル のアーキテクチャで実 装されたコードから分 析・設計情報を出力す るツール 12
JIGのDiagramたち 13 https://jigzag.work/
03 sbt-jig
Scalaに対応した - JIGにScalaのソースコードを解析できるように拡張部 分を追加させていただいた - https://github.com/dddjava/jig/pull/424 - https://irof-web.s3.amazonaws.com/jig/master/use-case- and-fellows.svg 15
sbt-jigを作った - https://github.com/yoshiyoshifujii/sbt-jig - Scalaのソースから、Scaladocを読み取り、別名を扱え るようにした - JIGに追加した org.dddjava.jig.domain.model.jigloaded.alias.ScalaSourceAliasReader をsbt-jig側で実装
- Scalametaを使って解析 16
sbt-jig - JIGのプロパティをsbtにも用意 17 override lazy val projectSettings = Seq(
jigReports := Jig.jigReportsTask(jig).value, jigDocumentTypeText in jig := "", jigOutputDirectoryText in jig := "./target/jig", jigOutputOmitPrefix in jig := ".+\\.(service|domain\\.(model|type))\\.", jigModelPattern in jig := ".+\\.domain\\.(model|type)\\..+", jigProjectPath in jig := "./", jigDirectoryClasses in jig := Jig.makeClasses().value, jigDirectoryResources in jig := Jig.makeClasses().value, jigDirectorySources in jig := "src/main/scala" )
sbt-jig - Scalaのバージョンを見たうえで、classesが出力される ディレクトリを導出 18 def makeClasses(): Initialize[String] = Def.setting
{ s"target/scala-${scalaBinaryVersion.value}/classes" }
04 sbt-jig-tutorial
sbt-jig-tutorialを作った - https://github.com/yoshiyoshifujii/sbt-jig-tutorial - jig-tutorialがあったので、sbt-jig用を作った - ぜひお試しください 20
05 コードへの フィードバック例
Roleオブジェクト - DCIアーキテクチャ - https://digitalsoul.hatenadiary.org/entry/20100131/1264925022 - オブジェクト指向の本質が人間のメンタルモデルを捉え ることにあるとした上で、問題と解決方法を提示 - 問題は、構造を捉えることに長けている反面、ふるまい
を捉えることが苦手 - 特定のふるまいをどのクラスにおくべきか - エンティティクラスが大量のメソッドで肥大化する - 今回は、 Factory Method について捉えた 22
Roleオブジェクト 23 - グループチャットにメッセージを生成する Factory Methodを実装する - グループチャットは、メッセージを生成す るうえで、集約由来の生成ロジックを保持 しており、そのロジックを通してしか、
メッセージの生成を許可しない - グループチャットのふるまいとして持たせ ることは、良さそうに思える
Roleオブジェクト 24 - グループチャットを通して生成 する別の集約のエンティティと して、ファイルやタスク、ライ ブ… - グループチャットが持つ Factoryとしてのメソッドが増
え、肥大化する
Roleオブジェクト 25 - Factory Methodは、JIGでレポートすると相互の 関連で出力される package groupChat import message.Message
trait GroupChat { def createMessage(accountId: AccountId, body: String): Message = ??? } package message import groupChat.RoomId trait Message { val roomId: RoomId }
Roleオブジェクト 26 - メッセージパッケージにRoleオブジェクトを作る - Scalaの場合、型クラスとして作成すると扱いやすい package message import groupChat.GroupChat
trait MessageRole[A] { def createMessage(self: A)(accountId: AccountId, body: String): Message } object MessageRole { implicit val groupChatMessageRole = new MessageRole[GroupChat] { override def createMessage(self: GroupChat)(accountId: AccountId, body: String): Message = ??? } implicit def toMessageRoleOps[A: MessageRole](self: A) = new { def createMessage(accountId: AccountId, body: String): Message = implicitly[MessageRole[A]].createMessage(self)(accountId, body) } }
働くをもっと楽しく、創造的に