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
抽象データ型について学んだ
Search
ryounasso
May 22, 2025
Programming
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
抽象データ型について学んだ
ryounasso
May 22, 2025
More Decks by ryounasso
See All by ryounasso
明日から始めるリファクタリング
ryounasso
0
240
駆け足で Google から学ぶテスト設計の指針
ryounasso
0
200
React inside basics: learn from “build own react"
ryounasso
0
220
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
4k
Clean Architecture by TypeScript & NestJS
ryounasso
0
1.1k
Fast API を用いた Web API の開発
ryounasso
1
620
テストゼロの個人開発プロジェクトにテストを導入した話
ryounasso
0
490
簡易 DI コンテナを作って DI コンテナを知る
ryounasso
1
1.4k
TypeScript_コンパイラの内側に片足を入れる
ryounasso
3
970
Other Decks in Programming
See All in Programming
権限チェックの一貫性を型で守る TypeScript による多層防御
mnch
4
1.1k
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
140
net-httpのHTTP/2対応について
naruse
0
440
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
4.1k
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
140
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
2.4k
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
1
740
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
250
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
150
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
2.8k
Claspは野良GASの夢をみるか
takter00
0
170
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.3k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
Practical Orchestrator
shlominoach
191
11k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
590
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
220
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
390
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
430
It's Worth the Effort
3n
188
29k
Transcript
抽象データ型について学んだ
抽象データ型について学んでみた感想をお話しします 主に「オブジェクト指向入門 第2版 原則・コンセプト」という書 籍を使用しました
抽象データ型とは • TYPES (型) • FUNCTIONS (関数) ◦ そ 抽象データ型に適用可能な操作
• AXIOMS (公理) ◦ そ 抽象データ型が必ず満たす条件 • PRECONDITIONS (事前条件) ◦ 関数が正しく動作するために必要な前提条件 データ構造を公開した振る舞いの集合で表現する仕様記述 抽象データ型に基づいて実装することで、クライアントは内部実装を意識せず、 振る舞いに依存する形でシステムを構築することが可能になる
• push(E item): スタック 一番上に要素を追加 • pop(): スタック 一番上 要素を取り出して削除
• peek(): スタック 一番上 要素を参照(削除 しない) • empty(): スタックが空かどうかを確認 • Stack: 空 Stack を生成する 抽象データ型の例: Stack 本では例として Stack が取り上げられていた Stack は「後入れ先だし」 (LIFO: Last-In-First-Out) という特徴を持っている Java24 の Stack の操作をもとに、抽象データ型の仕様記述をみる https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/util/Stack.html
抽象データ型の例: Stack - TYPES - STACK[G] - FUNCTIONS - push:
STACK[G] x G -> STACK[G] - peek: STACK[G] -/> G - pop: STACK[G] -/> STACK[G] - empty: STACK[G] -> BOOLEAN - Stack: STACK[G] これらの操作を用いて、先ほどの仕様記述を行うと以下の通り - AXIOMS - 任意 x:G, s:STACK[G]に対して 以下が成り立つ - 1. peek(push(s,x)) = x - 2. pop(push(s,x)) = s - 3. empty(Stack) - 4. not empty(push(s,x)) - PRECONDITIONS - peek(s: STACK[G]) require not empty(s) - pop(s: STACK[G]) require not empty(s)
抽象データ型の例: Stack AXIOMS 1 と 2 → LIFO を表現 こ
特徴を表現する に使用してい る が FUNCTIONS で定義されて いる振る舞い み - AXIOMS - 任意 x:G, s:STACK[G]に対して 以下が成り立つ - 1. peek(push(s,x)) = x - 2. pop(push(s,x)) = s - 3. empty(new) - 4. not empty(push(s,x)) - PRECONDITIONS - peek(s: STACK[G]) require not empty(s) - pop(s: STACK[G]) require not empty(s) これがデータ構造を公開した振る舞い みで表現する使用記述である抽象データ型
これを Java の実装に落とし込むと... 1. 作成する型 特徴を捉える (TYPES) 2. どんな操作を公開することで特徴を表現できるかを考え、interface に
落とし込む (FUNCTIONS) 3. クライアントが定義する操作を通じてどんな結果が欲しい か、それを 実現するためにどんな条件を満たして欲しい かを考える (PRECONDITIONS) 4. 公開する振る舞いを用いて公理を考える (AXIOMS) こ 公理が作成する型 特徴を表現できているか確認する 5. 定義した内容に沿うように interface を実装する (interface がない場合や、2~4 を行き来することもあると思います)
何が嬉しいのか 個人的に 「システム 拡張や保守 コスト 削減」と「より良いテスト」に 良い効果があると感じています
システムの拡張や保守コストの削減 ソフトウェア 保守コスト 17.6% が「データフォーマット 変更」と こと 例) アメリ か郵便番号
桁数を5桁から9桁に変更する際に多く 変更が必要となり、 コスト 数億ドルに及んだ → 郵便番号が5桁という内部構造に依存する実装をしてしまっていたことが原因 郵便番号 特徴 、そ 番号から一意 住所が導かれることである クライアントが公開している振る舞いに依存することで、 今後 機能拡張や保守 際 対応コストを下げることができる
より良いテストをかけるように 抽象データ型における公理 、そ クラス 特徴を表します。 それらが内部実装 変更によって壊れるとよくないです。 そ ためこ 公理を担保するため
テストが必要であると判断できます。 こ ように、公理を明確にすることによって、何をテストするべきか 判断が行いやすく なり、テスト 過不足を避けやすくなります。 また、振る舞いに依存し、内部実装に依存しないテストを書きやすくなり、リファクタリン グに強いテストを書くことが可能になります。
まとめ 「抽象データ型」に基づくクラス設計 体系的な方法を学んだ データ 型を公開した振る舞い 集合で表現する仕様記述 ただ、実践に落とし込むに もう少し練習が必要そう
参考資料 • オブジェクト指向入門 第2版 原則・コンセプト https://www.shoeisha.co.jp/book/detail/9784798111117