SlideShare a Scribd company logo
serviceクラスをやめよう
サブクラスを使おう
よしだあつし@銀座Rails#15
2
名前: よしだあつし

SNS: @yalab

職業: 株式会社ジラフ CTO

Ruby歴: since 1.6

Rails歴: since 0.8

趣味: 料理

自己紹介
3
ジラフ社が運営しているサービス
ヒカカク peing-質問箱 トレカ専用フリマアプリ magi
4
service クラスとは何か?
5
わかりません
6
service クラス
● PoEAA
● DDD
● トランザクションスクリプト
● Decorator
● Command
● static メソッド
7
曖昧な定義
8
要は使いどころだよね
9
要は使いどころだよね
ダメ絶対
10
MVC
11
MVC
M: ビジネスロジック
V: 見た目
C: ユーザーからの入力をモデルに伝える
12
責務から考える
13
MVCの責務
M: データの一貫性
V: 出力されたデータの整形
C: データの入出力
14
service クラスの責務?
15
service クラスの責務?
● トランザクションスクリプトは Model の役目とかぶる
● デコレーターパターンは view とかぶる
16
そもそもなぜ我々は service クラスを使うよ
うになったのか?
17
声の大きい人 fat model をなんとかするため
18
model を分割して責任範囲を限定したい
19
service クラスにするのって
おかしくない?
20
ということで吉田からの提案
21
fat model を サブクラスに分割する
22
例) User
● 管理者は全てのデータを書き換えられる
● ユーザー自身の生年月日は create 時だけ
● プレミアムユーザーと一般ユーザーがいる
23
controller が分かれてる事は多い
class Admin::Users < ApplicationController
end
class Users < ApplicationController
end
class Me::Users < ApplicationController
end
24
model を責任範囲ごとに作る
class User < ApplicationController
validates :birthday, presence: true
end
class User::General < User
attr_readonly :birthday
end
25
まとめ(今回言いたかったこと)
● Service クラス止めろ
● 責務からコードの振る舞いを定義しましょう
● fat model 対策の一例としてサブクラスに分割す
るとわりと上手くワークする
● 声が大きい人が言うからといって鵜呑みにしない
26
ご清聴ありがとうございました。

More Related Content

ODP
MVC の Model を考える
PDF
PHPで大規模ブラウザゲームを開発してわかったこと
PPTX
Redisの特徴と活用方法について
PDF
MongoDB〜その性質と利用場面〜
PPTX
初心者向けMongoDBのキホン!
PDF
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
PDF
GUI アプリケーションにおける MVC
PDF
C#でわかる こわくないMonad
MVC の Model を考える
PHPで大規模ブラウザゲームを開発してわかったこと
Redisの特徴と活用方法について
MongoDB〜その性質と利用場面〜
初心者向けMongoDBのキホン!
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
GUI アプリケーションにおける MVC
C#でわかる こわくないMonad

What's hot (20)

PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
マルチテナントのアプリケーション実装〜実践編〜
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
イミュータブルデータモデルの極意
PDF
Test Yourself - テストを書くと何がどう変わるか
PPTX
MongoDBが遅いときの切り分け方法
PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PDF
SQL大量発行処理をいかにして高速化するか
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
O/Rマッパーによるトラブルを未然に防ぐ
KEY
やはりお前らのMVCは間違っている
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PDF
async/awaitダークサイド is 何
PDF
例外設計における大罪
PDF
Ormとの付き合い方
PDF
何となく勉強した気分になれるパーサ入門
PDF
継承やめろマジやめろ。 なぜイケないのか 解説する
PDF
プログラムの処方箋~健康なコードと病んだコード
ドメイン駆動設計のための Spring の上手な使い方
マルチテナントのアプリケーション実装〜実践編〜
ドメイン駆動設計に15年取り組んでわかったこと
イミュータブルデータモデルの極意
Test Yourself - テストを書くと何がどう変わるか
MongoDBが遅いときの切り分け方法
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
SQL大量発行処理をいかにして高速化するか
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
Javaはどのように動くのか~スライドでわかるJVMの仕組み
O/Rマッパーによるトラブルを未然に防ぐ
やはりお前らのMVCは間違っている
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
async/awaitダークサイド is 何
例外設計における大罪
Ormとの付き合い方
何となく勉強した気分になれるパーサ入門
継承やめろマジやめろ。 なぜイケないのか 解説する
プログラムの処方箋~健康なコードと病んだコード
Ad

More from よしだ あつし (20)

PDF
ruby で書く 脆弱なコード
PDF
CTOのおしごと
PDF
Selfを考える
PDF
Railsにコントリビュートしてきました
PDF
Rubyコードの最適化
PPTX
低レイヤから見たrubyプログラミング
PDF
まじょのおしごとの裏側
PDF
僕が勉強をする モチベーションと勉強法
PDF
Dockerプレゼン
PDF
Vue.js ハンズオン資料
PDF
よい名前を付けましょう リーダブルなんたらとか
PDF
Gitの使い方あれこれ
PDF
私はいかにしてpull request を行ったか - あるいは social development について
PDF
15分でできるSQLインジェクション
PDF
Next GAE Heroku を使って 3分でRailsアプリをリリース
PDF
テスト駆動開発入門
PDF
Railsの今昔
PDF
デバッガでデバッグしない
ODP
Rails3使用雑感
ODP
Twitterでネットストーカーをしよう
ruby で書く 脆弱なコード
CTOのおしごと
Selfを考える
Railsにコントリビュートしてきました
Rubyコードの最適化
低レイヤから見たrubyプログラミング
まじょのおしごとの裏側
僕が勉強をする モチベーションと勉強法
Dockerプレゼン
Vue.js ハンズオン資料
よい名前を付けましょう リーダブルなんたらとか
Gitの使い方あれこれ
私はいかにしてpull request を行ったか - あるいは social development について
15分でできるSQLインジェクション
Next GAE Heroku を使って 3分でRailsアプリをリリース
テスト駆動開発入門
Railsの今昔
デバッガでデバッグしない
Rails3使用雑感
Twitterでネットストーカーをしよう
Ad

serviceクラスをやめようサブクラスを使おう