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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Tadayoshi Sato
August 23, 2024
Programming
52
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
230
Domain-Driven Design Retrospective
tadayosi
0
43
ブレイクスルーと文学 - The Breakthrough and Literature
tadayosi
0
43
JJBUG 2013 - SwitchYard
tadayosi
0
38
Red Hat の日本でできるグローバルな働き方
tadayosi
0
50
Red Hat Tech Night 2018 - Apache Camel
tadayosi
0
30
Red Hat Tech Night 2019.5 - Camel 3 and Beyond...
tadayosi
0
33
Other Decks in Programming
See All in Programming
その節約、円になってますか?
isamumumu
1
720
今さら聞けない .NET CLI
htkym
0
190
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
460
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
180
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.5k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
640
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
590
テーブルをDELETEした
yuzneri
0
140
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
360
仕様駆動開発の消費期限
watany
20
7.8k
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Prompt Engineering for Job Search
mfonobong
0
400
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
400
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
410
Typedesign – Prime Four
hannesfritz
42
3.1k
Making the Leap to Tech Lead
cromwellryan
135
10k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
The Spectacular Lies of Maps
axbom
PRO
1
900
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Skip the Path - Find Your Career Trail
mkilby
1
180
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Language of Interfaces
destraynor
162
27k
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ͳ ͲͷࣝͰͳ͍ʂ
υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ