Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ビジネスロジック実装進化論 - 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
55
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
240
Domain-Driven Design Retrospective
tadayosi
0
46
ブレイクスルーと文学 - The Breakthrough and Literature
tadayosi
0
44
JJBUG 2013 - SwitchYard
tadayosi
0
39
Red Hat の日本でできるグローバルな働き方
tadayosi
0
56
Red Hat Tech Night 2018 - Apache Camel
tadayosi
0
32
Red Hat Tech Night 2019.5 - Camel 3 and Beyond...
tadayosi
0
33
Other Decks in Programming
See All in Programming
sbt 2.0: takeoff
eed3si9n
0
150
すこし踏み込む CancellationToken
htkym
2
1.7k
JIS keyboard support in Omarchy
lef237
0
100
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
130
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.1k
APNsからLive Activityを開始する話
yumnumm
0
170
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
1.3k
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.5k
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
230
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
170
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Making the Leap to Tech Lead
cromwellryan
135
10k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
560
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The browser strikes back
jonoalderson
0
1.8k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
The SEO identity crisis: Don't let AI make you average
varn
0
590
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ͳ ͲͷࣝͰͳ͍ʂ
υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ