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
Arakaki Yuji
December 18, 2021
Programming
570
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
データ指向プログラミング(仮)のススメ
Tech Base Okinawa 2021-12-18のLTで発表した内容です。
Arakaki Yuji
December 18, 2021
More Decks by Arakaki Yuji
See All by Arakaki Yuji
家族・子育て重視/沖縄在住を維持しながらエンジニアとしてのキャリアをどのように育てていくか?
ug
0
420
私の選ぶ開発環境: Raycast, Vivaldi, Warp, Emacsを活用したワークフロー
ug
0
1.7k
2週間に一度からリリースを日々の当たり前にするエンジニアリングマネジメント
ug
0
1.7k
レガシーフレームワークからの移行
ug
0
540
プログラミング言語に依存しない、質の高いコードを書く技術
ug
0
2.6k
Issues About frontend development
ug
0
3.3k
Azure web app is good
ug
0
520
技術基盤/SREの視点で取り組む、サービスの成長を継続し、加速させるためのPHPアプリケーション改善
ug
0
1.4k
sponser session by payke in hackers champloo 2019
ug
0
750
Other Decks in Programming
See All in Programming
技術記事、 専門家としてのプログラマ、 言語化
mizchi
4
2.6k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.9k
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.4k
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
220
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
210
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
660
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
First, design no harm
axbom
PRO
2
1.2k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
770
Writing Fast Ruby
sferik
630
63k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Transcript
データ指向プログラミング(仮) のススメ CBcloud 株式会社 新垣 雄志 ( あらかき ゆうじ )
自己紹介 • 新垣 雄志 ( あらかき ゆうじ ) • Twitter:
@arakaji • 職歴 ◦ 琉球インタラクティブ株式会社 ◦ 株式会社 Payke ◦ CBcloud 株式会社 ← NOW • CBcloud 株式会社の職務内容 ◦ バックエンドのリードエンジニア ◦ Ruby on Rails ◦ AWS • 好きなプログラミング言語 ◦ Clojure
今日話したいこと • ある仕様を実現したいときに、 UI や振る舞いから実装を考えるのではなく、その仕様 を適切に表現するデータ構造から考えて実装すると汎用的で保守しやすい機能と して実装しやすくなるよ! • これを示す言葉として「データ指向プログラミング (
仮 ) 」と僕が勝手に呼んでいます。 ◦ 別のことを示す言葉としてすでに存在するかもしれませんが、一旦この場はご容赦ください
例: PickGo理解度チェック • 当社のサービスに登録していただいたドライバーに、初め ての運行前にサービスのルールについて理解しているか どうかをチェックするテストをうけてもらう機能 • 配送品質向上のための施策として実装された • 要件
◦ 問題が表示される ◦ 答えの選択肢が表示される ◦ 回答をすべて選択したあと、次の画面でどれが正解でどれが不正解 か表示される ◦ 各問題の正解が一つのことも、2つ以上あることもある
例: PickGo理解度チェック • 拡張性、保守性を考えず素直に実装すると ◦ 表示される問題ページの UI をコーディング ◦ 各問題毎に正解・不正解をチェックするコードを書く
▪ それを各問題毎に実装 • 何が問題になるか? ◦ 問題が増えるごとに実装を増やさないといけない ◦ 答えが変わると実装を変更しないといけない ◦ つらい・・・
例: PickGo理解度チェック • データ指向プログラミング的に実装する場合 ◦ まず理解度チェックという概念を表現するデータ構造を考 える ▪ 問題 •
問題文がある • 選択肢がある ◦ id とラベル(表示される文章)がある • 選択肢のうちどれが正解かがある ◦ その答えは複数ある ▪ 問題が複数ある
例: PickGo理解度チェック • データ構造を元にして実装をすすめる ◦ データ元にして画面( HTML) を表示するプログラムを作る ◦ ユーザーが選択したものが正解かどうかをデータを元にし
てチェックするプログラムを書く • これによって以下のメリットが得られる ◦ 問題、答えが変わってもデータだけ変更すればよく実装の 変更はいらない ◦ 問題が増えてもデータを増やすだけでよく、実装の変更は いらない • 楽ちん。。。
え、、、当たり前じゃね。。。
意外と当たり前にやられていない • DB のデータを表示する系の場合は当たり前に行われている ◦ 商品一覧の表示 ◦ 商品詳細画面の表示 ◦ etc
• しかし、 DB で値を管理しない機能の場合にも、同じ思考で考えられるかというとそう でない方も多い。 • DB に値があるなしとわず、システムの振る舞いや表示される UI とそれらを表現する データ構造を分けて考えるのは意識しないと意外とできてない。
応用編:データからプログラムを生成する
例: 都道府県を扱うクラス • 値オブジェクトとして日本の都道府県を扱うクラスを作りたい ◦ 沖縄県や東京都など都道府県として有効な文字列のみ正常にインスタンス化出来るオブジェクト ◦ クラスメソッドとして指定した都道府県をインスタンス化したオブジェクトを返すメソッドがほしい
例: 都道府県を扱うクラス • 素直に実装すると ◦ okinawa メソッドを定義して沖縄県というデータのインスタンスを返す ▪ これを愚直に繰り返す ▪
都道府県は変更が少ないデータなのでありではあるが、、、 ▪ 面倒くさくない?
例: 都道府県を扱うクラス • 都道府県を表現するデータ構造を考え る ◦ プログラム上で扱う都道府県の名前 (key) と 人間が見る都道府県の名前(ラベル)の一
覧があればよさそう。 ◦ そのデータをもとに各メソッドの実装を生成 すればよい
例: 都道府県を扱うクラス • 都道府県を表現するデータ構造を考え る ◦ プログラム上で扱う都道府県の名前 (key) と 人間が見る都道府県の名前(ラベル)の一
覧があればよさそう。 ◦ そのデータをもとに各メソッドの実装を生成 すればよい ◦ そのデータに含まれていない値で初期化し ようとしても例外吐く • 都道府県が増えても減ってもデータを 変更すれば大丈夫!!!
まとめ • ある仕様を実現したいときに、 UI や振る舞いから実装を考えるのではなく、その仕様 を適切に表現するデータ構造から考えて実装すると拡張しやすく、保守しやすい機 能として実装しやすくなるよ! • 考えるときのコツ ◦
仕様を表現するデータ構造はどんなものか? ◦ 拡張するときにデータ変更のみで実現できるようにするにはどうすればいいか?
CM
ソフトウェアエンジニア採用してます!!! • 荷主とドライバーをマッチングするサー ビスを提供 ( 物流 x Tech) • 創業者が沖縄出身
• 東京・大阪・沖縄に拠点がある • 沖縄拠点のエンジニアを来年 10 人くらい にしたい ( 今二人)ので興味がある方は ぜひ! • Rails, Go, Flutter, Nuxt.js, AWS