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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
210
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
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
120
自律型AIエージェントは何を破壊するのか
kojira
0
160
"何を作るか"を任される エンジニアは、どう育つのか
yutaokafuji
1
660
Disciplined Vibes: Scaling AI-Assisted Engineering
sheharyar
0
140
手塩にかけりゃいいってもんじゃない
ming_ayami
0
550
Snowflakeと仲良くなる第一歩
coco_se
4
440
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
21
6.8k
あなたの知らないPDFのアクセシビリティ
lycorptech_jp
PRO
0
160
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
230
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
940
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
3
210
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
1
120
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
Utilizing Notion as your number one productivity tool
mfonobong
4
320
Between Models and Reality
mayunak
4
330
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Rails Girls Zürich Keynote
gr2m
96
14k
What's in a price? How to price your products and services
michaelherold
247
13k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
From π to Pie charts
rasagy
0
210
How STYLIGHT went responsive
nonsquared
100
6.2k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
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;