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
460
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
280
駆け足で Google から学ぶテスト設計の指針
ryounasso
0
220
React inside basics: learn from “build own react"
ryounasso
0
240
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
4.2k
Clean Architecture by TypeScript & NestJS
ryounasso
0
1.2k
Fast API を用いた Web API の開発
ryounasso
1
630
テストゼロの個人開発プロジェクトにテストを導入した話
ryounasso
0
510
簡易 DI コンテナを作って DI コンテナを知る
ryounasso
1
1.4k
TypeScript_コンパイラの内側に片足を入れる
ryounasso
3
1.1k
Other Decks in Programming
See All in Programming
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
Building a Meta Ray-Ban display app
akkeylab
0
170
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
280
Android CLI
fornewid
0
230
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
110
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
540
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
30年振りにコンパイラの定数整数除算を改善した
herumi
2
520
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.9k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
プロポーザルを書いてもらう
pvcresin
0
560
FastAPI の並行処理モデルを完全に理解する
hoto17296
1
630
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
540
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
Designing Powerful Visuals for Engaging Learning
tmiket
1
500
Odyssey Design
rkendrick25
PRO
2
770
Typedesign – Prime Four
hannesfritz
42
3.1k
Prompt Engineering for Job Search
mfonobong
0
410
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
490
Joys of Absence: A Defence of Solitary Play
codingconduct
1
440
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
HDC tutorial
michielstock
2
800
Building Applications with DynamoDB
mza
96
7.2k
Music & Morning Musume
bryan
47
7.3k
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