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
睡眠指標計算ロジック設計:4つの指針
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takashi
September 25, 2019
Programming
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
睡眠指標計算ロジック設計:4つの指針
弊社が開発しているプロダクトに使われる「睡眠指標」のロジックの設計、実装する際に気をつけたこと
https://www.neurospace.jp/
Takashi
September 25, 2019
Other Decks in Programming
See All in Programming
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
Java 27新機能 / Java 27 new features
kishida
2
190
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
290
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
420
setup-vp GitLab対応の裏側
naokihaba
0
140
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.7k
iOSDCのペンライトを自動制御したい!
akkeylab
0
330
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
290
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
380
Featured
See All Featured
Between Models and Reality
mayunak
4
480
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
290
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Optimising Largest Contentful Paint
csswizardry
37
4k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Practical Orchestrator
shlominoach
192
12k
It's Worth the Effort
3n
188
29k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
Statistics for Hackers
jakevdp
799
230k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
700
WCS-LA-2024
lcolladotor
0
840
Transcript
睡眠指標計算ロジック設計:4つの指針 株式会社ニューロスペース 平岡 尚
発表者プロフィール 平岡尚(ひらおか たかし) Sler, WEB開発会社, フリーランスを経て、2019年3月入社 バックエンドエンジニア 2つの協業プロジェクトを担当 時差ボケ調整アプリ 睡眠可視化アプリ
Laravel 5.x Rails 5.x
睡眠指標とは ・睡眠時間 ・深い睡眠の割合 ・途中で起きる(中途覚醒)回数 ・毎日どれくらい規則的に寝て、おきているか?(起床規則 性) ・眠気 ...etc これら指標を計算する際に気をつけたことをお話しします!
大切にしている要件 ・計算ロジックのメンテナンス性 ・プロジェクト間での移植性 ・可読性 これらをできるだけ担保できるような設計を目指した。 変更があるからこそ、場当たり的でなく、都度しっかりと設計(モデリ ングを行う)し、ブラッシュアップできる状態を維持する
4つの指針 1. メソッドは入力に対して出力が決まるように設計する 2. 引数には値オブジェクトを活用する 3. 計算と永続化は分割する 4. プロジェクト間でのロジックの流用を想定する あくまで指針で、前述の「大切にしている要件」を満たせるかどうかが判断軸に
なる
メソッドは入力に対して出力が決まるように設計する
メソッドは入力に対して出力が決まるように設計する class SleepCalculator def self.adjusted_sleep_time (sleep_time, adjusted_minutes) sleep_time + adjusted_minutes
end end [なぜ意識するのか] 複雑な計算ロジックに進化する未来があった時、大体は複数のモデルのデータに依存する事になる 引数で丸ごとActiveRecordを渡して、そのオブジェクトがリレーションを張っていて、 さらにそれらを参照するコードが書かれてしまうと、 「引数からなんのデータに依存しているのか 読み取りにくく」なる。
引数に値オブジェクトを活用する
引数に値オブジェクトを活用する 値オブジェクト:ドメイン駆動設計において登場する。 値と振る舞いを持つモノをモデルと呼んでいる。 モデルには「エンティティ」と「値オブジェクト」がある エンティティ 値オブジェクト 同一性 識別子供が同一であれば同一 保持する属性が全て同一であれば 同一
可変性 可変 生成されてから、変異するとい うライフスパンを持つ 不変 生成されたら、あとは破棄されるの み 入力値が多くなるような場合に、引数に活用した
引数に値オブジェクトを活用する 例)時差ボケ調整アプリには、眠気予報という、トラベルの予定と実績に基づいて将来の眠 気を予想してくれる機能があります。入力には就寝時刻、起床時刻、食事の時刻、時差情報 など多数の入力情報を必要とする 予定:[ [ 就寝時刻, 起床時刻, 食事時刻, 時差情報,....] ,
[就寝時刻, 起床時刻, 食事時刻, 時差情報,....] ,...] 実績:[ [ 就寝時刻, 起床時刻, 食事時刻, 時差情報,....] , [ 就寝時刻, 起床時刻, 食事時刻, 時差情報,....] ,...] 眠気予報 計算 Input Output Processing... 多量の時系列のデータ
引数に値オブジェクトを活用する エンティティ (ex. ActiveRecord) 値オブジェクト Forecast 睡眠時間 食事時刻 Achievement 睡眠時間
食事時刻 睡眠実績 睡眠予定 食事実績 食事予定 <<interface>> TravelActionBase エンティティを値オブジェクトに変換し使用 値オブジェクト用のクラスを定義することで比較や分岐を直感的に表現で きた
計算と永続化は分割する
計算と永続化は分割する class SleepCalculator FACTOR = 0.5 def self.adjust_sleep_time! (user, adjusted_minutes)
user.sleep_time += adjusted_minutes * FACTOR user.save! end end
計算と永続化は分割する class SleepCalculator FACTOR = 0.5 def self.adjust_sleep_time! (user, adjusted_minutes
) result = calc_adjusted_sleep_time (sleep_time, adjusted_minutes) user.update!(sleep_time: result) end def self.calc_adjusted_sleep_time (sleep_time, adjusted_minutes ) sleep_time + adjusted_minutes * FACTOR end end
計算と永続化は分割する 計算過程を含めた戻り値を値オブジェクト(または単純なデータ型)として返すように計算メ ソッドを実装して、管理画面で計算結果を CSV出力などしてトレースできる public static function createPredictions($trip, $now) {
list($_, $sleepinessForecasts) = TravelPrediction::calculate($trip, $now); SleepinessForecast::create($trip, $sleepinessForecasts); } API呼び出し箇所 $response = new StreamedResponse (function() use ($travel, $calculateDatetime){ $stream = fopen('php://output', 'w'); stream_filter_prepend($stream,'convert.iconv.utf-8/cp932//TRANSLIT'); fputcsv($stream, ['datetime','base', 'hour','score', ....]); list($calcProcess, $_) = TravelPrediction::calculate($travel, $calculateDat 計算過程CSVDL箇所
プロジェクト間でのロジックの流用を想定する
プロジェクト間でのロジックの流用を想定する ロジック実装の設計段階において、検討段階ではロジック部分だけ単独 のRubyプロジェクトとしてリポジトリ管理しモデルの検証を行った
まとめ
まとめ 複雑なロジックの可読性や保守性を維持する には、責務分担の設計であったり抽象度の高 いモデリングを行うことが有効な場合がある。
まとめ ニューロスペースではその計算ロジック自体が 重要な財産であるため、リリーススピードは意 識しつつも腰を据えた設計プロセスが事業の 長期的な成長に必要(と考えてる)。
ご静聴ありがとうございました! 睡眠だけでなくとも、良いソフトウェアを作るプロセスにも興味ある方、懇親会でぜひお 話しましょう!!!