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
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
330
Performance Engineering for Everyone
elenatanasoiu
0
250
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
820
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
1k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
270
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
580
act1-costs.pdf
sumedhbala
0
150
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
A2UI という光を覗いてみる
satohjohn
1
170
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
Vite+ Unified Toolchain for the Web
naokihaba
0
410
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
Featured
See All Featured
Accessibility Awareness
sabderemane
1
150
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Spectacular Lies of Maps
axbom
PRO
1
840
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Mind Mapping
helmedeiros
PRO
1
270
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
460
Automating Front-end Workflow
addyosmani
1370
210k
GitHub's CSS Performance
jonrohan
1033
470k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Designing for humans not robots
tammielis
254
26k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
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ͳ ͲͷࣝͰͳ͍ʂ
υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ