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
720
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.6k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Technology
See All in Technology
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
150
Zoom2Youtube.Claude
kawaguti
PRO
1
310
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
170
Claude Code 珍プレー好プレー
shinyasaita
0
200
背中から、背中へ /paying forward to community
naitosatoshi
0
220
攻撃者がいなくてもAIエージェントはインシデントを起こす
nomizone
0
200
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
0
170
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
0
690
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
380
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
440
Why is RC4 still being used?
tamaiyutaro
0
290
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
210
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Facilitating Awesome Meetings
lara
57
7k
A Tale of Four Properties
chriscoyier
163
24k
The Cult of Friendly URLs
andyhume
79
6.9k
Faster Mobile Websites
deanohume
310
32k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Designing for Performance
lara
611
70k
Fireside Chat
paigeccino
42
4k
Balancing Empowerment & Direction
lara
6
1.2k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
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;