Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scala初心者は◯◯◯にメソッドを生やしたいと考えた / Pre-ScalaMatsuri ...
Search
集約のエンティティ
August 30, 2020
Programming
3
2.6k
Scala初心者は◯◯◯にメソッドを生やしたいと考えた / Pre-ScalaMatsuri 2020
2020年8月30日に開催されたプレScalaMatsuriのLightning Talk発表資料です
https://scalaconfjp.doorkeeper.jp/events/110045
集約のエンティティ
August 30, 2020
Tweet
Share
More Decks by 集約のエンティティ
See All by 集約のエンティティ
組織を強くするPdMのマインド / PMHub vol.2
pictiny
5
780
戦略的DDDは重いのか? / Is strategic DDD heavy?
pictiny
4
2.9k
戦略的DDDを実践するための跳躍力 / OOC 2024
pictiny
9
10k
どうしてこうなった命名集 ~🔥編~ / OOC 2024 LT
pictiny
7
4.9k
おかしな名前 ~ 🔥編 ~ / Strange Name
pictiny
1
310
ドローンの会社は生成AIをどう活用するか / Generative AI Bounenkai 2023
pictiny
0
450
日報には"今日の一番大きな成果"を書こう / Kichijoji.pm 34
pictiny
1
1.2k
Scalaの現場から学ぶ設計:座談会 / genba sekkei vol 2
pictiny
0
680
Scalaの現場から学ぶ設計 告知 / genba sekkei vol.2 announce
pictiny
1
180
Other Decks in Programming
See All in Programming
一人でAIプロダクトを作るならAIにはもっと働いてもらいたい / I want AI to work harder
rkaga
2
170
副作用と戦う PHP リファクタリング ─ ドメインイベントでビジネスロジックを解きほぐす
kajitack
3
520
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
1.9k
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
330
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
930
[SRE NEXT] 複雑なシステムにおけるUser Journey SLOの導入
yakenji
1
910
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
5
560
Flutterと Vibe Coding で個人開発!
hyshu
1
220
Advanced Micro Frontends: Multi Version/ Framework Scenarios
manfredsteyer
PRO
0
150
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
3
390
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
950
新しいモバイルアプリ勉強会(仮)について
uetyo
1
250
Featured
See All Featured
How to Ace a Technical Interview
jacobian
278
23k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
2.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Producing Creativity
orderedlist
PRO
346
40k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
It's Worth the Effort
3n
185
28k
Site-Speed That Sticks
csswizardry
10
750
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
BBQ
matthewcrist
89
9.8k
How GitHub (no longer) Works
holman
314
140k
The World Runs on Bad Software
bkeepers
PRO
70
11k
RailsConf 2023
tenderlove
30
1.2k
Transcript
!QJDUJOZ 1SF4DBMB.BUTVSJ -JHIUOJOH5BML 4DBMBॳ৺ऀ ̋̋̋ʹϝιουΛ ੜ͍ͨ͠ͱߟ͑ͨ
2020.08.30 2
2020.08.30 3 4DBMBະܦݧͰΞϧϓೖࣾ 4DBMBྺ
2020.02.16 4 ςΫϊϩδʔͷྗͰ اۀͷܦࡁ׆ಈΛ ࢧ͑ɺ֦ு͢Δɻ
2020.08.30 5 ʮαϒεΫϦϓγϣϯϏδωεʹ͓͚Δ શۀΛҰؾ௨؏ͰΧόʔʯ ɾϓϥΠγϯά ɾཧ ɾސ٬ཧ ɾܖཧ ɾٻॻͷൃߦˍૹ ɾΫϨδοτΧʔυܾࡁ
ɾ֤छσʔλੳ ɾ༁ొɺձܭॲཧ ɹɹɹɹɹɹɹɹɹɹɹetc…
2020.02.16 6
2020.02.16 7 %%%
2020.08.30 8 Ξϧϓɺ%%%ͬͯΔΑ ɹɹɹɹɹɹɹαϒεΫϦϓγϣϯྖҬͷ4BB4 ෳࡶ͕ඇৗʹߴ͍ ͦͷͨΊ։ൃॳظ͔Β%%%Λಋೖ શࣾతʹ࣮ફ
2020.08.30 9 ͔͜͜Βࠓͷ ˞ίʔυαϯϓϧͰ͢
2020.08.30 10 ར༻υϝΠϯ ٻରͱͳΔར༻ظؒΛநԽͨ͠ར༻ΦϒδΣΫτ 70 case class Availability ( startAt:
LocalDate, // ར༻։࢝ endAt: LocalDate, // ར༻ऴྃ billingDate: LocalDate, // ٻ status: AvailabilityStatus // εςʔλε )
2020.08.30 11 ྫɿܞଳճઢͷܖ ֤݄ͷར༻͝ͱʹٻ͕ൃੜ͢Δ ܖͰճઢΛܖ͢Δͱɺϲ݄ͷར༻͕ੜ͡Δ ٻ͕ྃ͢Δͱରͷར༻ͷঢ়ଶ͕ ʮະٻʯ͔ΒʮٻࡁΈʯʹͳΔ
2020.08.30 12 ܖυϝΠϯ ܖΛநԽͨ͠ܖΦϒδΣΫτ &OUJUZ ར༻Λෳ࣋ͭ case class Contract (
id: ContractId, // ܖID availabilities: Seq[Availability], // ར༻ status: ContractStatus, // εςʔλε pricing: …, // ྉۚઃఆ … )
2020.08.30 13 ະٻͷར༻ΛٻΊΔ ར༻ͷεςʔλε͕ະٻͳͷ case class Contract (…) { def
unBilledAvailabilities: Seq[Availability] = availabilities.filter(_.status = UnBilled) // ະٻͷར༻ }
2020.08.30 14 ࣍ճͷٻΛٻΊΔ ະٻͷར༻ͷ͏ͪɺٻ͕࠷͍ۙͷ case class Contract (…) { def
nextBillingDate(today: LocalDate): LocalDate = availabilities.filter(_.status = UnBilled) // ະٻͷར༻Ͱ .filter(_.billingDate > today) // ٻ͕ࠓΑΓະདྷͰ .minBy(_.billingDate.toEpochDay) // ٻ͕࠷աڈͷͷ .billingDate }
2020.08.30 15 ࠓٻ͢Δར༻ΛٻΊΔ ະٻͷར༻ͷ͏ͪɺٻ͕ࠓͷͷ case class Contract (…) { def
shouldCreateBilling(today: LocalDate): Seq[Availability] = availabilities.filter(_.status = UnBilled) // ະٻͷར༻Ͱ .filter(_.billingDate = today) // ٻ͕ࠓ }
2020.08.30 16
2020.08.30 17 ͍ͭಉ͡pMUFSͯ͠ͳ͍ʁ
2020.08.30 18 ϦϑΝΫλ ར༻͕ܖʹ͔͠ొ͠ͳ͍ͳΒ͜ΕͰ͍͍͕ʜ case class Contract (…) { def
unBilledAvailabilities: Seq[Availability] = availabilities.filter(_.status = UnBilled) // ະٻͷར༻ def nextBillingDate(today: Localdate): LocalDate = unBilledAvailabilities .filter(_.billingDate > today) // ٻ͕ࠓΑΓະདྷͰ .minBy(_.billingDate.toEpochDay) // ٻ͕࠷աڈͷͷ .billingDate }
2020.08.30 19 ٻΛൃੜͤ͞Δ ٻίϯςΩετͰར༻Λ৮ͬͨΓ͢Δ case class Billing(…) object Billing {
def createBilling(today: LocalDate, contract: Contract): Billing = { val availabilities = contract.shouldCreateBilling(today) val billing = ??? // TODO: ར༻ΛͬͯٻΛ࡞Δ } }
2020.08.30 20 ͱ͍͏Θ͚Ͱ
2020.08.30 21 4FRʹϝιουΛੜ͍ͨ͠
!QJDUJOZ 1SF4DBMB.BUTVSJ -JHIUOJOH5BML 4DBMBॳ৺ऀ ̋̋̋ʹϝιουΛ ੜ͍ͨ͠ͱߟ͑ͨ
!QJDUJOZ 1SF4DBMB.BUTVSJ -JHIUOJOH5BML 4DBMBॳ৺ऀ ̋̋̋ʹϝιουΛ ੜ͍ͨ͠ͱߟ͑ͨ Seq
2020.08.30 24 4FRʹϝιουΛੜ͍ͨ͠ ҙຯΛ࣋ͬͨίϨΫγϣϯૢ࡞ʹ໋໊͍ͨ͠ ϩδοΫͷݟ௨͠ΛΑ͍ͨ͘͠ *%&ͷίʔυิΛޮ͔͍ͤͨ
2020.08.30 25 ʮͦΕJNQMJDJUͰͰ͖ΔΑʯ
2020.08.30 26 ☺
2020.08.30 27 ʮ͓͢͢Ί͠ͳ͍͚Ͳʯ
2020.08.30 28
2020.08.30 29 JNQMJDJU 4FRʹϝιουΛੜͤΔ͕ʜ ఆٛ͢Δॴ͕͍͠ υϝΠϯʁ Ͳ͜Ͱఆٛ͞Ε͍ͯΔ͔ ݺͼग़͠ଆ͔Β Θ͔Γʹ͍͘
υϝΠϯࣝJNQMJDJUͨ͘͠ͳ͍
2020.08.30 30 ͡Ό͋Ͳ͏͢Δ͔
2020.08.30 31 υϝΠϯࣝܕʹ͠Α͏
2020.08.30 32 ར༻ͷίϨΫγϣϯΦϒδΣΫτԽ ܖར༻ίϨΫγϣϯΦϒδΣΫτΛ࣋ͭΑ͏ʹͳΔ case class Availabilities( values: Seq[Availability] )
case class Contract ( id: ContractId, availabilities: Availabilities, // ίϨΫγϣϯΦϒδΣΫτΛ࣋ͭ status: ContractStatus, pricing: …, )
2020.08.30 33 ະٻͷར༻ΛٻΊΔ ར༻ͷυϝΠϯࣝͱ࣮ͯ͠Ͱ͖Δ case class Availabilities (…) { def
unBilledAvailabilities: Availabilities = Availabilities(availabilities.filter(_.status = UnBilled)) }
2020.08.30 34 ٻΛൃੜͤ͞Δ ར༻ίϨΫγϣϯܕΛૢ࡞͢ΕΑ͘ͳΔ case class Billing(…) object Billing {
def createBilling(today: LocalDate, contract: Contract): Billing = { val availabilities: Availabilities = contract.shouldCreateBilling(today) // AvailabilitesܕΛฦ͢ val billing = ??? // TODO: ར༻ΛͬͯٻΛ࡞Δ } }
2020.08.30 35 ίϨΫγϣϯΦϒδΣΫτͷར ϝιου͕ੜͤΔ ܕͷදݱྗ͕͑Δ ϦϑΝΫλ͍͢͠ 'JOE6TBHFͰӨڹൣғ͕Θ͔Γ͍͢
2020.08.30 36 5JQT ඪ४తͳૢ࡞USBJUͰܧঝͰ͖ΔΑ͏ʹ͓ͯ͘͠ͱศར trait class CustomCollection[A] { val values:
Seq[A] def isEmpty: Boolean = values.isEmpty def nonEmpty: Boolean = values.nonEmpty def length: Boolean = values.length … }
2020.08.30 37 ؾ͖ 4FRʹϝιουΛੜ͍ͨ͠ͱߟ͑ͨ Ͱɺ4FRʹϝιουΛੜ͢ͷ͋͘·Ͱखஈ ͳͥͦ͏ߟ͑ͨͷ͔ɺཧ༝ΛݴޠԽ͢Δ͜ͱ͕େࣄ ผͷखஈͰత͕ୡͰ͖Δ͜ͱ͋Δ
2020.08.30 38 ·ͱΊ 4FRʹϝιουΛੜͨ͘͠ͳͬͨ ίϨΫγϣϯ͕υϝΠϯϩδοΫΛ࣋ͭ͜ͱ͕͋Δ υϝΠϯϩδοΫΛ࣋ͭͷܕͱͯ͠ఆٛ͢Δͷ͕Α͍ *%&ͷԸܙେ͖͍
2020.08.30 39 4DBMBΤϯδχΞ࠾༻த
2020.08.30 40