SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
サービスクラス、その前に
自己紹介
植森 康友
株式会社Aiming 大阪スタジオ所属
主な仕事
WebAPI開発
社内ツール開発
devops
Dockerおじさん
最近はkubernetesも
株式会社Aimingについて
Railsの使い所
ゲームのWebAPI
社内ツール、管理ツールなどのWebアプリケーション
今日の話
サービスクラスなんとなくわかるけど、ぐらいの人向け
個人的にサービスクラスとかそういうのの前に知っておいてほしい
ことを話します
ちょっとエモめ
ドメインサービス
Railsで多く語られてきた「サービスクラス」(に近いもの)
ビジネスロジックを表現するための一つの手段
Railsの文脈ではだいたい複数のモデルにまたがる処理を責務として
持つクラス
どのドメインモデルにも紐付かないビジネスロジックを表現するた
めのもの
例えば
キャラクター作成時には初期武器と初期ジョブを付与する
ログイン時にギフトのマスタ情報を参照して受け取ってないギ
フトをキャラクターに付与する
ドメインサービス
Railsで多く語られてきた「サービスクラス」(に近いもの)
ビジネスロジックを表現するための一つの手段
Railsの文脈ではだいたい複数のモデルにまたがる処理を責務として
持つクラス
どのドメインモデルにも紐付かないビジネスロジックを表現するた
めのもの
例えば
キャラクター作成時には初期武器と初期ジョブを付与する
ログイン時にギフトのマスタ情報を参照して受け取ってないギ
フトをキャラクターに付与する
ビジネスロジックってなんだ???
ビジネスロジック
データに対する処理手順といったようなものを指す
ビジネスロジックという用語は明確な定義がなく、人によって意味
が異なる可能性がある。
そもそもMVCとは何だったのか?
よくある説明
Controller: ModelとViewをつなぐもの
View: ユーザへのプレゼンテーション
Model: ビジネスロジック
Modelとはビジネスロジックである。
ビジネスロジックという用語は明確な定義がない
('‑') ???
MVCとは何だったのか?
参考: あの日見たM V WhateverのModelを僕たちはまだ知らない
View: ユーザへのプレゼンテーション
Controller: ModelとViewをつなぐもの
Model: ViewとController以外の全て
そもそもMVCはプレゼンテーションとモデルを分割するためのもの。
MVCはModelの設計方針について何一つ語ってはいない
じゃあModelの設計どうしたらいいの?
RailsはMVCフレームワークである
Modelの設計方針はエンジニアの手に委ねられている
当然の話として、アプリケーションの振る舞いはアプリケーション
によって違う
例えば、WebAPIとWebアプリケーションの設計は同じように
はいかない
ただしRailsには ActiveRecord という強力なModelの指針がある
Rails Guide曰く、  Active Recordとは、MVCで言うところのM、つまりモ
デルに相当するもの 
Railsの出発点は Model = ActiveRecord 
しかしRailsならではのつらみ
時代がたち、出発点がActiveRecordであることから来るつらみが溢
れてきた
PoEAAやDDDで紹介されているようなActiveRecord以外のModel
の設計パターンが非常に取りづらい(相性が悪い)
Railsならではのアプローチを模索していく必要がある
ここ数年のRailsエンジニアのModelとの戦いは、
 ActiveRecord = Model という固定概念からいかに脱却するかの戦い
Decorator
Helperが関数的であり、OOP的に扱いたいという欲求から生まれた
いわゆるデコレータパターン
データオブジェクトからViewに対する振る舞いを分離する
Form
Webアプリケーションで複雑になりがちなFormをオブジェクト化
したもの
データオブジェクトからFormに表示するための振る舞いを分離する
値オブジェクト的な側面も持つ
場合によってはvalidationなどの責務も持つ
Service
ビジネスロジックの一部をオブジェクト化したもの
複数のデータオブジェクトのトランザクション境界をActiveRecord
から分離する
DDD本来のドメインモデルからは少し変わっている(が、気にしな
くて良い)
エトセトラ
Serviceクラスが銀の弾丸ではないし、今まで語られてきたパターンだけ
がModelの設計パターンではない
 Repository(Query) 複数のARからデータを1つのオブジェクト、
あるいはそのコレクションにマッピングする
 Policy banken gem。ユーザの権限をオブジェクト化する
 Serializer active_record_serializers gem。jsonなどのデータ形
式にキャストする
 Value Object 値そのものをオブジェクト化したもの。
Immutableが望ましい。Date、URI、Pathnameなど。
 Validator 、  Callback 、etc....
サービスクラスとかの前に考えたいこと
自分たちのアプリケーションはどのぐらいの規模になりそうか?
Modelの設計方針はどうするのか?
アプリケーションはどういう振る舞いが期待されるのか?
WebAPI?
Webアプリケーション?
まとめ
設計とは地図のようなもの。チーム全体で「自分たちのアプリケーショ
ン」に対する共通認識を持つのが重要だと思います。
ModelのRailは自分たちで引いていきましょう!
余談: 初日の感想
Railsの設計論はModelを卒業してアプリケーション全体のデザインに届
きつつあるのかなと思いました
We are hiring!
株式会社Aimingではエンジニアを募集しています!
ゲームのWebAPI → 「普通のWebアプリケーション」ではない
Railsの設計に興味がある
社内ツール→ 「普通のWebアプリケーション」なRailsの設計に興
味がある

Contenu connexe

Tendances

メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばKouji Matsui
 
ドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩みドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩みhaljik Seiji
 
Ciじゃない方のJenkins
Ciじゃない方のJenkinsCiじゃない方のJenkins
Ciじゃない方のJenkinsKatsuhiro Miura
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指してAkira Inoue
 
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたTakuya Kawabe
 
フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。Yutaka Horikawa
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHong Chen
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
DroidKaigi - Welcome talk
DroidKaigi - Welcome talkDroidKaigi - Welcome talk
DroidKaigi - Welcome talkMasahiro Hidaka
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
Cocoa関西勉強会#49
Cocoa関西勉強会#49Cocoa関西勉強会#49
Cocoa関西勉強会#49yashigani
 
[社内勉強会]Gradleを使おう
[社内勉強会]Gradleを使おう[社内勉強会]Gradleを使おう
[社内勉強会]Gradleを使おうhirooooo
 
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップJavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ慎一 古賀
 
20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発Mao Ohnishi
 
Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張Tatsuya Ishikawa
 
ASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップ慎一 古賀
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Ouka Yuka
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017Takaaki Suzuki
 

Tendances (20)

メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
 
ドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩みドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩み
 
Ciじゃない方のJenkins
Ciじゃない方のJenkinsCiじゃない方のJenkins
Ciじゃない方のJenkins
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
 
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
 
フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App Inventor
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
DroidKaigi - Welcome talk
DroidKaigi - Welcome talkDroidKaigi - Welcome talk
DroidKaigi - Welcome talk
 
DevOpsって何?
DevOpsって何?DevOpsって何?
DevOpsって何?
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Cocoa関西勉強会#49
Cocoa関西勉強会#49Cocoa関西勉強会#49
Cocoa関西勉強会#49
 
[社内勉強会]Gradleを使おう
[社内勉強会]Gradleを使おう[社内勉強会]Gradleを使おう
[社内勉強会]Gradleを使おう
 
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップJavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
 
Aiming study#6pdf
Aiming study#6pdfAiming study#6pdf
Aiming study#6pdf
 
20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発20151110 ドメイン駆動設計によるサービス開発
20151110 ドメイン駆動設計によるサービス開発
 
Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張
 
ASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップASP.NET SPA開発をはじめよう~今と未来とステップアップ
ASP.NET SPA開発をはじめよう~今と未来とステップアップ
 
Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!Rubyの仕事で食べていくために僕らは!
Rubyの仕事で食べていくために僕らは!
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
 

Similaire à サービスクラス、その前に

Ecsとlambdaのバッチ処理
Ecsとlambdaのバッチ処理Ecsとlambdaのバッチ処理
Ecsとlambdaのバッチ処理政雄 金森
 
ヘッドレスCMS調査 Strapiを試してみた
ヘッドレスCMS調査 Strapiを試してみたヘッドレスCMS調査 Strapiを試してみた
ヘッドレスCMS調査 Strapiを試してみたSosukeYamada
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scalatakezoe
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かうAkira Suenami
 
InDesign正規表現勉強会_名古屋_0727
InDesign正規表現勉強会_名古屋_0727InDesign正規表現勉強会_名古屋_0727
InDesign正規表現勉強会_名古屋_0727ShinyaNakagawa
 
エンジニアのお仕事.pdf
エンジニアのお仕事.pdfエンジニアのお仕事.pdf
エンジニアのお仕事.pdfshumashimo1
 
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料Takashi Aoe
 
アプリエンジニアからクラウド専用のインフラエンジニアになってみて
アプリエンジニアからクラウド専用のインフラエンジニアになってみてアプリエンジニアからクラウド専用のインフラエンジニアになってみて
アプリエンジニアからクラウド専用のインフラエンジニアになってみてSato Shun
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
駅すぱあとWebサービスにおけるAWSとその周辺
駅すぱあとWebサービスにおけるAWSとその周辺駅すぱあとWebサービスにおけるAWSとその周辺
駅すぱあとWebサービスにおけるAWSとその周辺Mikawa Kouta
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsTakashi Hatamoto
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺Yusuke Wada
 
開発初心者がAWSサービスを色々使ってアプリ開発をした話
開発初心者がAWSサービスを色々使ってアプリ開発をした話開発初心者がAWSサービスを色々使ってアプリ開発をした話
開発初心者がAWSサービスを色々使ってアプリ開発をした話MaiFujisawa
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Drecom Co., Ltd.
 
May the FaaS be with us!!
May the FaaS be with us!!May the FaaS be with us!!
May the FaaS be with us!!真吾 吉田
 
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会 Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会 Hidekazu Ikeda
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionSatomi Tsujita
 

Similaire à サービスクラス、その前に (20)

Ecsとlambdaのバッチ処理
Ecsとlambdaのバッチ処理Ecsとlambdaのバッチ処理
Ecsとlambdaのバッチ処理
 
ヘッドレスCMS調査 Strapiを試してみた
ヘッドレスCMS調査 Strapiを試してみたヘッドレスCMS調査 Strapiを試してみた
ヘッドレスCMS調査 Strapiを試してみた
 
Non-Functional Programming in Scala
Non-Functional Programming in ScalaNon-Functional Programming in Scala
Non-Functional Programming in Scala
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう
 
InDesign正規表現勉強会_名古屋_0727
InDesign正規表現勉強会_名古屋_0727InDesign正規表現勉強会_名古屋_0727
InDesign正規表現勉強会_名古屋_0727
 
エンジニアのお仕事.pdf
エンジニアのお仕事.pdfエンジニアのお仕事.pdf
エンジニアのお仕事.pdf
 
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料
 
アプリエンジニアからクラウド専用のインフラエンジニアになってみて
アプリエンジニアからクラウド専用のインフラエンジニアになってみてアプリエンジニアからクラウド専用のインフラエンジニアになってみて
アプリエンジニアからクラウド専用のインフラエンジニアになってみて
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
駅すぱあとWebサービスにおけるAWSとその周辺
駅すぱあとWebサービスにおけるAWSとその周辺駅すぱあとWebサービスにおけるAWSとその周辺
駅すぱあとWebサービスにおけるAWSとその周辺
 
Adminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発TipsAdminとうまく共存するためのApex開発Tips
Adminとうまく共存するためのApex開発Tips
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
 
開発初心者がAWSサービスを色々使ってアプリ開発をした話
開発初心者がAWSサービスを色々使ってアプリ開発をした話開発初心者がAWSサービスを色々使ってアプリ開発をした話
開発初心者がAWSサービスを色々使ってアプリ開発をした話
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
May the FaaS be with us!!
May the FaaS be with us!!May the FaaS be with us!!
May the FaaS be with us!!
 
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会 Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会
Drupal Market in Japan @ 「DrupalCon 2016 New Orleans」情報交換会
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
 
クラウド時代の人材育成
クラウド時代の人材育成クラウド時代の人材育成
クラウド時代の人材育成
 

Plus de Yasutomo Uemori

Active job meets kubernetes
Active job meets kubernetesActive job meets kubernetes
Active job meets kubernetesYasutomo Uemori
 
Ruby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDDRuby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDDYasutomo Uemori
 
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境Yasutomo Uemori
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略Yasutomo Uemori
 
ゲーム会社でのRuby : rails活用事例
ゲーム会社でのRuby : rails活用事例ゲーム会社でのRuby : rails活用事例
ゲーム会社でのRuby : rails活用事例Yasutomo Uemori
 

Plus de Yasutomo Uemori (6)

Active job meets kubernetes
Active job meets kubernetesActive job meets kubernetes
Active job meets kubernetes
 
Ruby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDDRuby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDD
 
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
 
Rails api way in aiming
Rails api way in aimingRails api way in aiming
Rails api way in aiming
 
ゲーム会社でのRuby : rails活用事例
ゲーム会社でのRuby : rails活用事例ゲーム会社でのRuby : rails活用事例
ゲーム会社でのRuby : rails活用事例
 

サービスクラス、その前に