Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ビジネスロジック実装進化論 - An Evolution of Business Logic ...
Search
Tadayoshi Sato
August 23, 2024
Programming
50
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ビジネスロジック実装進化論 - An Evolution of Business Logic Implementation
DevLove 2010/10/27 発表資料。
Tadayoshi Sato
August 23, 2024
More Decks by Tadayoshi Sato
See All by Tadayoshi Sato
実践EIP入門 ― Apache CamelでEIPを使いこなす
tadayosi
0
220
Domain-Driven Design Retrospective
tadayosi
0
42
ブレイクスルーと文学 - The Breakthrough and Literature
tadayosi
0
42
JJBUG 2013 - SwitchYard
tadayosi
0
38
Red Hat の日本でできるグローバルな働き方
tadayosi
0
47
Red Hat Tech Night 2018 - Apache Camel
tadayosi
0
29
Red Hat Tech Night 2019.5 - Camel 3 and Beyond...
tadayosi
0
31
Other Decks in Programming
See All in Programming
symfony/aiとlaravel/boost
77web
0
110
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
220
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7.2k
The NotImplementedError Problem in Ruby
koic
1
1.1k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
2
810
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
570
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.6k
Contextとはなにか
chiroruxx
1
390
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
460
スマートグラスで並列バイブコーディング
hyshu
0
270
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Are puppies a ranking factor?
jonoalderson
1
3.7k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
400
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
170
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
360
Visualization
eitanlees
152
17k
Exploring anti-patterns in Rails
aemeredith
3
430
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Transcript
ϏδωεϩδοΫ ࣮ਐԽ 201010݄27 ࠤ౻ ڡ߶ http://ameblo.jp/ouobpo An Evolution of Business
Logic Implementation
• ࣄ - Software AGגࣜձࣾ άϩʔόϧίϯαϧλϯγʔ αʔϏε webMethodsίϯαϧλϯτ - ॻ੶ͷࣥචʗ༁ͳͲ
• Web - ϒϩά: http://ameblo.jp/ouobpo - Twitter: tadayosi • झຯ - KindleͰಡॻ - ຊϕδλϦΞϯڠձձһ ࠤ౻ ڡ߶ʢ͞ͱ͏ ͨͩΑ͠ʣ http://www.flickr.com/photos/robertnyman/189691155/
ʰϓϩάϥϛϯάScalaʱ໌͚ൃചʂ ຊޠ൛
Domain Modelύλʔϯ ͍͠ʁ
http://www.martinfowler.com/eaaCatalog/domainModel.html
Domain Modelύλʔϯ... •࣮ࡏ͢Δ •ਓతͳϚδοΫͰͳ͍ •ϏδωεϩδοΫ࣮ͷࢼߦࡨޡͷதͰࣗવ ʹḷΓண͘ಓͰ͋Δ
ϓϩάϥϚᴈ໌ظ http://www.flickr.com/photos/nickhubbard/2878833485/
#!/usr/bin/env perl use strict; use CGI::Carp qw(fatalsToBrowser); require ‘util.pl’ my
%FORM = util::read_form('POST', 'utf8'); # ϏδωεϩδοΫʁ ... print "Content-type: text/html\n\n"; print<<HTML_END; <html> <head> <title>จ֬ೝ</title> </head> <body> ... </body> </html> HTML_END
PerlʗCGI order.pl DB ϑΝΠϧ Ϗδωε ϩδοΫ HTML σʔλ ΞΫηε
public class OrderServlet extends HttpServlet { protected void service( HttpServletRequest
request, HttpServletResponse response) { processOrder(request, response); request .getRequestDispatcher( “/order/confirm.jsp”) .forward(request, response); } private void processOrder( HttpServletRequest request, HttpServletResponse response) { // ϏδωεϩδοΫʁ ... } ...
ServletʗJSP OrderServlet DB XML Ϗδωε ϩδοΫ σʔλ ΞΫηε /order/confirm.jsp HTML
ϨΠϠΞʔΩςΫνϟ ͷൃݟ http://www.flickr.com/photos/bloggingbookshelf/5084749109/
υϝΠϯ σʔλΞΫηε ϓϨθϯ Transaction Script DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ
αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ DAO DAO DAO
public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderDao fOrderDao; private
ICustomerDao fCustomerDao; public List<OrderBean> findOrders( CustomerBean customer) { ... } public void confirmOrder( OrderBean order, CustomerBean customer) { ... } public void cancelOrder( OrderBean order, CustomerBean customer) { ... } ...
Transaction Script • ϓϨθϯɺϏδωεϩδοΫɺσʔλΞΫη εͷ֤͞ΕΔ • ϏδωεϩδοΫϢʔεέʔε୯ҐͰߏ͞ ΕΔ × ϏδωεϩδοΫ͕ෳࡶʹͳΔͱɺίʔυॏ
ෳͷ੍ޚ͕͘͠ͳΔ
Table Module υϝΠϯ σʔλΞΫηε ϓϨθϯ DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ
αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ DAO DAO DAO ϩδοΫ ʢςʔϒϧXʣ ϩδοΫ ʢςʔϒϧYʣ ϩδοΫ ʢςʔϒϧZʣ
public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderLogic fOrderLogic; private
ICustomerLogic fCustomerLogic; public List<OrderBean> findOrders( CustomerBean customer) { return fOrderLogic.findByCustomer(customer); } public void confirmOrder( OrderBean order, CustomerBean customer) { fOrderLogic.confirm(order, customer); } public void cancelOrder( OrderBean order, CustomerBean customer) { fOrderLogic.cancel(order, customer); } ...
public class OrderLogicImpl implements IOrderLogic { private IOrderDao fOrderDao; private
ICustomerLogic fCustomerLogic; public List<OrderBean> findByCustomer( CustomerBean customer) { return fOrderDao. findByCustomerId(customer.getId()); } public void confirm( OrderBean order, CustomerBean customer) { ... } public void cancel( OrderBean order, CustomerBean customer) { ... } ...
Table Module • ϓϨθϯɺϏδωεϩδοΫɺσʔλΞΫη εͷ֤͞ΕΔ • ϏδωεϩδοΫ͞Βʹ2ʹ͔ΕΔ - Service Layer
ʹ Ϣʔεέʔε୯Ґ - υϝΠϯϩδοΫ ʹ DBςʔϒϧ୯Ґ • ࣮༻ϨϕϧͰͳ͍͕ɺίʔυʹϜμ͕ ଟ͘ඒ͘͠ͳ͍
ΩϟζϜΛ͑Δ http://www.flickr.com/photos/matheus_momesso/4469788827/
૯শؔʢCLOSʣ ;;; Ϋϥεఆٛ (defclass order () ((number :accessor order-number ...)))
(defmethod confirm ((self order)) (... (order-number self))) ;;; ࣮ߦίʔυ (setq o (make-instance ‘order :number 12345)) (confirm o)
confirm(order); order.confirm();
૯শؔ → ΦϒδΣΫτ class OrderLogic { static void confirm( OrderBean
order, CustomerBean customer) { order.getOrderNo(); ... OrderLogic .confirm(order, customer); class Order { String orderNo; void confirm( Customer customer) { this.orderNo; ... order.confirm(customer); Table Module Domain Model
Domain Model υϝΠϯ σʔλΞΫηε ϓϨθϯ DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ
αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ ORM ORM ORM υϝΠϯ ΦϒδΣΫτ υϝΠϯ ΦϒδΣΫτ υϝΠϯ ΦϒδΣΫτ
public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderRepository fOrderRepository; private
ICustomerRepository fCustomerRepository; public List<Order> findOrders( Customer customer) { return fOrderRepository.findBy(customer); } public void confirmOrder(Order order) { order.confirm(); } public void cancelOrder(Order order) { order.cancel(); } ...
public class Order { private Customer fCustomer; public void confirm()
{ ... } public void process() { ... } public void cancel() { ... } ...
Domain ModelͷϝϦοτ • ࠶ར༻ੑɺϝϯςφϯεੑ͕ߴ͘ͳΔ • ϩδοΫͷஔ͖ʹ·ͳ͍ • ෳࡶͳϏδωεϩδοΫΛϞσϧʹΑͬͯ ՄࢹԽͰ͖Δ •
ίʔυͷࣈ໘͕γϯϓϧʹͳΓɺඒ͍͠
·ͱΊ •ίʔυͷॏෳഉআΛڀ͢Δͱɺࣗવ ͱTable Module·ͰḷΓண͘ •Table Module͕૯শؔʹΑΔOOͷ࣮ ͱؾ͚ͮɺDomain Modelͷಓ͕ ͚Δ
࠷ޙʹ
“Architecture teams must not siphon off all the best and
brightest.” ΞʔΩςΫνϟνʔϜʹ ࠷༏लͳϝϯό ΛूΊ͍͚ͯͳ͍ɻ — Eric Evans, Domain-Driven Design
ςΫϊϩδ͔ΒυϝΠϯ • ςΫϊϩδͷ׆༻ʹࡴ͞Ε͍ͯ ͳ͍ͩΖ͏͔ʁ - ސ٬ʹՁΛͨΒ͢ͷΠϯ ϑϥϑϨʔϜϫʔΫͰͳ͍ • ϏδωεʹਅͷྗΛ༩͑Δͷɺ υϝΠϯʹϏδωεϩδοΫ
http://www.flickr.com/photos/wwworks/2222523486/
υϝΠϯΛઓ͍ൈͨ͘Ίͷث •ΦϒδΣΫτࢦੳʗ ઃܭͷجૅ •GRASPύλʔϯ - ใΤΩεύʔτ - ߴڽू - ݁߹
•ඞཁͳͷDIίϯς φɺORMɺRIAɺNoSQLͳ ͲͷࣝͰͳ͍ʂ
υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ