SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
マジックビーンズ 
Twitter: @a_suenami 
Github: a-suenami 
id: a_suenami
自己紹介 
• 末並晃(すえなみあきら) 
• @a_suenami 
• 髪切りました / 痩せました 
• RubyとかPHPとかJavaScriptとか 
• いわゆる”Web系”エンジニア 
• どちらかというと自然キー/複合キー容認派 
• どちらかというとNULL撲滅したい派
マジックビーンズとは 
MVC アーキテクチャにおいて、 
M ( モデル ) の設計や実装を単純化するために、 
すべてのモデルをアクティブレコードの 
継承クラスにするというアンチパターン
アクティブレコードとは 
データベーステーブルあるいはビューの1行が1つのクラスにラップさ 
れ、オブジェクトのインスタンスがそのデータベースの1つの行に結合 
される。このクラスはデータベースアクセスのカプセル化も行う。オブ 
ジェクトの生成後は、保存メソッドで新しい行がデータベースに追加 
される。 オブジェクトが更新されると、データベースの対応する行も 
また更新される。 
出典: http://ja.wikipedia.org/wiki/Active_Record
アクティブレコードとは 
# 1 件取得 
bug = Bug.find(1234) # SELECT * FROM bugs 
! 
# 新規作成 
bug = new Bug.new 
bug.summary = ‘保存時にクラッシュが発生’ 
bug.save # INSERT INTO bugs (summary) VALUES (‘保存時にクラッシュが発生’) 
! 
# 更新 
bug = Bug.find(1234) # SELECT * FROM bugs 
bug.summary = ‘保存時にクラッシュが発生’ 
bug.save # UPDATE bugs SET summary = ‘保存時にクラッシュが発生’ WHERE id = 1234 
! 
# 削除 
bug = Bug.find(1234) # SELECT * FROM bugs 
bug.delete # DELETE FROM bugs WHERE id = 1234
弊害1: モデルがデータベーススキーマに依存する 
• アクティブレコードを用いると、n 個のテーブルがある場合、n 個の 
モデルクラスが必要になる。 
• データベースをリファクタリングする際にモデルクラスだけでなく、 
それを使う側のコードまで変更する必要がある。
弊害2: CRUD 機能を公開してしまう 
• アクティブレコードを用いると find, create, update, delete などの 
メソッドを公開メソッドとして直接呼び出せてしまう。 
• ビジネスロジックとして実装されたメソッドを利用せず、公開 
CRUD メソッドを利用できてしまう結果、要件を満たさないコード 
が書かれる可能性がある。 
• 書籍中ではバグ担当者をアサインしたらメール通知するはずだが、 
メール通知が迂回されてしまうという例で紹介されている。 
• 仮に要件を満たせたとしても、公開 CRUD メソッドの利用はビジネ 
スロジックがアプリケーション層まで流出する結果になる。また、 
複数箇所に同じロジックが重複する可能性がある。
弊害3: ドメインモデル貧血症をもたらす 
• モデルがデータアクセスオブジェクトとしてしか利用されず、ビジ 
ネスロジックの多くがアプリケーション層にあるコントローラーオ 
ブジェクトやサービスオブジェクトに記述されている状態を「ドメ 
インモデル貧血症」という。 
• 参考: http://capsctrl.que.jp/kdmsnr/wiki/bliki/? 
AnemicDomainModel 
• CRUD メソッドを公開してしまった結果として起こりやすい。 
• ビジネスロジックを持たないモデルと巨大で手続き的なサービスオ 
ブジェクトで構成されることになり保守性が低下する。オブジェク 
ト指向のカプセル化の考え方に完全に違反している。
弊害4: ユニットテストが困難 
• モデル、ビュー、コントローラ、すべてのレイヤーにおいてユニット 
テストが困難になる。 
• モデル: データベースと密結合になるため、本番と同等のデータベー 
ススキーマを準備して実際に接続する必要がある。 
• ビュー: モデルが単なるデータコンテナとして使われると表示処理に 
も複雑なロジックが生じるため、実際のレスポンスとして返される 
HTML を生成し、それに対してテストする必要がある。 
• コントローラ: ビジネスロジックがアプリケーション層に漏れだして 
いるため、ビジネスロジックのテストのために HTTP リクエストとレ 
スポンスをエミュレートする必要があり煩雑になる。
“Railsの”アクティブレコードのさらなる弊害 
Rails のアクティブレコードの場合、データベースに加えてフォームと 
も密結合になる。 
<%= form_for(@bug) do |f| %> 
<div class="field"> 
<%= f.label :summary %><br> 
<%= f.text_field :summary %> 
</div> 
<div class="field"> 
<%= f.label :description %><br> 
<%= f.text_area :description %> 
</div> 
<div class="actions"> 
<%= f.submit %> 
</div> 
<% end %>
“Railsの”アクティブレコードのさらなる弊害 
• テーブルとフォームが綺麗に対応しない場合にはモデルにフォーム 
由来の実装が現れる。 
• (例) メールアドレスの確認入力 
• (例) 「利用規約に同意する」チェックボックス 
• バリデーションルールやエラーメッセージの管理もモデルの責務とし 
て実装される。 
• Rails でアンチパターンに陥ると、モデルにはバリデーションルール 
のみがあり、ビジネスロジックはコントローラに流出してしまう。
アンチパターンの見つけ方 
• 「モデルにカスタム SQL クエリを渡すにはどうすればいい?」 
• モデルにカスタム SQL を渡す必要はない。クエリをカプセル化し、アプリ 
ケーション層から隠ぺいする。 
• 「複雑なモデル操作をすべてのコントローラにコピーすればいいのだろうか、 
それとも、親の抽象コント ローラクラスに 1 回だけコーディングすればいいの 
だろうか」 
• どちらの方法でも安定性や保守性は得られない。複雑な手続きがあるのであ 
ればモデルのメソッドとして公開する必要がある。 
• 「モデルのユニットテストを行うために、データベースフィクスチャをもっと書 
かなければならない」 
• モデルのテストではなくデータアクセスのテストをしている可能性がある。
アンチパターンを用いてもよい場合 
• アクティブレコードそのものは優れたデータアクセスパターンであ 
り、それ自体はアンチパターンではない。 
• テーブルの各行に対してシンプルな CRUD 操作ができるだけで十分 
なアプリケーションも多く、その場合には DAO とモデルを同一の 
ものにすることで設計を単純化できる。 
• プロトタイプ作成においては作業省力化の役に立つ。
http://a-suenami.hatenablog.com/entry/2014/11/12/221805 
“何が必要か/本当に必要かがわかるまでは開発しないか最低限の開発で検証を 
重ねるのがいいと思いますし、その結果コアドメインが姿を表したらユビキタ 
ス言語を構築してモデリングをするべきでしょう。逆にノンコアドメインにつ 
いてはフレームワークや既存のパターンを使って低コストに済ませてしまうの 
がよいと思います。”
解決策 
• モデルがアクティブレコードを「持つ」ようにする 
• モデルを理解する 
• ドメインモデルの使用 
• プレーンなオブジェクトのテスト 
• 現実的に考える
レイヤー化アーキテクチャ 
• 「エリックエヴァンスのドメイン駆動設計」で紹介されているアー 
キテクチャパターン。 
• ある層の要素は同じ層の別の要素か、より下の層の要素にしか依存 
しないことを原則とする。 
ユーザ・インターフェース層ユーザへの情報の表示、ユーザからの入力の解釈を責務 
として負う。 
アプリケーション層 
ソフトウェアがやるべき仕事を定義し、問題を解決でき 
るようにドメインオブジェクト間の調整をする。ドメイ 
ンに対する知識を持たず、薄く保たれる層。 
ドメイン層ビジネス上の概念やビジネスルールを表す責務を負う。 
インフラストラクチャ層上位のレイヤを支える技術的機能を提供することを責務 
とする。
オブジェクトの責務の割当てパターン ( GRASP ) 
• 情報エキスパート ( Information Expert ) 
• 生成者 ( Creator ) 
• 疎結合性(Low Coupling) 
• 高凝集性(High Cohesion)
ドメインモデル 
• ドメインモデルについては「エリック・ 
エヴァンスのドメイン駆動設計」で詳し 
く述べられている。 
• ドメインモデルとは対象ドメインに関心 
事をアプリケーションで表現したもので 
あり、MVC アーキテクチャにおける本来 
の「モデル」もそうであるべきである。 
• エリック・エヴァンスの書籍では永続化 
層とドメイン層の仲介役としてリポジト 
リパターンが紹介されている。
プレーンオブジェクト 
• データベースの構造に依存しないプレーンなオブジェクトはテストしや 
すく、またテストの実行速度も速い。 
• 特に実装言語が Java の場合、それが特定のフレームワークやアーキテ 
クチャに依存してないことを強調するために POJO ( Plain Old Java 
Object ) と呼ばれる。 
• 他の言語でも同様に POXO ( X は言語の頭文字 ) と呼ぶケースはあ 
る。 
• ドメインモデルを正しく設計してビジネスロジックをそこに隠蔽すると、 
コントローラやビューのテストではそれらのモデルをモックやスタブに 
差し替えることができ、数多くの分岐をテストしなくてよくなる。
Before & After 
出典: 『SQLアンチパターン』P269, P276
ちなみに… 
若干古い書籍ですが、「エンタープライズ 
Rails」という書籍に models/physical と 
models/logical を作成して、同様のことを 
実現する方法が紹介されているのでご興味 
ある人はぜひ。 
※まわし者ではありません。 
※時間なくて詳細を資料に盛り込めません 
でした、すいません。
最後にちょっと小話。 
Rails を使ってる場合の現実的な 
落とし所について。
公開メソッドについて 
• モジュールの include で見た目の複雑性を下げる。 
• コードレビューによるチェックで基底クラスの公開メソッドを使わ 
ないようにする。
フォーム / サービスオブジェクトの利用 
http://a-suenami.hatenablog.com/entry/2013/12/06/092146
まとめ 
データベースとモデルは区別しましょう。 
! 
DOA の人とモデルの人は殴りあってないで 
もっと仲良くしましょう。(マジで)

Weitere ähnliche Inhalte

Was ist angesagt?

文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
 

Was ist angesagt? (20)

Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
Azure AD による Web API の 保護
Azure AD による Web API の 保護 Azure AD による Web API の 保護
Azure AD による Web API の 保護
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
Web エンジニアが postgre sql を選ぶ 3 つの理由
Web エンジニアが postgre sql を選ぶ 3 つの理由Web エンジニアが postgre sql を選ぶ 3 つの理由
Web エンジニアが postgre sql を選ぶ 3 つの理由
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 

Ähnlich wie マジックビーンズ

DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
Tomoharu ASAMI
 
【アジャイル道場】Rails勉強会(view編)
【アジャイル道場】Rails勉強会(view編)【アジャイル道場】Rails勉強会(view編)
【アジャイル道場】Rails勉強会(view編)
Sosuke Kimura
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
Koichiro Ohba
 
Rubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーションRubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーション
Naoto Hori
 

Ähnlich wie マジックビーンズ (20)

DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発DSL駆動によるクラウド・アプリケーション開発
DSL駆動によるクラウド・アプリケーション開発
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
 
Laravelの検索機能の実装方法
Laravelの検索機能の実装方法Laravelの検索機能の実装方法
Laravelの検索機能の実装方法
 
Mvc conf session_1_osada
Mvc conf session_1_osadaMvc conf session_1_osada
Mvc conf session_1_osada
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
型チェックのアノテーションによる保守・運用の改善
型チェックのアノテーションによる保守・運用の改善型チェックのアノテーションによる保守・運用の改善
型チェックのアノテーションによる保守・運用の改善
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かう
 
【アジャイル道場】Rails勉強会(view編)
【アジャイル道場】Rails勉強会(view編)【アジャイル道場】Rails勉強会(view編)
【アジャイル道場】Rails勉強会(view編)
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
Rubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーションRubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーション
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 
オープンソースを利用したモデル駆動トライアル
オープンソースを利用したモデル駆動トライアルオープンソースを利用したモデル駆動トライアル
オープンソースを利用したモデル駆動トライアル
 
MVCのつぎは・・・
MVCのつぎは・・・MVCのつぎは・・・
MVCのつぎは・・・
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
Tech fun rails_workshop
Tech fun rails_workshopTech fun rails_workshop
Tech fun rails_workshop
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 

Mehr von Akira Suenami

Wip prをやってみた
Wip prをやってみたWip prをやってみた
Wip prをやってみた
Akira Suenami
 

Mehr von Akira Suenami (13)

糖質とプログラミングと私
糖質とプログラミングと私糖質とプログラミングと私
糖質とプログラミングと私
 
糖質制限超入門
糖質制限超入門糖質制限超入門
糖質制限超入門
 
今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014今年かかった麻疹まとめ2014
今年かかった麻疹まとめ2014
 
Symfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LTSymfony温泉2014 自己紹介LT
Symfony温泉2014 自己紹介LT
 
シュードキーニートフリーク
シュードキーニートフリークシュードキーニートフリーク
シュードキーニートフリーク
 
Tdd is really dead ?
Tdd is really dead ?Tdd is really dead ?
Tdd is really dead ?
 
Wip prをやってみた
Wip prをやってみたWip prをやってみた
Wip prをやってみた
 
俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう俺がモデルだ!問題に立ち向かう
俺がモデルだ!問題に立ち向かう
 
今年かかった麻疹まとめ
今年かかった麻疹まとめ今年かかった麻疹まとめ
今年かかった麻疹まとめ
 
デザイナのためのGit講座
デザイナのためのGit講座デザイナのためのGit講座
デザイナのためのGit講座
 
アジャイル開発振り返り
アジャイル開発振り返りアジャイル開発振り返り
アジャイル開発振り返り
 
Xp祭りに行ってきた
Xp祭りに行ってきたXp祭りに行ってきた
Xp祭りに行ってきた
 
テストとの上手な付き合い方
テストとの上手な付き合い方テストとの上手な付き合い方
テストとの上手な付き合い方
 

マジックビーンズ