Slide 1

Slide 1 text

ϏδωεϩδοΫ ࣮૷ਐԽ࿦ 2010೥10݄27೔ ࠤ౻ ڡ߶ http://ameblo.jp/ouobpo An Evolution of Business Logic Implementation

Slide 2

Slide 2 text

• ࢓ࣄ - Software AGגࣜձࣾ άϩʔόϧίϯαϧλϯγʔ αʔϏε webMethodsίϯαϧλϯτ - ॻ੶ͷࣥචʗ຋༁ͳͲ • Web - ϒϩά: http://ameblo.jp/ouobpo - Twitter: tadayosi • झຯ - KindleͰಡॻ - ೔ຊϕδλϦΞϯڠձձһ ࠤ౻ ڡ߶ʢ͞ͱ͏ ͨͩΑ͠ʣ http://www.flickr.com/photos/robertnyman/189691155/

Slide 3

Slide 3 text

ʰϓϩάϥϛϯάScalaʱ೥໌͚ൃചʂ ೔ຊޠ൛

Slide 4

Slide 4 text

Domain Modelύλʔϯ ͸೉͍͠ʁ

Slide 5

Slide 5 text

http://www.martinfowler.com/eaaCatalog/domainModel.html

Slide 6

Slide 6 text

Domain Modelύλʔϯ͸... •࣮ࡏ͢Δ •௒ਓతͳϚδοΫͰ͸ͳ͍ •ϏδωεϩδοΫ࣮૷ͷࢼߦࡨޡͷதͰࣗવ ʹḷΓண͘ಓͰ͋Δ

Slide 7

Slide 7 text

ϓϩάϥϚᴈ໌ظ http://www.flickr.com/photos/nickhubbard/2878833485/

Slide 8

Slide 8 text

#!/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< ஫จ֬ೝ ...

Slide 9

Slide 9 text

PerlʗCGI order.pl DB ϑΝΠϧ Ϗδωε ϩδοΫ HTML σʔλ ΞΫηε

Slide 10

Slide 10 text

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) { // ϏδωεϩδοΫʁ ... } ...

Slide 11

Slide 11 text

ServletʗJSP OrderServlet DB XML Ϗδωε ϩδοΫ σʔλ ΞΫηε /order/confirm.jsp HTML

Slide 12

Slide 12 text

ϨΠϠΞʔΩςΫνϟ ͷൃݟ http://www.flickr.com/photos/bloggingbookshelf/5084749109/

Slide 13

Slide 13 text

υϝΠϯ૚ σʔλΞΫηε૚ ϓϨθϯ૚ Transaction Script DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ DAO DAO DAO

Slide 14

Slide 14 text

public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderDao fOrderDao; private ICustomerDao fCustomerDao; public List findOrders( CustomerBean customer) { ... } public void confirmOrder( OrderBean order, CustomerBean customer) { ... } public void cancelOrder( OrderBean order, CustomerBean customer) { ... } ...

Slide 15

Slide 15 text

Transaction Script • ϓϨθϯɺϏδωεϩδοΫɺσʔλΞΫη εͷ֤૚͸෼཭͞ΕΔ • ϏδωεϩδοΫ͸Ϣʔεέʔε୯ҐͰߏ੒͞ ΕΔ × ϏδωεϩδοΫ͕ෳࡶʹͳΔͱɺίʔυॏ ෳͷ੍ޚ͕೉͘͠ͳΔ

Slide 16

Slide 16 text

Table Module υϝΠϯ૚ σʔλΞΫηε૚ ϓϨθϯ૚ DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ DAO DAO DAO ϩδοΫ ʢςʔϒϧXʣ ϩδοΫ ʢςʔϒϧYʣ ϩδοΫ ʢςʔϒϧZʣ

Slide 17

Slide 17 text

public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderLogic fOrderLogic; private ICustomerLogic fCustomerLogic; public List 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); } ...

Slide 18

Slide 18 text

public class OrderLogicImpl implements IOrderLogic { private IOrderDao fOrderDao; private ICustomerLogic fCustomerLogic; public List findByCustomer( CustomerBean customer) { return fOrderDao. findByCustomerId(customer.getId()); } public void confirm( OrderBean order, CustomerBean customer) { ... } public void cancel( OrderBean order, CustomerBean customer) { ... } ...

Slide 19

Slide 19 text

Table Module • ϓϨθϯɺϏδωεϩδοΫɺσʔλΞΫη εͷ֤૚͸෼཭͞ΕΔ • ϏδωεϩδοΫ͸͞Βʹ2૚ʹ෼͔ΕΔ - Service Layer ʹ Ϣʔεέʔε୯Ґ - υϝΠϯϩδοΫ ʹ DBςʔϒϧ୯Ґ • ࣮༻ϨϕϧͰ͸໰୊ͳ͍͕ɺίʔυʹϜμ͕ ଟ͘ඒ͘͠ͳ͍

Slide 20

Slide 20 text

ΩϟζϜΛ௒͑Δ http://www.flickr.com/photos/matheus_momesso/4469788827/

Slide 21

Slide 21 text

૯শؔ਺ʢCLOSʣ ;;; Ϋϥεఆٛ (defclass order () ((number :accessor order-number ...))) (defmethod confirm ((self order)) (... (order-number self))) ;;; ࣮ߦίʔυ (setq o (make-instance ‘order :number 12345)) (confirm o)

Slide 22

Slide 22 text

confirm(order); order.confirm();

Slide 23

Slide 23 text

૯শؔ਺ → ΦϒδΣΫτ 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

Slide 24

Slide 24 text

Domain Model υϝΠϯ૚ σʔλΞΫηε૚ ϓϨθϯ૚ DB ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ ΞΫγϣϯ αʔϏε ʢϢʔεέʔεAʣ αʔϏε ʢϢʔεέʔεBʣ αʔϏε ʢϢʔεέʔεCʣ αʔϏε ʢϢʔεέʔεDʣ ORM ORM ORM υϝΠϯ ΦϒδΣΫτ υϝΠϯ ΦϒδΣΫτ υϝΠϯ ΦϒδΣΫτ

Slide 25

Slide 25 text

public class ProcessOrderServiceImpl implements IProcessOrderService { private IOrderRepository fOrderRepository; private ICustomerRepository fCustomerRepository; public List findOrders( Customer customer) { return fOrderRepository.findBy(customer); } public void confirmOrder(Order order) { order.confirm(); } public void cancelOrder(Order order) { order.cancel(); } ...

Slide 26

Slide 26 text

public class Order { private Customer fCustomer; public void confirm() { ... } public void process() { ... } public void cancel() { ... } ...

Slide 27

Slide 27 text

Domain ModelͷϝϦοτ • ࠶ར༻ੑɺϝϯςφϯεੑ͕ߴ͘ͳΔ • ϩδοΫͷஔ͖৔ʹ೰·ͳ͍ • ෳࡶͳϏδωεϩδοΫΛϞσϧʹΑͬͯ ՄࢹԽͰ͖Δ • ίʔυͷࣈ໘͕γϯϓϧʹͳΓɺඒ͍͠

Slide 28

Slide 28 text

·ͱΊ •ίʔυͷॏෳഉআΛ௥ڀ͢Δͱɺࣗવ ͱTable Module·ͰḷΓண͘ •Table Module͕૯শؔ਺ʹΑΔOOͷ࣮ ૷ͱؾ͚ͮ͹ɺDomain Model΁ͷಓ͕ ୓͚Δ

Slide 29

Slide 29 text

࠷ޙʹ

Slide 30

Slide 30 text

“Architecture teams must not siphon off all the best and brightest.” ΞʔΩςΫνϟνʔϜʹ ࠷΋༏लͳϝϯό ΛूΊͯ͸͍͚ͳ͍ɻ — Eric Evans, Domain-Driven Design

Slide 31

Slide 31 text

ςΫϊϩδ͔ΒυϝΠϯ΁ • ςΫϊϩδͷ׆༻ʹ๩ࡴ͞Ε͍ͯ ͳ͍ͩΖ͏͔ʁ - ސ٬ʹՁ஋Λ΋ͨΒ͢ͷ͸Πϯ ϑϥ΍ϑϨʔϜϫʔΫͰ͸ͳ͍ • ϏδωεʹਅͷྗΛ༩͑Δͷ͸ɺ υϝΠϯʹϏδωεϩδοΫ http://www.flickr.com/photos/wwworks/2222523486/

Slide 32

Slide 32 text

υϝΠϯΛઓ͍ൈͨ͘Ίͷ෢ث •ΦϒδΣΫτࢦ޲෼ੳʗ ઃܭͷجૅ •GRASPύλʔϯ - ৘ใΤΩεύʔτ - ߴڽू - ௿݁߹ •ඞཁͳͷ͸DIίϯς φɺORMɺRIAɺNoSQLͳ Ͳͷ஌ࣝͰ͸ͳ͍ʂ

Slide 33

Slide 33 text

υϝΠϯͰօ͞Μͷ ྗΛൃش͠Α͏ʂ

Slide 34

Slide 34 text

͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ