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 2020
Search
集約のエンティティ
August 30, 2020
Programming
3
2.4k
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
4
560
戦略的DDDは重いのか? / Is strategic DDD heavy?
pictiny
4
2.5k
戦略的DDDを実践するための跳躍力 / OOC 2024
pictiny
9
8.3k
どうしてこうなった命名集 ~🔥編~ / OOC 2024 LT
pictiny
7
4.4k
おかしな名前 ~ 🔥編 ~ / Strange Name
pictiny
1
250
ドローンの会社は生成AIをどう活用するか / Generative AI Bounenkai 2023
pictiny
0
300
日報には"今日の一番大きな成果"を書こう / Kichijoji.pm 34
pictiny
1
950
Scalaの現場から学ぶ設計:座談会 / genba sekkei vol 2
pictiny
0
550
Scalaの現場から学ぶ設計 告知 / genba sekkei vol.2 announce
pictiny
1
140
Other Decks in Programming
See All in Programming
リハビリmruby
kishima
1
160
Findy - エンジニア向け会社紹介 / Findy Letter for Engineers
findyinc
2
81k
SDCon2024: Enabling DevOps and Team Topologies thru architecture: architecting for fast flow
cer
PRO
0
780
Rust.Nagoya #1
codemountains
0
170
開発部に不満を持っていたCSがエンジニアにジョブチェンしてわかった「勝手に諦めない」ことの大切さ
sakuraikotone
28
16k
コード生成を伴うLLMエージェント - 2024.07.18 Tokyo AI
smiyawaki0820
11
4.1k
CSC307 Lecture 09
javiergs
PRO
1
500
Introduction of Happy Eyeballs Version 2 (RFC8305) to the Socket library
coe401_
1
220
CSC307 Lecture 14
javiergs
PRO
0
220
CSC307 Lecture 10
javiergs
PRO
0
310
Prompt FlowによるLLMアプリケーション開発
yuto2000
1
1k
ピグパーティにおけるMongoDB CommunityバージョンからAtlasへの移行事例
10969hotaka
0
130
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
36
9.1k
Producing Creativity
orderedlist
PRO
340
39k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
26
1.6k
Web Components: a chance to create the future
zenorocha
307
41k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
502
140k
4 Signs Your Business is Dying
shpigford
178
21k
Optimizing for Happiness
mojombo
373
69k
How GitHub (no longer) Works
holman
305
140k
Designing on Purpose - Digital PM Summit 2013
jponch
113
6.6k
How GitHub Uses GitHub to Build GitHub
holman
471
290k
Speed Design
sergeychernyshev
9
270
Principles of Awesome APIs and How to Build Them.
keavy
124
16k
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