Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
抽象データ型について学んだ
Search
ryounasso
May 22, 2025
Programming
510
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
310
駆け足で Google から学ぶテスト設計の指針
ryounasso
0
270
React inside basics: learn from “build own react"
ryounasso
0
260
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
4.4k
Clean Architecture by TypeScript & NestJS
ryounasso
0
1.2k
Fast API を用いた Web API の開発
ryounasso
1
650
テストゼロの個人開発プロジェクトにテストを導入した話
ryounasso
0
530
簡易 DI コンテナを作って DI コンテナを知る
ryounasso
1
1.5k
TypeScript_コンパイラの内側に片足を入れる
ryounasso
3
1.1k
Other Decks in Programming
See All in Programming
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
380
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
310
golang-bob.pdf
iwatsukayura
0
150
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
640
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
190
Seven New Principles of Software Engineering
yegor256
0
380
Next.js: The final boss of Web Performance
guaca
0
360
R8 の設定見直しでアプリサイズ削減
andpad
0
230
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
360
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
140
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
160
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7.1k
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Docker and Python
trallard
47
4.2k
Building an army of robots
kneath
307
47k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
390
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
760
Raft: Consensus for Rubyists
vanstee
143
7.8k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
470
Tell your own story through comics
letsgokoyo
1
1.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
23k
We Are The Robots
honzajavorek
0
410
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