SlideShare a Scribd company logo
Skinny Controllers,
Skinny Models
M3 Tech Talk #m3dev
Kazuhiro Sera @seratch
RubyKaigi 2013
•  LT しました(rspec-kickstarter)
•  席に戻ったら Gemfile に追加!
•  今日は Refactoring Fat Models with
Patterns という講演の内容とその実践に
ついて紹介します
•  興味を持った方は、動画が公開されている
ので後で観てみてください
https://vimeo.com/68611168
Skinny Controllers, Skinny Models
@brynary
•  Bryan Helmkamp
•  Code Climate 創業者
•  顧客の Ruby コードを解析して品質・セ
キュリティ改善を支援するサービス
•  OSS なら無料、以下は Gistub の例
•  https://codeclimate.com/github/
seratch/gistub/
Code Climate: Rating
Code Climate: Code Smell
Code Climate: Classes
ブログエントリ
•  7 Patterns to Refactor Fat ActiveRecord
Models
•  http://blog.codeclimate.com/blog/
2012/10/17/7-ways-to-decompose-fat-
activerecord-models/
•  さらに改善されたコード例を GitHub で公開
している(RubyKaigi での発表で使用)
•  https://github.com/codeclimate/
refactoring-fat-models
Rails ActiveRecord
•  Pro: シンプルさ
•  Con: DB のテーブルと 1:1 を強いられる
Rails アプリでの失敗例
•  適切にデザインされたオブジェクト指向の
コードはラビオリに例えられる
•  時折、カルゾーネみたいに一カ所に詰め込
んだ Rails コードを見かける・・
Skinny Models
•  Fat Models とよく言われるが Model も
Skinny であるべきなんでは?
Fat Models との戦い
•  Controller が肥大化するよりはマシ?
•  既存の AR(ActiveRecord) model に責
務を持たせていくとどんどん肥大化
•  最悪のケースは神オブジェクトが誕生
•  @brynary は、定番の実装パターンをうま
く Rails の model のリファクタリングに
適用する方法を提案している
アンチパターン
•  ただし、安易に mixin として module に
切り出すのはアンチパターン
•  mixin は形を変えた継承
•  がらくたを突っ込む引き出し(コードを
module に移して include するだけ)
•  たくさん mixin された class だとどんな
オブジェクトか把握するのが大変になる
7 つの実装パターン
•  Value Objects
•  Service Objects
•  Form Objects
•  Query Objects
•  View Objects
•  Policy Objects
•  Decorators
Value Objects
•  おなじみ Value Object
•  immutable な値を保持するクラス
•  保持する値によって比較可能
•  何らかのロジックを持つ attribute(また
はその小さな集合)が適している
•  具体例:PhoneNumber、Money、
Ratingなど
Service Objects
•  複数の model を利用する場合
•  外部のサービス、API と連携する場合
•  複雑なロジックを実装する場合
•  既存の model の主たる責務でない場合
•  Strategy パターンを適用したい場合
•  普通 ActiveModel ではない
Form Objects
•  一つのフォームで複数の AR model を更
新したい場合に有効
•  ActiveModel にする
•  Form の save の内部で複数の AR model
の save を呼び出す
•  標準の accepts_nested_attributes_for
は @brynary 的には非推奨
•  複雑になったら永続化処理を Service に
Query Objects
•  バッチ用 or 複雑な条件の SQL を AR の
scope やクラスメソッドにせず Query
Object として分離
•  初期化時に AR::Relation オブジェクトを
渡すようにすると合成可能になる
•  TrialQuery.new(Account.where(…)).fin
d_each do ¦e¦ … end
View Objects
•  View のためのロジックを AR model に
書かない(エラーメッセージ生成など)
•  AR model を保持するクラスを定義し
render にはこちらを渡すようにする
•  helper に AR model を渡す実装よりも、
リファクタリングが促進される
•  多様な UI に対応する場合にも有効
Policy Objects
•  AR model を参照はするが主たるドメイ
ンではないロジック(分析のための判定
など)を分離する
•  例:メール配信対象?アクティブユーザ?
•  AR model を保持するクラスとして定義
•  他との違い:Policy は read な処理だけ
Service は write も含む、Query は SQL
実行と result set を yield に渡すだけ
Decorators
•  Decorator パターンを適用して callback
地獄を回避する
•  例:save メソッドを数珠つなぎにする
(AR の Order#save で orders テーブル
に insert -> DHW に通知 -> 受付完了
メールを送信)
実践してみた
•  実際にパターンを使って Gistub のリファ
クタリングをしてみた
パターンを実践する前
パターンを実践した後
やったこと
•  使ったパターンは Service Objects だけ
•  単に Controller から Service に切り出し
ただけだと、今度はその新しい Service
のスコアが悪かった(当たり前)
•  複雑度の高すぎるメソッドを名前を付け
られる単位に分割
•  コードの重複を共通化
改善の過程
今日から出来ること
•  盲目的に AR のクラスメソッドにしない
•  AR でないモデルもどんどんつくる
•  Controller に AR model 呼び出しをズラ
ズラ書くより Service にする
•  複雑なフォームは Form を導入する
•  AR に表示用ロジックを持たず View
Object でラップして表示処理に渡す
まとめ
•  既に実践されているものも多いが、パター
ンに名前がついて言語化されることは大事
•  最初はシンプルでよい(パターンのやりす
ぎは over engineering)
•  アプリが育っていく中で規模に応じたリ
ファクタリングは必要になっていく
•  ただし、十分なコードカバレッジは必須
アプリ規模とアーキテクチャ
Q&A
M3 Tech Talk #m3dev
Kazuhiro Sera @seratch
Any Question?

More Related Content

What's hot (20)

2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova
miso- soup3
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
miso- soup3
 
Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座
都元ダイスケ Miyamoto
 
The Internal of Serverless Plugins
The Internal of Serverless PluginsThe Internal of Serverless Plugins
The Internal of Serverless Plugins
Terui Masashi
 
退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話
Tadashi Nemoto
 
実践サーバレスアーキテクチャ
実践サーバレスアーキテクチャ実践サーバレスアーキテクチャ
実践サーバレスアーキテクチャ
太郎 test
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへ
takezoe
 
App Service の DevOps と Visual Studio Team Services 最新アップデート
App Service の DevOps と Visual Studio Team Services 最新アップデートApp Service の DevOps と Visual Studio Team Services 最新アップデート
App Service の DevOps と Visual Studio Team Services 最新アップデート
Microsoft Azure Japan
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
 
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Serviceメルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
Tadashi Nemoto
 
今なぜサーバーレスなのか
今なぜサーバーレスなのか今なぜサーバーレスなのか
今なぜサーバーレスなのか
真吾 吉田
 
10分でわかるOpenAPI V3
10分でわかるOpenAPI V310分でわかるOpenAPI V3
10分でわかるOpenAPI V3
Kazuchika Sekiya
 
One ASP.NET, OWIN & Katana
One ASP.NET, OWIN & KatanaOne ASP.NET, OWIN & Katana
One ASP.NET, OWIN & Katana
miso- soup3
 
Android ReactNative UITesting
Android ReactNative UITestingAndroid ReactNative UITesting
Android ReactNative UITesting
Vishal Banthia
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?
miso- soup3
 
Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発
Takuro Sasaki
 
Visual Studio 2019 Updates Pickup!
Visual Studio 2019 Updates Pickup!Visual Studio 2019 Updates Pickup!
Visual Studio 2019 Updates Pickup!
Hiroyuki Mori
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Toshiaki Maki
 
日本で DevOps を ロケットスタートする方法
日本で DevOps を  ロケットスタートする方法日本で DevOps を  ロケットスタートする方法
日本で DevOps を ロケットスタートする方法
Puppet
 
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworkerおれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
Toshiaki Maki
 
2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova2016/05/01 Visual Studio with Cordova
2016/05/01 Visual Studio with Cordova
miso- soup3
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
miso- soup3
 
Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座
都元ダイスケ Miyamoto
 
The Internal of Serverless Plugins
The Internal of Serverless PluginsThe Internal of Serverless Plugins
The Internal of Serverless Plugins
Terui Masashi
 
退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話退屈なブラウザ作業をpuppeteerにやらせたいお話
退屈なブラウザ作業をpuppeteerにやらせたいお話
Tadashi Nemoto
 
実践サーバレスアーキテクチャ
実践サーバレスアーキテクチャ実践サーバレスアーキテクチャ
実践サーバレスアーキテクチャ
太郎 test
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへ
takezoe
 
App Service の DevOps と Visual Studio Team Services 最新アップデート
App Service の DevOps と Visual Studio Team Services 最新アップデートApp Service の DevOps と Visual Studio Team Services 最新アップデート
App Service の DevOps と Visual Studio Team Services 最新アップデート
Microsoft Azure Japan
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
 
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Serviceメルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
メルカリの開発スピードと品質を支える Selenium on Azure Kubernetes Service
Tadashi Nemoto
 
今なぜサーバーレスなのか
今なぜサーバーレスなのか今なぜサーバーレスなのか
今なぜサーバーレスなのか
真吾 吉田
 
10分でわかるOpenAPI V3
10分でわかるOpenAPI V310分でわかるOpenAPI V3
10分でわかるOpenAPI V3
Kazuchika Sekiya
 
One ASP.NET, OWIN & Katana
One ASP.NET, OWIN & KatanaOne ASP.NET, OWIN & Katana
One ASP.NET, OWIN & Katana
miso- soup3
 
Android ReactNative UITesting
Android ReactNative UITestingAndroid ReactNative UITesting
Android ReactNative UITesting
Vishal Banthia
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?
miso- soup3
 
Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発
Takuro Sasaki
 
Visual Studio 2019 Updates Pickup!
Visual Studio 2019 Updates Pickup!Visual Studio 2019 Updates Pickup!
Visual Studio 2019 Updates Pickup!
Hiroyuki Mori
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Toshiaki Maki
 
日本で DevOps を ロケットスタートする方法
日本で DevOps を  ロケットスタートする方法日本で DevOps を  ロケットスタートする方法
日本で DevOps を ロケットスタートする方法
Puppet
 
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworkerおれおれブログシステムにServiceWorkerを導入してみた #serviceworker
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
Toshiaki Maki
 

Viewers also liked (20)

テストの運用について #m3dev
テストの運用について #m3devテストの運用について #m3dev
テストの運用について #m3dev
Kazuhiro Sera
 
Writeexcelについて
WriteexcelについてWriteexcelについて
Writeexcelについて
asa 999
 
Coursera experience
Coursera experienceCoursera experience
Coursera experience
Brian Hooper
 
Phone Home: A client-side error collection system
Phone Home: A client-side error collection systemPhone Home: A client-side error collection system
Phone Home: A client-side error collection system
Chris Birchall
 
Guess the Country - Playing with Twitter Streaming API
Guess the Country - Playing with Twitter Streaming APIGuess the Country - Playing with Twitter Streaming API
Guess the Country - Playing with Twitter Streaming API
Chris Birchall
 
3分 gem クッキング
3分 gem クッキング3分 gem クッキング
3分 gem クッキング
Kenji Mori
 
ScalaCache: simple caching in Scala
ScalaCache: simple caching in ScalaScalaCache: simple caching in Scala
ScalaCache: simple caching in Scala
Chris Birchall
 
問題が起こった時、変えるのは人かそれともプロセスか?
問題が起こった時、変えるのは人かそれともプロセスか?問題が起こった時、変えるのは人かそれともプロセスか?
問題が起こった時、変えるのは人かそれともプロセスか?
Takashi Takebayashi
 
Branching Strategies: Feature Branches vs Branch by Abstraction
Branching Strategies: Feature Branches vs Branch by AbstractionBranching Strategies: Feature Branches vs Branch by Abstraction
Branching Strategies: Feature Branches vs Branch by Abstraction
Chris Birchall
 
Load testing with gatling
Load testing with gatlingLoad testing with gatling
Load testing with gatling
Chris Birchall
 
Skinny Framework 1.0.0
Skinny Framework 1.0.0Skinny Framework 1.0.0
Skinny Framework 1.0.0
Kazuhiro Sera
 
マイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3devマイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3dev
Kazuhiro Sera
 
Rails 3 Beautiful Code
Rails 3 Beautiful CodeRails 3 Beautiful Code
Rails 3 Beautiful Code
GreggPollack
 
Comment répondre à la demande contraceptive?
Comment répondre à la demande contraceptive?Comment répondre à la demande contraceptive?
Comment répondre à la demande contraceptive?
Didier Cosserat
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Camille Roux
 
MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かう
Shun Hikita
 
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
雄哉 吉田
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
Narihiro Nakamura
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuri
Kazuhiro Sera
 
テストの運用について #m3dev
テストの運用について #m3devテストの運用について #m3dev
テストの運用について #m3dev
Kazuhiro Sera
 
Writeexcelについて
WriteexcelについてWriteexcelについて
Writeexcelについて
asa 999
 
Coursera experience
Coursera experienceCoursera experience
Coursera experience
Brian Hooper
 
Phone Home: A client-side error collection system
Phone Home: A client-side error collection systemPhone Home: A client-side error collection system
Phone Home: A client-side error collection system
Chris Birchall
 
Guess the Country - Playing with Twitter Streaming API
Guess the Country - Playing with Twitter Streaming APIGuess the Country - Playing with Twitter Streaming API
Guess the Country - Playing with Twitter Streaming API
Chris Birchall
 
3分 gem クッキング
3分 gem クッキング3分 gem クッキング
3分 gem クッキング
Kenji Mori
 
ScalaCache: simple caching in Scala
ScalaCache: simple caching in ScalaScalaCache: simple caching in Scala
ScalaCache: simple caching in Scala
Chris Birchall
 
問題が起こった時、変えるのは人かそれともプロセスか?
問題が起こった時、変えるのは人かそれともプロセスか?問題が起こった時、変えるのは人かそれともプロセスか?
問題が起こった時、変えるのは人かそれともプロセスか?
Takashi Takebayashi
 
Branching Strategies: Feature Branches vs Branch by Abstraction
Branching Strategies: Feature Branches vs Branch by AbstractionBranching Strategies: Feature Branches vs Branch by Abstraction
Branching Strategies: Feature Branches vs Branch by Abstraction
Chris Birchall
 
Load testing with gatling
Load testing with gatlingLoad testing with gatling
Load testing with gatling
Chris Birchall
 
Skinny Framework 1.0.0
Skinny Framework 1.0.0Skinny Framework 1.0.0
Skinny Framework 1.0.0
Kazuhiro Sera
 
マイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3devマイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3dev
Kazuhiro Sera
 
Rails 3 Beautiful Code
Rails 3 Beautiful CodeRails 3 Beautiful Code
Rails 3 Beautiful Code
GreggPollack
 
Comment répondre à la demande contraceptive?
Comment répondre à la demande contraceptive?Comment répondre à la demande contraceptive?
Comment répondre à la demande contraceptive?
Didier Cosserat
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Camille Roux
 
MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かう
Shun Hikita
 
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
一生、エンジニアであり続けるために必要なこと「負けてからのエンジニアライフ」
雄哉 吉田
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
Narihiro Nakamura
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuri
Kazuhiro Sera
 

Similar to Skinny Controllers, Skinny Models (20)

A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
Kenichi Tachibana
 
Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料
techscore
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
aktsk
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要
baban ba-n
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨
 
serviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おうserviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おう
よしだ あつし
 
Arcana study meeting by tenta
Arcana study meeting by tentaArcana study meeting by tenta
Arcana study meeting by tenta
天太 白鳥
 
リソースモデリングパターンの提案 #sendagayarb
リソースモデリングパターンの提案 #sendagayarbリソースモデリングパターンの提案 #sendagayarb
リソースモデリングパターンの提案 #sendagayarb
Toru Kawamura
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
Daisuke Tasaki
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
 
nomlab_okayamaruby_subslide
nomlab_okayamaruby_subslidenomlab_okayamaruby_subslide
nomlab_okayamaruby_subslide
nomlab
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
Narihiro Nakamura
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
Introduction of record_with_operator
Introduction of record_with_operatorIntroduction of record_with_operator
Introduction of record_with_operator
Koichiro Ohba
 
「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」
tech-arts
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!
Gaprot
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
AdvancedTechNight
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
Kenichi Tachibana
 
Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料
techscore
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
aktsk
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要
baban ba-n
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨
 
serviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おうserviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おう
よしだ あつし
 
Arcana study meeting by tenta
Arcana study meeting by tentaArcana study meeting by tenta
Arcana study meeting by tenta
天太 白鳥
 
リソースモデリングパターンの提案 #sendagayarb
リソースモデリングパターンの提案 #sendagayarbリソースモデリングパターンの提案 #sendagayarb
リソースモデリングパターンの提案 #sendagayarb
Toru Kawamura
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
Daisuke Tasaki
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
 
nomlab_okayamaruby_subslide
nomlab_okayamaruby_subslidenomlab_okayamaruby_subslide
nomlab_okayamaruby_subslide
nomlab
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
Narihiro Nakamura
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
Introduction of record_with_operator
Introduction of record_with_operatorIntroduction of record_with_operator
Introduction of record_with_operator
Koichiro Ohba
 
「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」「エクストリームエンジニアへの道(Swift編)」
「エクストリームエンジニアへの道(Swift編)」
tech-arts
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!
Gaprot
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
AdvancedTechNight
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 

More from Kazuhiro Sera (20)

All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...
Kazuhiro Sera
 
Skinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライドSkinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライド
Kazuhiro Sera
 
Skinny 2 Update
Skinny 2 UpdateSkinny 2 Update
Skinny 2 Update
Kazuhiro Sera
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Kazuhiro Sera
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Kazuhiro Sera
 
Future on Servlet #scala_ks
Future on Servlet #scala_ksFuture on Servlet #scala_ks
Future on Servlet #scala_ks
Kazuhiro Sera
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ks
Kazuhiro Sera
 
Scala on Rails #rakutentech
Scala on Rails #rakutentechScala on Rails #rakutentech
Scala on Rails #rakutentech
Kazuhiro Sera
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
Kazuhiro Sera
 
Beginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_cccBeginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_ccc
Kazuhiro Sera
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
Kazuhiro Sera
 
Skinny Framework Progress Situation
Skinny Framework Progress SituationSkinny Framework Progress Situation
Skinny Framework Progress Situation
Kazuhiro Sera
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scala
Kazuhiro Sera
 
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scalaめんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
Kazuhiro Sera
 
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
Kazuhiro Sera
 
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_techKabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kazuhiro Sera
 
テストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3devテストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3dev
Kazuhiro Sera
 
ScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for BeginnersScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for Beginners
Kazuhiro Sera
 
A Test Code Generator for RSpec Users
A Test Code Generator for RSpec UsersA Test Code Generator for RSpec Users
A Test Code Generator for RSpec Users
Kazuhiro Sera
 
Crucible @ M3, Inc.
Crucible @ M3, Inc.Crucible @ M3, Inc.
Crucible @ M3, Inc.
Kazuhiro Sera
 
All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...
Kazuhiro Sera
 
Skinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライドSkinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライド
Kazuhiro Sera
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Kazuhiro Sera
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Kazuhiro Sera
 
Future on Servlet #scala_ks
Future on Servlet #scala_ksFuture on Servlet #scala_ks
Future on Servlet #scala_ks
Kazuhiro Sera
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ks
Kazuhiro Sera
 
Scala on Rails #rakutentech
Scala on Rails #rakutentechScala on Rails #rakutentech
Scala on Rails #rakutentech
Kazuhiro Sera
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
Kazuhiro Sera
 
Beginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_cccBeginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_ccc
Kazuhiro Sera
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
Kazuhiro Sera
 
Skinny Framework Progress Situation
Skinny Framework Progress SituationSkinny Framework Progress Situation
Skinny Framework Progress Situation
Kazuhiro Sera
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scala
Kazuhiro Sera
 
めんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scalaめんどくさくない Scala #kwkni_scala
めんどくさくない Scala #kwkni_scala
Kazuhiro Sera
 
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
Kazuhiro Sera
 
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_techKabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech
Kazuhiro Sera
 
テストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3devテストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3dev
Kazuhiro Sera
 
ScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for BeginnersScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for Beginners
Kazuhiro Sera
 
A Test Code Generator for RSpec Users
A Test Code Generator for RSpec UsersA Test Code Generator for RSpec Users
A Test Code Generator for RSpec Users
Kazuhiro Sera
 

Recently uploaded (6)

第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
Matsushita Laboratory
 
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptxSecurity-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
TsukasaKomatsubara
 
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
iPride Co., Ltd.
 
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
Toru Tamaki
 
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
Matsushita Laboratory
 
20250525_IoTLT_vol123_kitazaki_v1___.pdf
20250525_IoTLT_vol123_kitazaki_v1___.pdf20250525_IoTLT_vol123_kitazaki_v1___.pdf
20250525_IoTLT_vol123_kitazaki_v1___.pdf
Ayachika Kitazaki
 
第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
第39回人工知能学会全国大会の企画セッション「生成AIが切り拓く仕掛学の可能性」の講演資料
Matsushita Laboratory
 
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptxSecurity-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
TsukasaKomatsubara
 
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモジュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
iPride Co., Ltd.
 
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
Toru Tamaki
 
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
ReonHata_LLMを利用した便利の副作用顕在化のためのアイデア発想支援手法の評価_JSAI2025
Matsushita Laboratory
 
20250525_IoTLT_vol123_kitazaki_v1___.pdf
20250525_IoTLT_vol123_kitazaki_v1___.pdf20250525_IoTLT_vol123_kitazaki_v1___.pdf
20250525_IoTLT_vol123_kitazaki_v1___.pdf
Ayachika Kitazaki
 

Skinny Controllers, Skinny Models