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
値オブジェクト / Value Object
Search
OKUNOKENTARO
August 12, 2018
Technology
1.8k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
値オブジェクト / Value Object
フロントエンド百物語で発表した資料です。
OKUNOKENTARO
August 12, 2018
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
220
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
33
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.5k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.7k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
730
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.6k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Technology
See All in Technology
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
850
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
290
生成 AI の基礎 〜 サンプル実装で学ぶ基本原理
enakai00
7
4.4k
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
150
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
160
AIに狂うスタートアップが、あえて「人との協働」に全振りした新卒エンジニア研修 / New Graduate Engineer Training at a Startup Accelerating AI Adoption
ohnoeight
0
160
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
180
AIにブラウザを触らせて、E2EテストをPlaywrightで書く
koji_kawamura
0
170
SmartHR Engineering Team Deck
smarthr
1
3k
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
My broken English still works: speaking at global OSS events
naruoga
0
120
AI開発に用いられるHPC技術について
gpuunite_official
0
150
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Fireside Chat
paigeccino
42
4k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
440
A Tale of Four Properties
chriscoyier
163
24k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
440
The Cost Of JavaScript in 2023
addyosmani
55
10k
Building an army of robots
kneath
306
46k
Utilizing Notion as your number one productivity tool
mfonobong
4
550
Everyday Curiosity
cassininazir
0
290
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Transcript
ΦϒδΣΫ τ "VH ϑϩϯ τΤϯ υඦޠ
ΦϒδΣΫ τͱ w %%% ʢυϝΠϯۦಈઃܭʣ Ͱड़ΒΕΔ֓೦ w +BWB4DSJQUʹTUSJOH OVNCFS CPPMFBOͱ͍͏
ϓϦ ϛςΟ ϒܕ͕͋Δ w TUSJOH OVNCFSΛ5ZQF4DSJQUͰͦͷ··ѻΘͣ ΦϒδΣΫ τͱͯ͠ఆٛ͢Δ͜ͱͰɺ ༷ʑͳΛࣝผՄೳʹ͢Δ
࣮ࡍͷҊ݅Ͱͷྫ w "2018/8"ͱ͍͏stringΛѻΘͣʹYearMonthܕͱ͢Δ w "-0900"ͱ͍͏stringΛѻΘͣʹTimeZoneܕͱ͢Δ w 1, 2, 3ͱ͍͏numberͰͳ͘UserIdܕͱ͢Δ w
Observable<[number, string, number, number]>ͩͱҙຯෆ໌͕ͩ Observable<[UserId, TimeZone, PageNumber, DisplayCount]> ͱఆٛͰ͖Δ
࣮ྫ export abstract class Value<T> { constructor(protected value: T) {
// } toString(): string { return this.value.toString(); } valueOf(): T { return this.value; } eq(other: Value<T>): boolean { return this.value === other.value; } }
export class TimeZone extends StringValue { TimeZone: ProhibitDuckTyping; static UTC():
TimeZone { return new TimeZone('+0000'); } /** * JST ͷ߹ɺ -540 Λ +0900 ʹม͢Δɻ */ static offsetToIsoTimeZone(offset: number): TimeZone { const min = Math.abs(offset); const isoTimeZone = [ `00${Math.floor(min / 60)}`.slice(-2), `00${min - Math.floor(min / 60) * 60}`.slice(-2), ].join(''); const sign = offset <= 0 ? '+' : '-'; return new TimeZone(`${sign}${isoTimeZone}`); } constructor(protected value: string) { super(value); assert(/^[+-]\d{4}/.test(value), `"${value}" ɺλΠϜκʔϯͷϑΥʔϚοτͰ͋Γ·ͤΜ`); } }
1SPIJCJU%VDL5ZQJOH w Ҋ݅Ͱੜ·ΕͨϫʔΫΞϥϯ υ ʢ5ZQF4DSJQUͷਖ਼ࣜͳٕज़ͷ໊শͰͳ͍ʣ w 5ZQF4DSJQU class A
{ value: string }ͱ class B { value: string }Λ ࠞಉͯ͠ѻ͏ ͜ͱ͕Ͱ͖Δ w ߏ͢ΔϓϩύςΟͷ໊শͱܕͱΈ߹Θ͕ͤಉ͡ͳΒಉ͡ΠϯλϑΣʔεͰ ͋ΔͱΈͳ͞ΕΔ
1SPIJCJU%VDL5ZQJOH w class A { value: string; A: ProhibitDuckTyping; }
class B { value: string; B: ProhibitDuckTyping; } ͷΑ ͏ʹ͢ΕϓϩύςΟ໊͕" #ͰҟͳΔͷͰผͷܕѻ͍Ͱ͖Δ w 1SPIJCJU%VDL5ZQJOH࣮࣭ export type ProhibitDuckTyping = void;