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
53
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
45
ブレイクスルーと文学 - The Breakthrough and Literature
tadayosi
0
44
JJBUG 2013 - SwitchYard
tadayosi
0
39
Red Hat の日本でできるグローバルな働き方
tadayosi
0
53
Red Hat Tech Night 2018 - Apache Camel
tadayosi
0
31
Red Hat Tech Night 2019.5 - Camel 3 and Beyond...
tadayosi
0
33
Other Decks in Programming
See All in Programming
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
120
ソフトウェアラスタライザ
fadis
1
790
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
630
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
210
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
100
ALB ログから Trace を気合で繋げる技術
fohte
7
860
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
830
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
350
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
330
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
140
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Mobile First: as difficult as doing things right
swwweet
225
10k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Everyday Curiosity
cassininazir
0
310
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Scaling GitHub
holman
464
140k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
New Earth Scene 8
popppiees
3
2.5k
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ͳ ͲͷࣝͰͳ͍ʂ
υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ