レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる

S
Copyright © DeNA Co.,Ltd. All Rights Reserved.
レガシーな Perl システムに
DDD(ドメイン駆動設計) を
取り入れる
株式会社 DeNA Games Osaka
技術部 人西 聖樹
masaki.hitonishi@dena.com
Copyright © DeNA Co.,Ltd. All Rights Reserved.
YAPC !
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Kansai !
Copyright © DeNA Co.,Ltd. All Rights Reserved.
めでたい!
Copyright © DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 人西 聖樹(ひとにし まさき)
 Twitter: @sairoutine
 株式会社 DeNA Games Osaka
 Webアプリケーションエンジニア
 生まれは京都、育ちは大阪
Copyright © DeNA Co.,Ltd. All Rights Reserved.
関西以外から来られたか
たどれくらいいます?
Copyright © DeNA Co.,Ltd. All Rights Reserved.
突然ですが
Copyright © DeNA Co.,Ltd. All Rights Reserved.
本セッションは
全て関西弁でお送りします。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
それではやっていきまんねん
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ウソです
Copyright © DeNA Co.,Ltd. All Rights Reserved.
関西人は
「〜まんねん」
使いません
※独自調査
Copyright © DeNA Co.,Ltd. All Rights Reserved.
でも飴のことを
「あめちゃん」って
言う人は多いです
※独自調査
Copyright © DeNA Co.,Ltd. All Rights Reserved.
改めてよろしく
お願いします。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ご当地スポンサー枠
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mobage
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mobage 10 周年
Copyright © DeNA Co.,Ltd. All Rights Reserved.
実はもう11周年!
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
まだまだ
1000タイトル以上が
稼働中
Copyright © DeNA Co.,Ltd. All Rights Reserved.
DeNA 2016年度 第3四半期決算説明会資料より引用
126億
56億
Copyright © DeNA Co.,Ltd. All Rights Reserved.
まだまだ日本最大規模の
プラットフォームで
あることに変わりはありません
Copyright © DeNA Co.,Ltd. All Rights Reserved.
そんな Mobage は、
Perl で作られています
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Perl 5.8.8
Copyright © DeNA Co.,Ltd. All Rights Reserved.
独自フレームワーク
MobaSiF
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日はなすこと
 僕らが開発・運用しているシステムについて
 レガシーコード改善の歴史
 ドメイン駆動設計の導入
 学び
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日はなすこと
 僕らが開発・運用しているシステムについて
 レガシーコード改善の歴史
 ドメイン駆動設計の導入
 学び
Copyright © DeNA Co.,Ltd. All Rights Reserved.
 Mobage の 1 ブラウザゲームタイトル
 いわゆる「ソーシャルゲーム」
 システムとしては、LAMP(Linux, Apache,
MySQL, Perl) + Memcached etc…
Copyright © DeNA Co.,Ltd. All Rights Reserved.
 通常の機能に加えて、期間限定のイベントを月に4回開催し
てます。
 イベント自体は、前月のシステムを使いまわしていますが、
毎月何かしらの機能追加/改修を行ってます。
 たまに新規イベントとかも作ったりします。
 新規イベントは、開発期間3ヶ月〜6ヶ月と結構長い
 通常のゲームの機能をあまり流用しないことが多く、1から
ゲームを作る感覚。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
アーキテクチャ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
MVC
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Model
 情報を扱うクラス
 O/Rマッパー
 RDBMSの1テーブル1クラス
 フレームワーク or ライブラリが提供してない
 独自実装
 Rails の Active Record に影響受けてそうなAPI
# 1行取得
my $record = Class->find($pk);
# 1行 UPDATE
$record->hp(100);
$record->save();
Copyright © DeNA Co.,Ltd. All Rights Reserved.
View
 Mobasif 付属のテンプレートエンジン「Mtemplate」
 ガラケー3キャリアに対応するHTMLを1つのテンプレート
で記載可能
 事前コンパイルにより、リクエストごとのテンプレートの
パースを省略
 主要な部分は XS で書かれており、高速
<!-- 条件分岐 -->
$ if (condition) { $
<div> hoge </div>
$ } elsif (conditions) { $
<div>fuga</div>
$ } else { $
<div>piyo</div>
$ } $
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Controller
 開発者内では、Page 層と呼称されることが
多い
 Conf ファイルに、URL と、URLに該当する
クラス/メソッドを記載する
 入力値のvalidation
Copyright © DeNA Co.,Ltd. All Rights Reserved.
5年くらい運用してくると出て来る課題
人の入れ替わり
→実装した人が既に退職してる。5年も運用してると、現在のチームメン
バーが書いたコードは、システムの10%くらいとか。
知識の継承
知識の継承が出来ておらず、追加実装/変更に対して、いちいち既存の実
装の調査に工数がかかる。既存の実装を弄ると、あらぬところにエンバ
グする。
仕様の肥大化
そもそも実装だけでなくシステムの仕様も肥大化していて、新規仕様を追
加するに当たって、既存仕様との不整合による考慮漏れが発生する。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日はなすこと
 僕らが開発・運用しているシステムについて
 レガシーコード改善の歴史
 ドメイン駆動設計の導入
 学び
Copyright © DeNA Co.,Ltd. All Rights Reserved.
レガシー Perl 特有の辛さ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
EUC-JP
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Shift_JIS
Copyright © DeNA Co.,Ltd. All Rights Reserved.
データベースは Shift_JIS
プログラムは EUC-JP
スマートフォン向け出力は UTF-8
ガラケー向け出力は Shift_JIS
Copyright © DeNA Co.,Ltd. All Rights Reserved.
連想配列リファレンスによる引数の受け渡し
→連想配列の作成元までコードを読まないとどういう挙動の
コードかわからない。
# 例
sub getEquipmentsString {
my ($items) = @_;
if ( scalar(@$items) ) {
my @strings = ();
for my $rhItem (@$items) {
push(@strings, "$rhItem->{name}x$rhItem->{num}");
}
return join('/', @strings);
} else {
return undef;
}
}
Copyright © DeNA Co.,Ltd. All Rights Reserved.
その他、個人的に辛いなぁと思ったこと
 全てを管理する神クラス
 引数の連想配列リファレンスを変更する
addXXXInfo 的なメソッド
 超巨大な if 文(30回以上 if ~ elsif し続ける)
 値が変更されうるグローバル変数 (!)
 プラットフォーム側と1枚岩の超モノリシッ
クなシステムなところとか
Copyright © DeNA Co.,Ltd. All Rights Reserved.
むむ、ちゃんとオブジェクト指向
やれば解決しそう感
Copyright © DeNA Co.,Ltd. All Rights Reserved.
これまでもオブジェクト指向は
ちょっとずつ取り入れてきました
Copyright © DeNA Co.,Ltd. All Rights Reserved.
DAO 層の追加
 Data Access Object
 RDBMSのデータをオブジェクトとして扱える
 Mobasif には DA (DBI クラスのラッパー)しかなかった
 オブジェクトを扱うだけで、SQL を発行できるので、SQL
関係のバグが減る
 SQL をコントローラーなどに書かずに済む
 共通で使われるような SQL を一箇所に集約できる
 ゲームロジックについては引き続き Controller 側あった
→ Fat Controller になる問題
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Model 層の追加
 RDBMS との連携だけでなく、状態を操作する処理
も担当する
 get_group_info メソッドとか
increment_user_num メソッドとか
 そのうち、他の Model を操作するコードとかも増
える
 長大なゲームロジックのコードも増えだす
 今度は Fat Model になってくる問題が
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Logic 層の追加
 Model からゲームロジックに関する部分を
切り出す
 複数の Model の操作や、処理順序通りの実
行などを行う
Copyright © DeNA Co.,Ltd. All Rights Reserved.
残る課題感
 インスタンス化してるけど結局 Funcっぽい使い方のクラス
→ クラスメソッドで良いのでは
→ むしろ状態を持つと、状態の遷移を考慮しないといけなくなる
 せっかくオブジェクト指向で書いてるのにif文がたくさん!
→ ポリモーフィズムとは
 newに連想配列リファレンスを渡して、外から編集したり参照したり
→ カプセル化したい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
もうちょっとオブジェクト指向
における指針が欲しい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
特にビジネスロジックに焦点を当てた...
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日はなすこと
 僕らが開発・運用しているシステムについて
 レガシーコード改善の歴史
 ドメイン駆動設計の導入
 学び
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドメイン駆動設計とは
厳しい現実の中で、
ソフトウェア設計を習得しようと
奮闘してきた技術者の物語。
不完全な状況の中で、
抽象的な設計原則を、
現実のソフトウェアに
適用するための助言。
日本語版への序文 by エリック・エヴァンス
Copyright © DeNA Co.,Ltd. All Rights Reserved.
バイブル
Copyright © DeNA Co.,Ltd. All Rights Reserved.
より実践的な方
Copyright © DeNA Co.,Ltd. All Rights Reserved.
哲学と戦術
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドメイン駆動設計とは
哲学
ドメインモデル
ユビキタス言語
戦術
エンティティ
値オブジェクト
サービス
レイヤー化アーキテクチャ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドメインモデルと
レイヤ化アーキテクチャに
フォーカスする
Copyright © DeNA Co.,Ltd. All Rights Reserved.
レイヤ化アーキテクチャ
 『レイヤ化アーキテクチャ』による『ドメイン層
の隔離』
 ドメイン層を他階層と分ける事により、各層の責
務を明確化する。
 特にドメイン層が隔離されることで、後のビジネ
スロジックの進化に実装がついていきやすくなる。
 ドメイン層にミドルウェアのためのコードやユー
ザーの入力のためのコードを入れない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
レイヤー化アーキテクチャ
 ユーザインターフェース層 ユーザに情報を表示し、ユーザの入力を認
識
→ View, Controller
 アプリケーション層 ドメイン層のオブジェクトを協調させ、作業の調
整を行う
→ Controller, Service
 ドメイン層 ロジックの表現
→ Domain
 インフラ層 上位レイヤを支える
→ DAO。MySQL, Memcached のスキーマと、ドメインモデルの差異を吸
収する。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
やったこと
Domain と Service 層の追加
 Domain はドメインモデルを表す
 オブジェクト指向におけるオブジェクト(語弊を怖れず言うと)
 世界を抽象化した際の物体
 Service はドメイン同士を組み合わせた処理
 及びそのワークフローを組み立てる
 Service は状態を持たない
 →既存の Logic 層を Domain と Service に分解していく
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ロジックを
Domain と Service に分解していく
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ボスへの攻撃の処理を考えてみ
る
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドメインモデルの抽出
 「『ユーザー』が『ボス』に攻撃する」
 →Domain::User, Domain::Boss の発見
 「『アイテム』を使って攻撃する」
 Domain::UserItem の発見
 「バトルに参加して攻撃する」
 →Domain::BattleField の発見
→5W1H でドメインモデルを発見していく
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドメインモデルの発見
 ユーザーとは?
→ デッキを持つ
→ デッキは6枚のカードで構成される
→ Domain::Deck の発見、Domain::Card の発見
 ボスとは?
→期間限定ボス、シングルボス、マルチボスなど種類が存在す
る
→ Domain::Boss:Scheduled, Domain::Boss::Single,
Domain::Boss:Multi の発見
→ Domain をさらに分解していくと、さらに Domain を発見
できる
Copyright © DeNA Co.,Ltd. All Rights Reserved.
「攻撃する」処理
 Service::Attack
→ 各種ドメインを組み合わせて、「攻撃」時に起こる各ドメ
インの状態を操作する
→ユーザーのデッキのHP, ボスのHP, 消費リソースの減少
etc…
 サービスは状態を持たない
→あくまで状態はドメインが持つ
 Service::Attack->exec($user, $boss, $deck, $item,
$battlefield etc..);
→サービスのメソッドは引数が長くなりがち…
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Service
Service は処理の順番を担保する
 攻撃ならば
 → アイテムの所持チェック
 → アイテムの消費
 → デッキの攻撃力計算
 → ボスの攻撃力計算
 → デッキのHP減少
 → ボスのHP減少
 → ユーザーの行動ログの保存
etc..
Copyright © DeNA Co.,Ltd. All Rights Reserved.
機能追加の設計をする際にエンジニアが考えること
 1. ドメインモデルの発見
 →機能について関わる物体(オブジェクト)を洗う。
 →洗ったオブジェクトが持つと考えられるメソッ
ドを洗う
 →Domain::Userなら reduce_item,
Domain::Card なら calc_attack 等
 2. ドメイン同士の処理の順番を考える(ワークフ
ロー)
 →アイテム消費→ボスのHP減少→味方のHP減少
etc..
Copyright © DeNA Co.,Ltd. All Rights Reserved.
議論になったところ(抜粋)
Copyright © DeNA Co.,Ltd. All Rights Reserved.
古いコードとの接続をどうするか?
 ゲーム共通で使用するアイテム等。
 リファクタできる箇所はリファクタした。
 できなければラッパークラスを作って隠蔽した(デ
ザパタで言うAdaper )
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Service は状態を持つべきか否か
 →今後の機能改修で、Service が複雑な状態操作をするようになってい
くことを怖れて、状態を持たせない
my $service = Service->new(%args); # 必要な User や Boss を渡す
$service->exec(); # 実行
Copyright © DeNA Co.,Ltd. All Rights Reserved.
チームメンバーへの理解
 新規の機能追加にアサインされたので、まず僕がコードを書
くところから
 事前の根回し(オブジェクト勉強会/別プロジェクトの勉強会
等の情報)
 実装は、ドメイン駆動/実践ドメイン駆動読みつつサグりサ
グり
 もう一人のアサインされたエンジニアには、合意だけ取って
 まず僕がコード書いて、相方にはコードベースで設計を共有
 今思えばあまりよくなかった(口頭/レビューで設計をすりあ
わせるべき)
 導入後は、社内勉強会で他のメンバーへ擦り合わせ
 僕/相方が関わるプロジェクトでコードがどんどん増えて
いった
 コードを書く前の勉強会はピンとこない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日はなすこと
 僕らが開発・運用しているシステムについて
 レガシーコード改善の歴史
 ドメイン駆動設計の導入
 学び
Copyright © DeNA Co.,Ltd. All Rights Reserved.
以下が解決
 インスタンス化してるけど結局 Funcっぽい使い方のクラス
→ ドメインモデルとして捉えられるものがインスタンス化できるクラス
→ むしろ状態を持つと、状態の遷移を考慮しないといけなくなる
 せっかくオブジェクト指向で書いてるのにif文がたくさん!
→ ポリモーフィズムで if を排除 (これはただのオブジェクト指向)
 newに連想配列リファレンスを渡して、外から編集したり参照したり
→ ドメインモデルをコードに落とし込み、メソッドとプロパティを定義す
ることで、クラスのAPIが明確に。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
学び
 あれ?これは結局ただのオーソドックスなオブジェクト指
向じゃない?感
→戦術だけ見てドメイン駆動設計をやり始めると、そうなる
→大切なことは哲学の方
 ドメイン駆動設計の解釈は人それぞれ。チーム内で認識を
すりあわせることが大切
→理論が正ではなく、チームで共有できた認識が最も正しい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
未来
 新規機能でドメイン駆動設計を実践する知見は溜
まったので、既存のコードも置き換えていってい
る
 実践したことで、設計についてチームで共通認識
があるのは良い
 要件定義/仕様作成の段階で、ユビキタス言語も
取り入れていきたい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ご清聴ありがとうございました
1 of 77

Recommended

flow による型のある世界入門 by
flow による型のある世界入門flow による型のある世界入門
flow による型のある世界入門sairoutine
4.5K views39 slides
ゲームエンジニアのためのデータベース設計 by
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
33.9K views32 slides
Mithril - 軽量/高速なMVCフレームワーク by
Mithril - 軽量/高速なMVCフレームワークMithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークsairoutine
3.2K views44 slides
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック by
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
48.1K views30 slides
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事 by
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事Manabu Koga
102.6K views145 slides
Implementing Domain-Driven Design: Part 1 by
Implementing Domain-Driven Design: Part 1Implementing Domain-Driven Design: Part 1
Implementing Domain-Driven Design: Part 1Atsushi Kambara
6.5K views55 slides

More Related Content

What's hot

PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発 by
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発infinite_loop
43K views77 slides
ドメイン駆動設計 ( DDD ) をやってみよう by
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
50.1K views45 slides
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~ by
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
67.3K views35 slides
ちいさなオブジェクトでドメインモデルを組み立てる by
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる増田 亨
15K views26 slides
C#実装から見るDDD(ドメイン駆動設計) by
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
20.4K views91 slides
リッチなドメインモデル 名前探し by
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
14.4K views29 slides

What's hot(20)

PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発 by infinite_loop
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
infinite_loop43K views
ドメイン駆動設計 ( DDD ) をやってみよう by 増田 亨
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨50.1K views
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~ by infinite_loop
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop67.3K views
ちいさなオブジェクトでドメインモデルを組み立てる by 増田 亨
ちいさなオブジェクトでドメインモデルを組み立てるちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨15K views
C#実装から見るDDD(ドメイン駆動設計) by Takuya Kawabe
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
Takuya Kawabe20.4K views
リッチなドメインモデル 名前探し by 増田 亨
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨14.4K views
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ by SEGADevTech
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech9.1K views
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring by 増田 亨
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨29.8K views
ドメイン駆動設計 基本を理解する by 増田 亨
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨117.5K views
JavaScriptおよびXPages Vote技術解説 by 賢次 海老原
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
賢次 海老原891 views
某S社のddd(メイリオ) by kumake
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)
kumake 7.7K views
FiNC DDD第一回勉強会 by 裕紀 重村
FiNC DDD第一回勉強会FiNC DDD第一回勉強会
FiNC DDD第一回勉強会
裕紀 重村12.3K views
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 by Koichiro Matsuoka
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka88K views
自宅で出来る!ゲームサーバの作り方 by 光晶 上原
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
光晶 上原27.6K views
ドメイン駆動で開発する ラフスケッチから実装まで by 増田 亨
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨15.7K views
私がドメイン駆動設計をやる理由 by 増田 亨
私がドメイン駆動設計をやる理由私がドメイン駆動設計をやる理由
私がドメイン駆動設計をやる理由
増田 亨22.9K views
2015-12-16 某S社、出直しDDDってるってよ by kumake
2015-12-16 某S社、出直しDDDってるってよ2015-12-16 某S社、出直しDDDってるってよ
2015-12-16 某S社、出直しDDDってるってよ
kumake 4.4K views
DDD 20121106 SEA Forum November by 増田 亨
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨4.2K views
愛せよ、さもなくば捨てよ。 by Sho Yoshida
愛せよ、さもなくば捨てよ。愛せよ、さもなくば捨てよ。
愛せよ、さもなくば捨てよ。
Sho Yoshida1.4K views

Viewers also liked

2017年春のPerl by
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
10K views72 slides
CGI Perlでわかる!サーバレス by
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレスTatsuro Hisamori
203.3K views25 slides
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用 by
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用純生 野田
2K views50 slides
First step of Performance Tuning by
First step of Performance TuningFirst step of Performance Tuning
First step of Performance Tuningrisou
1.3K views59 slides
Touhou Project on JavaScript by
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScriptsairoutine
823 views13 slides
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA by
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAメールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAazumakuniyuki 🐈
6.7K views52 slides

Viewers also liked(20)

2017年春のPerl by charsbar
2017年春のPerl2017年春のPerl
2017年春のPerl
charsbar10K views
CGI Perlでわかる!サーバレス by Tatsuro Hisamori
CGI Perlでわかる!サーバレスCGI Perlでわかる!サーバレス
CGI Perlでわかる!サーバレス
Tatsuro Hisamori203.3K views
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用 by 純生 野田
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
純生 野田2K views
First step of Performance Tuning by risou
First step of Performance TuningFirst step of Performance Tuning
First step of Performance Tuning
risou1.3K views
Touhou Project on JavaScript by sairoutine
Touhou Project on JavaScriptTouhou Project on JavaScript
Touhou Project on JavaScript
sairoutine823 views
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA by azumakuniyuki 🐈
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKAメールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
メールフォームからメールを送る近代的な方法 | YAPC::Kansai 2017 OSAKA
azumakuniyuki 🐈6.7K views
Perl ウェブ開発の中世〜CGI と Plack の間〜 by 鉄次 尾形
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜
鉄次 尾形8.7K views
YAPC::KANSAI 2017 LT by maka2donzoko
YAPC::KANSAI 2017 LTYAPC::KANSAI 2017 LT
YAPC::KANSAI 2017 LT
maka2donzoko1.1K views
オープンデータを利用したWebアプリ開発 by dokechin
オープンデータを利用したWebアプリ開発オープンデータを利用したWebアプリ開発
オープンデータを利用したWebアプリ開発
dokechin4.5K views
JSでファミコンエミュレータを作った時の話 by sairoutine
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
sairoutine29.7K views
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka by azumakuniyuki 🐈
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 OsakaHokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
Hokkaido.pm#13参加報告 | YAPC::Kansai 2017 Osaka
azumakuniyuki 🐈879 views
Twitterの被ブロック数可視化ツールを作ってみた by おさ OSA
Twitterの被ブロック数可視化ツールを作ってみたTwitterの被ブロック数可視化ツールを作ってみた
Twitterの被ブロック数可視化ツールを作ってみた
おさ OSA15.5K views
Ranking system by Elasticsearch by Kazuhiro Osawa
Ranking system by ElasticsearchRanking system by Elasticsearch
Ranking system by Elasticsearch
Kazuhiro Osawa2.8K views
H2O x mrubyで人はどれだけ幸せになれるのか by Ichito Nagata
H2O x mrubyで人はどれだけ幸せになれるのかH2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのか
Ichito Nagata13.7K views
JS と Canvas で作るシューティングゲーム by sairoutine
JS と Canvas で作るシューティングゲームJS と Canvas で作るシューティングゲーム
JS と Canvas で作るシューティングゲーム
sairoutine2.5K views
DevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのこと by Terui Masashi
DevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのことDevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのこと
DevOpsとか言う前にAWSエンジニアに知ってほしいアプリケーションのこと
Terui Masashi16.9K views
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする by sairoutine
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
sairoutine5.6K views
ぐるぐるDDD(ドメイン駆動設計)に参加してみました by Takuya Kawabe
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
Takuya Kawabe6.1K views
TDDBC Fukuoka Day1 by Takuto Wada
TDDBC Fukuoka Day1TDDBC Fukuoka Day1
TDDBC Fukuoka Day1
Takuto Wada22.7K views
Enduring CSS by Takazudo
Enduring CSSEnduring CSS
Enduring CSS
Takazudo 3.9K views

Similar to レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる

DeNAの最新のマスタデータ管理システム Oyakata の全容 by
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容sairoutine
3.6K views29 slides
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy) by
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)Toshiharu Sugiyama
15.1K views53 slides
DeNAのゲーム開発を支える Game Backend as a Service by
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceMakoto Haruyama
20.4K views50 slides
ソーシャルアプリを分析してみた by
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたDrecom Co., Ltd.
9.2K views32 slides
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB) by
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)Amazon Web Services Japan
2.6K views45 slides
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon by
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA
3K views43 slides

Similar to レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる(20)

DeNAの最新のマスタデータ管理システム Oyakata の全容 by sairoutine
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
sairoutine3.6K views
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy) by Toshiharu Sugiyama
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
Toshiharu Sugiyama15.1K views
DeNAのゲーム開発を支える Game Backend as a Service by Makoto Haruyama
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a Service
Makoto Haruyama20.4K views
ソーシャルアプリを分析してみた by Drecom Co., Ltd.
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
Drecom Co., Ltd.9.2K views
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB) by Amazon Web Services Japan
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon by DeNA
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA3K views
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー) by dena_study
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
DeNA の新しいネイティブ開発(パズル戦隊デナレンジャー)
dena_study8.3K views
DeNAインフラの今とこれから - 今編 - by Tomoya Kabe
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
Tomoya Kabe5.5K views
DeNAのプログラミング教育の取り組み #denatechcon by DeNA
DeNAのプログラミング教育の取り組み #denatechconDeNAのプログラミング教育の取り組み #denatechcon
DeNAのプログラミング教育の取り組み #denatechcon
DeNA1.4K views
地方企業がソーシャルゲーム開発を成功させるための10のポイント by Kentaro Matsui
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
Kentaro Matsui4.8K views
DeNAのゲームを支えるプラットフォーム Sakasho #denatechcon by DeNA
DeNAのゲームを支えるプラットフォーム Sakasho #denatechconDeNAのゲームを支えるプラットフォーム Sakasho #denatechcon
DeNAのゲームを支えるプラットフォーム Sakasho #denatechcon
DeNA5.7K views
Htmlコーディングの効率化 前編 by Yasuhito Yabe
Htmlコーディングの効率化 前編Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編
Yasuhito Yabe2.1K views
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach... by Amazon Web Services Japan
20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...20161027 hadoop summit  Generating Recommendations at Amazon Scale with Apach...
20161027 hadoop summit Generating Recommendations at Amazon Scale with Apach...
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術 by Satoshi Yamafuji
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
Satoshi Yamafuji39.8K views
DeNA流cocos2d xとの付き合い方 by dena_study
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方
dena_study18.1K views
なぜ私たちは「効率化」を目指すのか(DeNA Games Tokyo) by DeNA Games Tokyo
なぜ私たちは「効率化」を目指すのか(DeNA Games Tokyo)なぜ私たちは「効率化」を目指すのか(DeNA Games Tokyo)
なぜ私たちは「効率化」を目指すのか(DeNA Games Tokyo)
DeNA Games Tokyo451 views

Recently uploaded

how query cost affects search behavior translated in JP by
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JPTobioka Ken
9 views16 slides
lt.pptx by
lt.pptxlt.pptx
lt.pptxtomochamarika
51 views13 slides
図解で理解するvetKD by
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKDryoo toku
84 views22 slides
AIで始めるRustプログラミング #SolDevHub by
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHubK Kinzal
20 views25 slides
robotics42.pptx by
robotics42.pptxrobotics42.pptx
robotics42.pptxNatsutani Minoru
168 views18 slides
Najah Matsuo Self Introduction by
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
7 views29 slides

Recently uploaded(8)

how query cost affects search behavior translated in JP by Tobioka Ken
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JP
Tobioka Ken9 views
図解で理解するvetKD by ryoo toku
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKD
ryoo toku84 views
AIで始めるRustプログラミング #SolDevHub by K Kinzal
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHub
K Kinzal20 views
Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo7 views
3Dプリンタでロボット作るよ#1_黎明編 by Yoshihiro Shibata
3Dプリンタでロボット作るよ#1_黎明編3Dプリンタでロボット作るよ#1_黎明編
3Dプリンタでロボット作るよ#1_黎明編

レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる

  • 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. レガシーな Perl システムに DDD(ドメイン駆動設計) を 取り入れる 株式会社 DeNA Games Osaka 技術部 人西 聖樹 masaki.hitonishi@dena.com
  • 2. Copyright © DeNA Co.,Ltd. All Rights Reserved. YAPC !
  • 3. Copyright © DeNA Co.,Ltd. All Rights Reserved. Kansai !
  • 4. Copyright © DeNA Co.,Ltd. All Rights Reserved. めでたい!
  • 5. Copyright © DeNA Co.,Ltd. All Rights Reserved. 自己紹介  人西 聖樹(ひとにし まさき)  Twitter: @sairoutine  株式会社 DeNA Games Osaka  Webアプリケーションエンジニア  生まれは京都、育ちは大阪
  • 6. Copyright © DeNA Co.,Ltd. All Rights Reserved. 関西以外から来られたか たどれくらいいます?
  • 7. Copyright © DeNA Co.,Ltd. All Rights Reserved. 突然ですが
  • 8. Copyright © DeNA Co.,Ltd. All Rights Reserved. 本セッションは 全て関西弁でお送りします。
  • 9. Copyright © DeNA Co.,Ltd. All Rights Reserved. それではやっていきまんねん
  • 10. Copyright © DeNA Co.,Ltd. All Rights Reserved. ウソです
  • 11. Copyright © DeNA Co.,Ltd. All Rights Reserved. 関西人は 「〜まんねん」 使いません ※独自調査
  • 12. Copyright © DeNA Co.,Ltd. All Rights Reserved. でも飴のことを 「あめちゃん」って 言う人は多いです ※独自調査
  • 13. Copyright © DeNA Co.,Ltd. All Rights Reserved. 改めてよろしく お願いします。
  • 14. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 15. Copyright © DeNA Co.,Ltd. All Rights Reserved. ご当地スポンサー枠
  • 16. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mobage
  • 17. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mobage 10 周年
  • 18. Copyright © DeNA Co.,Ltd. All Rights Reserved. 実はもう11周年!
  • 19. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 20. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 21. Copyright © DeNA Co.,Ltd. All Rights Reserved. まだまだ 1000タイトル以上が 稼働中
  • 22. Copyright © DeNA Co.,Ltd. All Rights Reserved. DeNA 2016年度 第3四半期決算説明会資料より引用 126億 56億
  • 23. Copyright © DeNA Co.,Ltd. All Rights Reserved. まだまだ日本最大規模の プラットフォームで あることに変わりはありません
  • 24. Copyright © DeNA Co.,Ltd. All Rights Reserved. そんな Mobage は、 Perl で作られています
  • 25. Copyright © DeNA Co.,Ltd. All Rights Reserved. Perl 5.8.8
  • 26. Copyright © DeNA Co.,Ltd. All Rights Reserved. 独自フレームワーク MobaSiF
  • 27. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日はなすこと  僕らが開発・運用しているシステムについて  レガシーコード改善の歴史  ドメイン駆動設計の導入  学び
  • 28. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日はなすこと  僕らが開発・運用しているシステムについて  レガシーコード改善の歴史  ドメイン駆動設計の導入  学び
  • 29. Copyright © DeNA Co.,Ltd. All Rights Reserved.  Mobage の 1 ブラウザゲームタイトル  いわゆる「ソーシャルゲーム」  システムとしては、LAMP(Linux, Apache, MySQL, Perl) + Memcached etc…
  • 30. Copyright © DeNA Co.,Ltd. All Rights Reserved.  通常の機能に加えて、期間限定のイベントを月に4回開催し てます。  イベント自体は、前月のシステムを使いまわしていますが、 毎月何かしらの機能追加/改修を行ってます。  たまに新規イベントとかも作ったりします。  新規イベントは、開発期間3ヶ月〜6ヶ月と結構長い  通常のゲームの機能をあまり流用しないことが多く、1から ゲームを作る感覚。
  • 31. Copyright © DeNA Co.,Ltd. All Rights Reserved. アーキテクチャ
  • 32. Copyright © DeNA Co.,Ltd. All Rights Reserved. MVC
  • 33. Copyright © DeNA Co.,Ltd. All Rights Reserved. Model  情報を扱うクラス  O/Rマッパー  RDBMSの1テーブル1クラス  フレームワーク or ライブラリが提供してない  独自実装  Rails の Active Record に影響受けてそうなAPI # 1行取得 my $record = Class->find($pk); # 1行 UPDATE $record->hp(100); $record->save();
  • 34. Copyright © DeNA Co.,Ltd. All Rights Reserved. View  Mobasif 付属のテンプレートエンジン「Mtemplate」  ガラケー3キャリアに対応するHTMLを1つのテンプレート で記載可能  事前コンパイルにより、リクエストごとのテンプレートの パースを省略  主要な部分は XS で書かれており、高速 <!-- 条件分岐 --> $ if (condition) { $ <div> hoge </div> $ } elsif (conditions) { $ <div>fuga</div> $ } else { $ <div>piyo</div> $ } $
  • 35. Copyright © DeNA Co.,Ltd. All Rights Reserved. Controller  開発者内では、Page 層と呼称されることが 多い  Conf ファイルに、URL と、URLに該当する クラス/メソッドを記載する  入力値のvalidation
  • 36. Copyright © DeNA Co.,Ltd. All Rights Reserved. 5年くらい運用してくると出て来る課題 人の入れ替わり →実装した人が既に退職してる。5年も運用してると、現在のチームメン バーが書いたコードは、システムの10%くらいとか。 知識の継承 知識の継承が出来ておらず、追加実装/変更に対して、いちいち既存の実 装の調査に工数がかかる。既存の実装を弄ると、あらぬところにエンバ グする。 仕様の肥大化 そもそも実装だけでなくシステムの仕様も肥大化していて、新規仕様を追 加するに当たって、既存仕様との不整合による考慮漏れが発生する。
  • 37. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日はなすこと  僕らが開発・運用しているシステムについて  レガシーコード改善の歴史  ドメイン駆動設計の導入  学び
  • 38. Copyright © DeNA Co.,Ltd. All Rights Reserved. レガシー Perl 特有の辛さ
  • 39. Copyright © DeNA Co.,Ltd. All Rights Reserved. EUC-JP
  • 40. Copyright © DeNA Co.,Ltd. All Rights Reserved. Shift_JIS
  • 41. Copyright © DeNA Co.,Ltd. All Rights Reserved. データベースは Shift_JIS プログラムは EUC-JP スマートフォン向け出力は UTF-8 ガラケー向け出力は Shift_JIS
  • 42. Copyright © DeNA Co.,Ltd. All Rights Reserved. 連想配列リファレンスによる引数の受け渡し →連想配列の作成元までコードを読まないとどういう挙動の コードかわからない。 # 例 sub getEquipmentsString { my ($items) = @_; if ( scalar(@$items) ) { my @strings = (); for my $rhItem (@$items) { push(@strings, "$rhItem->{name}x$rhItem->{num}"); } return join('/', @strings); } else { return undef; } }
  • 43. Copyright © DeNA Co.,Ltd. All Rights Reserved. その他、個人的に辛いなぁと思ったこと  全てを管理する神クラス  引数の連想配列リファレンスを変更する addXXXInfo 的なメソッド  超巨大な if 文(30回以上 if ~ elsif し続ける)  値が変更されうるグローバル変数 (!)  プラットフォーム側と1枚岩の超モノリシッ クなシステムなところとか
  • 44. Copyright © DeNA Co.,Ltd. All Rights Reserved. むむ、ちゃんとオブジェクト指向 やれば解決しそう感
  • 45. Copyright © DeNA Co.,Ltd. All Rights Reserved. これまでもオブジェクト指向は ちょっとずつ取り入れてきました
  • 46. Copyright © DeNA Co.,Ltd. All Rights Reserved. DAO 層の追加  Data Access Object  RDBMSのデータをオブジェクトとして扱える  Mobasif には DA (DBI クラスのラッパー)しかなかった  オブジェクトを扱うだけで、SQL を発行できるので、SQL 関係のバグが減る  SQL をコントローラーなどに書かずに済む  共通で使われるような SQL を一箇所に集約できる  ゲームロジックについては引き続き Controller 側あった → Fat Controller になる問題
  • 47. Copyright © DeNA Co.,Ltd. All Rights Reserved. Model 層の追加  RDBMS との連携だけでなく、状態を操作する処理 も担当する  get_group_info メソッドとか increment_user_num メソッドとか  そのうち、他の Model を操作するコードとかも増 える  長大なゲームロジックのコードも増えだす  今度は Fat Model になってくる問題が
  • 48. Copyright © DeNA Co.,Ltd. All Rights Reserved. Logic 層の追加  Model からゲームロジックに関する部分を 切り出す  複数の Model の操作や、処理順序通りの実 行などを行う
  • 49. Copyright © DeNA Co.,Ltd. All Rights Reserved. 残る課題感  インスタンス化してるけど結局 Funcっぽい使い方のクラス → クラスメソッドで良いのでは → むしろ状態を持つと、状態の遷移を考慮しないといけなくなる  せっかくオブジェクト指向で書いてるのにif文がたくさん! → ポリモーフィズムとは  newに連想配列リファレンスを渡して、外から編集したり参照したり → カプセル化したい
  • 50. Copyright © DeNA Co.,Ltd. All Rights Reserved. もうちょっとオブジェクト指向 における指針が欲しい
  • 51. Copyright © DeNA Co.,Ltd. All Rights Reserved. 特にビジネスロジックに焦点を当てた...
  • 52. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日はなすこと  僕らが開発・運用しているシステムについて  レガシーコード改善の歴史  ドメイン駆動設計の導入  学び
  • 53. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドメイン駆動設計とは 厳しい現実の中で、 ソフトウェア設計を習得しようと 奮闘してきた技術者の物語。 不完全な状況の中で、 抽象的な設計原則を、 現実のソフトウェアに 適用するための助言。 日本語版への序文 by エリック・エヴァンス
  • 54. Copyright © DeNA Co.,Ltd. All Rights Reserved. バイブル
  • 55. Copyright © DeNA Co.,Ltd. All Rights Reserved. より実践的な方
  • 56. Copyright © DeNA Co.,Ltd. All Rights Reserved. 哲学と戦術
  • 57. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドメイン駆動設計とは 哲学 ドメインモデル ユビキタス言語 戦術 エンティティ 値オブジェクト サービス レイヤー化アーキテクチャ
  • 58. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドメインモデルと レイヤ化アーキテクチャに フォーカスする
  • 59. Copyright © DeNA Co.,Ltd. All Rights Reserved. レイヤ化アーキテクチャ  『レイヤ化アーキテクチャ』による『ドメイン層 の隔離』  ドメイン層を他階層と分ける事により、各層の責 務を明確化する。  特にドメイン層が隔離されることで、後のビジネ スロジックの進化に実装がついていきやすくなる。  ドメイン層にミドルウェアのためのコードやユー ザーの入力のためのコードを入れない
  • 60. Copyright © DeNA Co.,Ltd. All Rights Reserved. レイヤー化アーキテクチャ  ユーザインターフェース層 ユーザに情報を表示し、ユーザの入力を認 識 → View, Controller  アプリケーション層 ドメイン層のオブジェクトを協調させ、作業の調 整を行う → Controller, Service  ドメイン層 ロジックの表現 → Domain  インフラ層 上位レイヤを支える → DAO。MySQL, Memcached のスキーマと、ドメインモデルの差異を吸 収する。
  • 61. Copyright © DeNA Co.,Ltd. All Rights Reserved. やったこと Domain と Service 層の追加  Domain はドメインモデルを表す  オブジェクト指向におけるオブジェクト(語弊を怖れず言うと)  世界を抽象化した際の物体  Service はドメイン同士を組み合わせた処理  及びそのワークフローを組み立てる  Service は状態を持たない  →既存の Logic 層を Domain と Service に分解していく
  • 62. Copyright © DeNA Co.,Ltd. All Rights Reserved. ロジックを Domain と Service に分解していく
  • 63. Copyright © DeNA Co.,Ltd. All Rights Reserved. ボスへの攻撃の処理を考えてみ る
  • 64. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドメインモデルの抽出  「『ユーザー』が『ボス』に攻撃する」  →Domain::User, Domain::Boss の発見  「『アイテム』を使って攻撃する」  Domain::UserItem の発見  「バトルに参加して攻撃する」  →Domain::BattleField の発見 →5W1H でドメインモデルを発見していく
  • 65. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドメインモデルの発見  ユーザーとは? → デッキを持つ → デッキは6枚のカードで構成される → Domain::Deck の発見、Domain::Card の発見  ボスとは? →期間限定ボス、シングルボス、マルチボスなど種類が存在す る → Domain::Boss:Scheduled, Domain::Boss::Single, Domain::Boss:Multi の発見 → Domain をさらに分解していくと、さらに Domain を発見 できる
  • 66. Copyright © DeNA Co.,Ltd. All Rights Reserved. 「攻撃する」処理  Service::Attack → 各種ドメインを組み合わせて、「攻撃」時に起こる各ドメ インの状態を操作する →ユーザーのデッキのHP, ボスのHP, 消費リソースの減少 etc…  サービスは状態を持たない →あくまで状態はドメインが持つ  Service::Attack->exec($user, $boss, $deck, $item, $battlefield etc..); →サービスのメソッドは引数が長くなりがち…
  • 67. Copyright © DeNA Co.,Ltd. All Rights Reserved. Service Service は処理の順番を担保する  攻撃ならば  → アイテムの所持チェック  → アイテムの消費  → デッキの攻撃力計算  → ボスの攻撃力計算  → デッキのHP減少  → ボスのHP減少  → ユーザーの行動ログの保存 etc..
  • 68. Copyright © DeNA Co.,Ltd. All Rights Reserved. 機能追加の設計をする際にエンジニアが考えること  1. ドメインモデルの発見  →機能について関わる物体(オブジェクト)を洗う。  →洗ったオブジェクトが持つと考えられるメソッ ドを洗う  →Domain::Userなら reduce_item, Domain::Card なら calc_attack 等  2. ドメイン同士の処理の順番を考える(ワークフ ロー)  →アイテム消費→ボスのHP減少→味方のHP減少 etc..
  • 69. Copyright © DeNA Co.,Ltd. All Rights Reserved. 議論になったところ(抜粋)
  • 70. Copyright © DeNA Co.,Ltd. All Rights Reserved. 古いコードとの接続をどうするか?  ゲーム共通で使用するアイテム等。  リファクタできる箇所はリファクタした。  できなければラッパークラスを作って隠蔽した(デ ザパタで言うAdaper )
  • 71. Copyright © DeNA Co.,Ltd. All Rights Reserved. Service は状態を持つべきか否か  →今後の機能改修で、Service が複雑な状態操作をするようになってい くことを怖れて、状態を持たせない my $service = Service->new(%args); # 必要な User や Boss を渡す $service->exec(); # 実行
  • 72. Copyright © DeNA Co.,Ltd. All Rights Reserved. チームメンバーへの理解  新規の機能追加にアサインされたので、まず僕がコードを書 くところから  事前の根回し(オブジェクト勉強会/別プロジェクトの勉強会 等の情報)  実装は、ドメイン駆動/実践ドメイン駆動読みつつサグりサ グり  もう一人のアサインされたエンジニアには、合意だけ取って  まず僕がコード書いて、相方にはコードベースで設計を共有  今思えばあまりよくなかった(口頭/レビューで設計をすりあ わせるべき)  導入後は、社内勉強会で他のメンバーへ擦り合わせ  僕/相方が関わるプロジェクトでコードがどんどん増えて いった  コードを書く前の勉強会はピンとこない
  • 73. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日はなすこと  僕らが開発・運用しているシステムについて  レガシーコード改善の歴史  ドメイン駆動設計の導入  学び
  • 74. Copyright © DeNA Co.,Ltd. All Rights Reserved. 以下が解決  インスタンス化してるけど結局 Funcっぽい使い方のクラス → ドメインモデルとして捉えられるものがインスタンス化できるクラス → むしろ状態を持つと、状態の遷移を考慮しないといけなくなる  せっかくオブジェクト指向で書いてるのにif文がたくさん! → ポリモーフィズムで if を排除 (これはただのオブジェクト指向)  newに連想配列リファレンスを渡して、外から編集したり参照したり → ドメインモデルをコードに落とし込み、メソッドとプロパティを定義す ることで、クラスのAPIが明確に。
  • 75. Copyright © DeNA Co.,Ltd. All Rights Reserved. 学び  あれ?これは結局ただのオーソドックスなオブジェクト指 向じゃない?感 →戦術だけ見てドメイン駆動設計をやり始めると、そうなる →大切なことは哲学の方  ドメイン駆動設計の解釈は人それぞれ。チーム内で認識を すりあわせることが大切 →理論が正ではなく、チームで共有できた認識が最も正しい
  • 76. Copyright © DeNA Co.,Ltd. All Rights Reserved. 未来  新規機能でドメイン駆動設計を実践する知見は溜 まったので、既存のコードも置き換えていってい る  実践したことで、設計についてチームで共通認識 があるのは良い  要件定義/仕様作成の段階で、ユビキタス言語も 取り入れていきたい
  • 77. Copyright © DeNA Co.,Ltd. All Rights Reserved. ご清聴ありがとうございました