Share
Embed
Transcript
38 slides
-
ΞδΣϯμ • త • DDDͷઓज़తύλʔϯͷதͰൺֱతʹॏཁͰղͰ͋Δɺू ΛͲͷΑ͏ʹઃܭɾ࣮͢ΔͱΑ͍͔ɺҙͳͲ౿·͑ͳ ͕Βղઆ • ΞδΣϯμ •
ूͱ • ूͷڥք • ࣗಈंमཧళͰͷࣄྫ • ܖʹΑΔઃܭ(DbC) • ूΛ࣮͢ΔͨΊͷϧʔϧ(Evans and Vernon) • ·ͱΊ -
ूͱ • ϥΠϑαΠΫϧΛڞʹ͢Δɺؔ࿈͕ਂ ͍ෳͷΦϒδΣΫτΛɺͻͱ͔ͨ· Γͷ”ू”ͱͯ͠ѻ͏ • ूΛมߋͷҰ؏ੑΛอূ͢ΔҰͭͷ ୯Ґͱͯ͠ɺଞͷΦϒδΣΫτͷʮڥ քʯΛ໌֬ʹ͚Δ •
ΦϒδΣΫτଞͷΦϒδΣΫτͱؔ ࿈Λ࣋ͭՄೳੑ͕͋Δ͕ɺෆదͳϩο ΫϢʔβϏϦςΟΛԼͤ͞Δɻಉ ͡ߦΛฤू͍ͯ͠ͳ͍ͷʹจॻશମΛ ϩοΫͳͲϩοΫڝ߹ͷԹচʹͳΔ ू -
ڥքͲ͜ʁ • DB͔ΒैۀһΦϒδΣΫτΛআ͢Δέʔε • ैۀһͱڞʹ໊લɾੜ݄ɾ৬۠ͳ͘ ͳΔ͕ɺ෦ॺͲ͏ͩΖ͏͔ʁ • ෦ॺ͕ैۀһͷڥքʹؔͳ͍͜ͱࣗ໌͕ͩɺ ͦͷஅج४Λཧతʹઆ໌Մೳ͔ʁ •
ͨͱ͑ɺಉ͡෦ॺʹผͷैۀһ͕ॴଐ͍ͯ͠ Δ͔͠Εͳ͍ɻͦͷ෦ॺΛআ͢Δͱผͷै ۀһΦϒδΣΫτআ͞ΕͨࢀরΛ࣋ͭ͜ͱ ʹͳΔɻٯʹ์ஔ͢ΕɺDBʹෆཁͳ෦ॺΛ ͨΊࠐΉ͜ͱʹͳΔ ू -
ڥքະఆٛʹΑΔ • ଘࡏ͢ΔෳͷΦϒδΣΫτ͕ɺ͍ͭ ࡞ΒΕɺ͍ͭͳ͘ͳΔͷ͔ʁ • σʔλΛมߋ͢Δൣғ(τϥϯβΫ γϣϯείʔϓͳͲ)σʔλͷҰ؏ੑ Λҡ࣋͢Δϧʔϧ͕ͳ͚ΕͳΒͳ͍ • ڥքະఆٛͷ··ɺDBͷϩοΫػߏ
Λར༻͢Δ͜ͱ͕Ͱ͖Δ͕ɺͦͷ͠ ͷ͗ͷղܾࡦͱݴΘ͟ΔΛಘͳ͍(ѻ ͍Λؒҧ͑ΕϩοΫ͕ڝ߹͢ΔՄೳ ੑ͕͋Δ) • ຊ࣭Ϟσϧʹ͋Δɻ͜ΕΒͷ ڥքΛఆٛ͢Δ͜ͱͰղܾͰ͖Δ ू $BS 5JSFT &OHJOF 5JSFTͱ&OHJOFҰॹʹ ࡞ΔʁͦΕͱผʑʁফ ͢ͱ͖ಉ͡ͳͷʁ λΠϠަޙʹλΠϠ͕ຊ͔͠ͳ͍ ঢ়ଶ͚ͩͲʜɻͦΕυϝΠϯΦϒδΣ Ϋτ͕յΕ͍ͯΔঢ়ଶͰʜɻ ंʹऔΓ͚ΒΕΔલͳΒ͍͍ͷ͔ʁ // ूΛލ͕ΔΑ͏ͳτϥϯβΫγϣϯʁͦΕͱҰͭͷूͱ͠ ͯѻ͍ͬͯΔͷ͔ʁ def updateCar(car: Car) = { withTranscation { implicit con => updateRecord(car.id, car.tires) updateRecord(car.engine.id, car.engine.typeName) } } // ͋Εʁͬͪ͜୯ಠͰߋ৽͢ΔΑ͏ͩɻڥք͕໌ࣔ͞Ε͍ͯͳ͍… def updateEngine(engine: Engine) = { withTranscation { implicit con => updateRecord(engine.id, engine.typeName) } } -
ڥքΛͲͷΑ͏ʹఆٛ͢Δͷ͔ • Ϟσϧʹ͋ΔࢀরΛΧϓηϧԽ͢ΔͨΊͷநԽ͕ ඞཁɻؔ࿈͢ΔΦϒδΣΫτ܈Λͻͱ͔ͨ·Γͱ͠ɺ σʔλΛมߋ͢Δ୯Ґͱͯ͠ѻ͏ɻ͜Ε͕ूͷׂ • ֤ूʹڥքͱϧʔτ͕͋Δ • ڥքू෦ʹԿ͕͋Δ͔Λఆٛ͢Δ •
ϧʔτूʹؚ·Ε͍ͯΔಛఆͷ1ΤϯςΟςΟ (ϧʔτΤϯςΟςΟ) ू ϧʔτ " # % & $ ڥք -
ࣗಈंमཧళ͚γεςϜͷྫ • λΠϠͷϩʔςʔγϣϯͷه ͱɺ֤λΠϠͷߦڑͱ ໘ͷຎ߹͍Λ͢Δ • ࣗಈंάϩʔόϧͳಉҰੑΛ ࣋ͭϧʔτΤϯςΟςΟɻࣝผ ࢠʹं྆൪߸Λར༻͢Δ •
λΠϠࣗಈं͔ΒΕΔͱಉ ҰੑΛؾʹ͠ͳͯ͘Α͍ɻަ ͞Εͨݹ͍λΠϠΛࢭ ΊΔ͔ɺͨͩͷΦϒδΣΫτ ͱͯ͠ࡏݿΛཧ͢ΕΑ͍ ڥք ࣗಈं λΠϠ λΠϠ λΠϠ λΠϠ ू -
FYI: ΦϒδΣΫτΛḷΔೋͭͷํ๏ • ಛఆͷλΠϠΛ୳͢߹ɺ ·ͣࣗಈंΛಛఆ͔ͯ͠Βɻ ं྆൪߸ΛͬͯDBʹΫΤϦ Λ͔͚Δ • ͦͷͨΊɺλΠϠ͕ࣗಈंʹ ண͞Ε͍ͯΔؒάϩʔό
ϧͳಉҰੑෆཁɻϧʔτΤ ϯςΟςΟ͔ΒࢀরΛḷΔ • ͯ͢ͷΦϒδΣΫτ͕ू ͩͱɺ߹ੑͷҡ࣋ཧ͕ ࡶԽ͢ΔՄೳੑ͕͋Δ ڥք ࣗಈं λΠϠ λΠϠ λΠϠ λΠϠ %# ΫΤϦ ࢀর ू -
Ϣʔεέʔε͔ΒڥքΛݟ͚ͭग़͢ • ҰํɺΤϯδϯಠཱͨ͠ू or ू ෦ͷΦϒδΣΫτʁ • ࣗಈंͱಠཱͯ͢͠ΔϢʔεέʔ εͰ͋ΕɺΤϯδϯಠཱͨ͠ू ͱͳΔɻ
• ं͕ΤϯδϯΛแ͢Δͱ͍͏ࢥ͍ ࠐΈͱ૬͢Δ͔͠Εͳ͍͕ɺ ϢʔεέʔεΛແࢹͯ͠ϞσϧΛ࡞ Δͱʹཱͨͳ͍Ϟσϧʹͳͬͯ͠ ·͏ • Ϣʔεέʔε͔ΒϞσϧΛ͢Δ ͜ͱඞཁ͕ͩɺϞσϧͷ߹ੑ͕ Γཱ͔ͭݕূඞཁɻ͜Ε྆ྠ ڥք ࣗಈं λΠϠ λΠϠ λΠϠ λΠϠ Τϯδϯ ڥք ू -
Evansϧʔϧ1 • ϧʔτΤϯςΟςΟɺάϩʔό ϧͳಉҰੑΛ࣋ͪɺෆม݅(ͦ ͷϞσϧ͕࣋ͭੑ࣭)ΛνΣοΫ͢ ΔΛෛ͏ • λΠϠͷަϝιουͳͲΛհ ͯ͠ߦΘΕΔɻܾͯ͠෦ͷΦϒ δΣΫτΛૢ࡞ͤͯ͞ͳΒ
ͳ͍(λΠϠϩʔςʔγϣϯϧʔϧ Λڧ੍ͤ͞ΔͳͲͷෆม݅Λҡ ࣋͢ΔͨΊʹ) ڥք ࣗಈं λΠϠ λΠϠͷަ λΠϠ λΠϠ λΠϠ ं྆൪߸ λΠϠ ू -
ઌ಄ͷࡾจࣈΛฦ͢ϝιου1 package example object Example1 extends App { def getThree(s:
String): String = s.substring(0, 3) println(getThree("12345")) } • Ҿͷจࣈྻ͔Βઌ಄ࡾจࣈΛൈ͖ग़͠ฦ͢ϝιου • ਖ਼͘͠ಈ࡞ͦ͠͏Ͱ͢… 123 %C$ -
ઌ಄ͷࡾจࣈΛฦ͢ϝιου2 package example object Example1 extends App { def getThree(s:
String): String = s.substring(0, 3) println(getThree("12")) } • ͜ΕαʔϏεଆͷόάͰ͠ΐ͏͔ʁ • ͦΕͱΫϥΠΞϯτଆͷόάͰ͠ΐ͏͔ʁ Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.substring(String.java:1963) at example.Example1$.getThree(Example1.scala:5) … at scala.collection.immutable.List.foreach(List.scala:389) at scala.App.main(App.scala:76) at scala.App.main$(App.scala:74) at example.Example1$.main(Example1.scala:3) at example.Example1.main(Example1.scala) %C$ -
ίʔυ͔Β༷͕Θ͔Βͳ͍ྫ package example case class User(id: Long, name: String, deptId:
Long) trait UserRepository { def findByDeptId(depId: Long): Option[Seq[User]] } object UserRepository1 extends UserRepository { override def findByDeptId(depId: Long): Option[Seq[User]] = None } object UserRepository2 extends UserRepository { override def findByDeptId(depId: Long): Option[Seq[User]] = Some(Seq.empty) } object Example2 extends App { def printUser(userRepository: UserRepository, deptId: Long) = userRepository.findByDeptId(deptId) match { case None => println("users are empty") case Some(users) => println(s"users = $users") } printUser(UserRepository1, 1) // users are empty printUser(UserRepository2, 1) // users = List() } • ΓΛνΣοΫ͢Δ͚ͩͰɺਖ਼͠͞Θ͔Βͳ͍ ͲͪΒͷΓΛฦ͢ ͷ͕ਖ਼͍͠ʁ %C$ Ұൠతʹɺ༷ΛࣗવݴޠͰࣔ ͞ͳ͍ݶΓɺΘ͔Βͳ͍ɻ Ͳ͏ද͢ͱ͍͍͔ → DbC͕Ұͭ ͷ͑ -
ܖʹΑΔઃܭ(Design by Contract) • όά(ʹ༷ͱ࣮ͷໃ६)ͱஅ͢Δਖ਼͠͞ͱ͍͍ͬͨԿ͔ʁ • ”ਖ਼͠͞ͱ૬ରతͳ֓೦Ͱ͋Δ” • ΦϒδΣΫτࢦೖ ୈ2൛
ݪଇɾίϯηϓτ ୈ11ষ ܖʹΑΔઃܭ:৴པੑͷߴ͍ιϑτΣΞΛߏங͢Δ • ιϑτΣΞཁૉͦͷͷ͕ਖ਼͍͔͠Ͳ͏͔Ͱͳ͘ɺରԠ͢Δ༷ͱҰக͢ Δ͔ΛͣΔ͖(ιϑτΣΞཁૉͱ༷ͷϖΞͰߟ͑Δ) • ਖ਼͠͞ΛධՁ͢Δʹɺ”ද໌”Λ༷ͬͨͷهड़ํ๏Λར༻͢Δͷ͕Ұൠత • ਖ਼͠͞ͷެࣜ(ϗΞͷτϦϓϧ) = {P} A {Q} • ʮҙͷAͷ࣮ߦɺPͷঢ়ଶʹͳͬͨͱ͖ʹ࢝·ΓɺQͷঢ়ଶʹͳͬͨͱ͖ʹ ऴྃ͢Δʯ • P = ࣄલ݅(A͕ݺΕΔલʹຬ͖ͨ݅͢)ɻΫϥΠΞϯτΛଋറ͢Δ݅ • A = ιϑτΣΞཁૉ(ॲཧຊମ) • Q = ࣄޙ݅(A͕ݺΕͨޙʹຬ͖ͨ݅͢)ɻαʔϏεΛଋറ͢Δ݅ %C$ -
αʔϏεͱΫϥΠΞϯτ͕ަΘ͢ܖ • ސ٬(ΫϥΠΞϯτ)͕ఏڙऀ(αʔϏε)Λར༻͢Δલఏ ͷܖ • ͋ΔΫϥεʹରԠ͢Δϧʔνϯr͕ɺrequire preͱ ensure postΛએݴ͍ͯ͠Δ߹ɺͦͷΫϥεސ٬(Ϋ ϥΠΞϯτ)ʹҎԼͷ͜ͱΛݴ͍ͬͯΔʹ͍͠
• ʮͦͪ͠Β͕ pre Λຬͨͨ͠ঢ়ଶͰr ΛݺͿͱଋ͠ ͯԼ͞ΔͳΒɺ͓ฦ͠ʹɺpost Λຬͨ͢ঢ়ଶΛ࠷ऴ తʹ࣮ݱ͢Δ͜ͱΛ͓ଋ͠·͢ʯ %C$ -
ྫ: ࣄલɾࣄޙ݅Λද໌͢Δϝιου def getThree(s: String): String = { require(s.length >=
3, "length of s is too long!") s.substring(0, 3) }.ensuring(_.length == 3, "length of s doesn't equals 3") • requireΛͬͯࣄલ݅Λද໌͢Δɻensuringࣄޙ݅ͷද໌ • ΫϥΠΞϯτଆ͕StringIndexOutOfBoundsExceptionʹґଘ͍ͯ͠ΔͳΒɺαʔϏε ଆͷ࣮ʹґଘ͍ͯ͠Δ͜ͱʹͳΔʂ Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: length of s is too long! at scala.Predef$.require(Predef.scala:277) at example.Example1$.getThree(Example1.scala:6) … at scala.App.$anonfun$main$1$adapted(App.scala:76) at scala.collection.immutable.List.foreach(List.scala:389) at scala.App.main(App.scala:76) at scala.App.main$(App.scala:74) at example.Example1$.main(Example1.scala:3) at example.Example1.main(Example1.scala) %C$ -
ෆม݅ͱ • ϗΞͷτϦϓϧʹΑͬͯɺॲཧͷਖ਼͠͞Λఆ͢Δ͜ͱ ͕Ͱ͖Δ͕ɺΫϥεͷଐੑ(σʔλ)ʹຬ͖ͨ݅͢ ͕͋ΔɻͦΕΛෆม݅ͱݺͿ • ྫ͑ɺࣗવͷෆม݅ʮ0Ҏ্ʯͰ͢ɻ • { INV
& P } A { INV & Q} ͕Γཱͭͱ͖ɺ͕ͯ͢ޭ ͢Δ %C$ -
ͦΕͧΕͷܖΛද໌͢Δ case class Order(items: Seq[OrderItem]) { require(items.nonEmpty) def addOrderItems(otherItems: Seq[OrderItem]):
Order = { require(otherItems.nonEmpty) copy(items = this.items ++ otherItems) }.ensuring(items.nonEmpty) } • จΦϒδΣΫτͷจΞΠςϜۭͰ͋ͬͯͳΒͳ͍ɻ • addOrderItem࣌ʹࣄલ݅ͱࣄޙ݅Λ֬ೝ͢Δ • ͬͱ؆ܿʹهड़Ͱ͖ͳ͍͔ %C$ -
ίϯετϥΫλͰͷද໌ case class OrderItems(values: Seq[OrderItem]) { require(values.nonEmpty) } object OrderItems
{ implicit object SeqmigroupInstance extends Semigroup[OrderItems] { override def combine(x: OrderItems, y: OrderItems): OrderItems = OrderItems(x.values ++ y.values) } } case class Order(items: OrderItems) { def addOrderItems(otherItems: OrderItems): Order = copy(items = this.items.combine(otherItems)) } • ImmutableͰ͋ΕίϯετϥΫλͰɺෆม݅Λද໌ ͢ΕɺͦΕΛ͏ϝιουͰͷද໌ΛলུͰ͖Δ %C$ -
FYI: ܕϨϕϧͰͷද໌ object Order { type OrderItems = NonEmptyList[OrderItem] //
NonEmptyListɺઌ಄ཁૉͷheadΛඞͣඞཁͱ͢ΔͨΊɺܕͱۭͯ͠ʹͰ͖ͳ͍ // final case class NonEmptyList[+A](head: A, tail: List[A]) { … } case class Order(items: OrderItems) { def addOrderItem(otherItems: OrderItems): Order = copy(items = this.items.combine(otherItems)) } • cats.data.NonEmptyListͰͷྫ • ܕϨϕϧͰෆม݅Λද໌Ͱ͖Δ • ͯ͢ͷέʔεͰ͜ͷํ๏͕͑ΔΘ͚Ͱͳ͍ %C$ -
࠶ܝ: Evansϧʔϧ1 • ϧʔτΤϯςΟςΟɺάϩʔό ϧͳಉҰੑΛ࣋ͪɺෆม݅(ͦ ͷϞσϧ͕࣋ͭੑ࣭)ΛνΣοΫ͢ ΔΛෛ͏ • λΠϠͷަϝιουͳͲΛհ ͯ͠ߦΘΕΔɻܾͯ͠෦ͷΦϒ
δΣΫτΛૢ࡞ͤͯ͞ͳΒ ͳ͍(λΠϠϩʔςʔγϣϯϧʔϧ Λڧ੍ͤ͞ΔͳͲͷෆม݅Λҡ ࣋͢ΔͨΊʹ) ڥք ࣗಈं λΠϠ λΠϠͷަ λΠϠ λΠϠ λΠϠ ं྆൪߸ λΠϠ ू -
FYI: ՄมϑΟʔϧυΛ࿐ͯ͠ͳΒͳ͍ case class Order(private val _items: Seq[OrderItem]) { require(_items.nonEmpty,
"items are empty!") val items: ListBuffer[OrderItem] = ListBuffer.empty[OrderItem] addOrderItems(_items) def addOrderItems(otherOrderItems: Seq[OrderItem]): Unit = { require(otherOrderItems.nonEmpty, "otherOrderItems are empty!") items.appendAll(otherOrderItems) items.ensuring(_.nonEmpty, "items are empty!") } } object Main extends App { val order = Order(Seq(OrderItem(1L, ProductName("red-pen"), 100, 1))) order.addOrderItems( mutable.Seq(OrderItem(2L, ProductName("blue-pen"), 100, 2))) println(order.items) // ListBuffer(OrderItem(1,ProductName(red-pen),100,1), OrderItem(2,ProductName(blue- pen),100,2)) order.items.clear() println(order.items) // ListBuffer() } • ूͷෆม݅ΛഁյͰ͖ͯ͠·͏ྫ ू ঢ়ଶΛՄมͰ͖Δ ϑΟʔϧυूͷ ڥք֎ʹ࿐ͯ͠ ͳΒͳ͍ WBSͰಉ༷͕ͩɺ WBMͰՄมΫϥεͷ ߹ҙ͕ඞཁ ूͷ༬͔ΓΒͳ͍ॲཧͰෆม݅ΛഁյͰ͖Δ -
Evansϧʔϧ2 • ू֎ͷΦϒδΣΫτɺϧʔτΤϯςΟςΟΛআ ͖ɺڥք෦ͷࢀরΛอ࣋͢Δ͜ͱ͕Ͱ͖ͳ ͍ɻ෦ΦϒδΣΫτͷࢀরΛଞͷΦϒδΣΫτ ʹ͠Ұ࣌తʹར༻͢Δ͜ͱ͕Ͱ͖Δ͕ɺϑΟʔϧ υͱͯ͠ར༻Ͱ͖ͳ͍(ॴ༗ݖͷ໌֬Խ) • DB͔ΒΫΤϦΛͬͯऔಘͰ͖ΔͷɺϧʔτΤ ϯςΟςΟͷΈ
• আͷࡍɺूʹࡏ͢Δ͋ΒΏΔΦϒδΣΫ τΛҰʹআ͢Δ(ϧʔτҎ֎֎෦͔Βࢀর͞ Ε͍ͯͳ͍ͷͰϧʔτΛআ͢ΕGCޮ͕Α ͍) • ू෦ͷΦϒδΣΫτʹର͢Δมߋ͕ίϛοτ ͞ΕΔͱ͖ɺूશମͷෆม͕݅ͯ͢ຬͨ͞ Ε͍ͯΔ͜ͱ ू Order OrderItems Purchase OrderItems ͷࢀরΛอ࣋ NG Order OrderItems Purchase Order ͷࢀরΛอ࣋ OK *%%%Ͱ0SEFS*E Λਪ -
ྫ:ڊେͳू • όοΫϩάɺϦϦʔεɺεϓϦϯτͷͯ͢Λอ࣋͢Δϓϩ μΫτूɻϓϩμΫτʹόʔδϣϯ͕͋Γָ؍ϩοΫ͞Ε Δ • AͱBͷϢʔβ͕ಉ͡όʔδϣϯͰ͍࢝ΊΔˠA͕όοΫϩ άΛՃ͠ίϛοτ B͕ϦϦʔεΛมߋ͠ ͯίϛοτ͢Δ͕ɺ
ָ؍ϩοΫΤϥʔ • සൟʹෳͷϢʔβ͕ߋ৽͢ΔέʔεͰɺಉ࣌ʹมߋ͠Α ͏ͱͨ͠ͱ͖ɺޭ͢Δͷ1ਓ͚ͩड͚ೖΕΒΕͳ͍ ू 7FSOPO -
ྫ:ෳͷू • ڊେͳूΛׂ࢛ɻProductIdʹΑͬͯؔ࿈͚ΒΕΔɻ όοΫϩάͷՃ࣌ɺτϥϯβΫγϣϯڥքͰߦ͏ͨ Ίɺڝ߹͕ى͖ͣʹ҆શʹߋ৽Ͱ͖Δ • τϥϯβΫγϣϯ໘Ͱ༗རͰɺΫϥΠΞϯτଆ͔Β͢ Δͱෆศ͔͠Εͳ͍(Product͕͋Δ͜ͱΛ֬ೝͯ͠ BacklogItemΛՃͳͲ) •
όοΫϩάͳͲͷN Λ੍ݶ͢Δෆม݅ ͕कΕͳ͘ͳΔՄೳੑ͕͋Δ ू 7FSOPO -
ϧʔϧ1: ਅͷෆม݅Λɺ߹ੑͷڥքʹϞσϦϯά͢Δ • ߹ੑʹ2छྨ͋Δ: τϥϯβΫγϣϯ߹ੑ(ڧ͍߹ ੑ)ͱ݁Ռ߹ੑ(ऑ͍߹ੑ)ɻෆม݅ʹඞཁͳ߹ੑ ɺτϥϯβΫγϣϯ߹ੑ • ूτϥϯβΫγϣϯ߹ੑͷڥքͱಉٛɻυϝΠϯ Ͱඞཁͱ͢Δ͋ΒΏΔมߋʹରͯ͠ɺτϥϯβΫγϣϯ
Ͱͷෆม݅ͷ߹ੑΛ҆શʹҡ࣋͢Δ • τϥϯβΫγϣϯͷੳޙʹɺूͷઃܭͷળ͠ѱ͠Λ ਖ਼͘͠அ͢Δ͜ͱ͕Ͱ͖Δ ू 7FSOPO -
ϧʔϧ2: খ͞ͳूΛઃܭ͢Δ • ڊେͳूͰɺجຊૢ࡞ͷଟ͘Ͱɺෳͷେ نͳίϨΫγϣϯͷಡΈࠐΈ͕ൃੜ͢Δɻύ ϑΥʔϚϯεʹѱӨڹ͕͋Δ • ”ଞͷཁૉͱͷ߹ੑΛอͭඞཁ͕͋Δͷ”͕ அج४ɻͨͩ͠ϢʔεέʔεΛҰํతʹແࢹ Ͱ͖ͳ͍(Evans)
• ϞσϧͷҰ෦ΛΤϯςΟςΟԽ͢Δ߹ • ͦΕ͕ࠓޙมΘΓଓ͚ΔͳΒˠूԽ • มߋ࣌ʹ·Δ͝ͱஔ͖͑ΕΑ͍ˠΦ ϒδΣΫτ • ϧʔτΤϯςΟςΟͱҰॹʹγϦΞϥΠ ζͰ͖ɺΫΤϦ୯७ԽͰ͖ΔɻΤϯςΟ ςΟͷํ͕Φʔόʔϔου͕͋Δ ࣗಈं λΠϠ λΠϠ λΠϠ λΠϠ ं྆൪߸ Τϯδϯ Τϯδϯ൪߸ Τϯδϯ൪߸ ܕࣜ ϨγϓϩϩʔλϦ ܕࣜৗʹࣗಈंͷଞͷଐੑͱ߹ੑΛ อͭඞཁ͕͋Δ߹ಉҰूͱͳΔ ू 7FSOPO -
FYI: ϢʔεέʔεΛӏವΈʹ͠ͳ͍ • ϢʔεέʔεੳʹɺϏδωεΞφϦετ͕ॏཁͳׂΛՌͨ͢ ͕ɺ։ൃऀͷࢹΛөͨ͠ͷͱݶΒͳ͍ • ݸʑͷϢʔεέʔεͱϞσϧͷઃܭͷ߹ੑΛ߹ΘͤΔඞཁ͕͋Δ • ෳͷτϥϯβΫγϣϯ(ex. Product,
BacklogItem)Λ୯Ұͷτϥ ϯβΫγϣϯͱͯ͠ѻ͏Α͏ͳϢʔεέʔεͰ͕ੜ͡Δ • ͜ͷΑ͏ͳϢʔεέʔεӏವ Έʹ͠ͳ͍͜ͱ • ߹ʹΑͬͯɺϞσϧ͠ ͘ϢʔεέʔεΛݟ͢ඞ ཁ͕͋Δ • Ͱ͖Εɺ࠷ॳ͔Βશһಉ੮ ͰϞσϦϯάͨ͠ํ͕Α͍ ू 7FSOPO -
ϧʔϧ3: ଞͷूͷࢀরʹɺͦͷࣝผࢠΛར༻͢Δ • ͋Δू͕ผͷूͷϧʔτΤϯςΟςΟ ͷࢀরΛอ͔࣋ͯ͠·Θͳ͍͕ɺࢀরઌͷ ूͱࢀরݩͷू͕ಉ͡ڥքʹଐ͢ΔΘ͚ Ͱͳ͍ • ಉҰτϥϯβΫγϣϯͰ྆ํΛมߋͯ͠ ͍͚ͳ͍ɻมߋͰ͖ΔͷͲͪΒ͔Ұํ͚ͩ
• ಉҰτϥϯβΫγϣϯͰɺ݁ہ ڊେͳू ʹͳΔ • ଞͷूͷࢀরΛอ࣋͠ͳ͚Εɺͦͷू Λมߋ͢Δ͜ͱ͕Ͱ͖ͳ͍ • ֎෦ͷूͷࢀরID͚ͩΛར༻͠ϙΠ ϯλอ࣋͠ͳ͍Α͏ʹ͢Δ • ϝϞϦফඅྔ͑ΒΕΔɻׂΓ͚ͯͩ Ͱͳ͘ɺGC໘ͰӨڹ͕ٴͿ Order OrderItems Purchase Order ͷࢀরΛอ࣋ NG Order OrderItems Purchase OrderId ؒͷࢀরΛอ࣋ OK 0SEFS3FQPTJUPSZ ू 7FSOPO -
ϧʔϧ4: ڥքͷ֎෦Ͱ݁Ռ߹ੑΛ༻͍Δ • ΫϥΠΞϯτ͔Βͷ୯ҰͷϦΫΤετͰɺෳͷूΛม ߋ͢Δ߹݁Ռ߹ੑΛ͏͜ͱ • ͋Δू͕ࢀর͢Δ֎෦ͷूআ͞Ε͍͔ͯ͠Ε ͳ͍͠ɺͦͷૢ࡞Ͱఆ͠ͳ͍ঢ়ଶʹભҠ͍ͯ͠Δ͔ ͠Εͳ͍ɻ(ϓϩμΫτ͕࣋ͭλάʹؔ࿈͘ɺόοΫϩ άͱεϓϦϯτΛফͦ͏ͨ͠Βɺ͢Ͱʹফ͍͑ͯΔ͜ͱ
͕͋Δ) • ͋Δू͕ঢ়ଶΛมߋ͢ΔࡍʹɺαϒεΫϥΠόʹυϝ ΠϯΠϕϯτΛ௨͠ɺ߹ੑΛҡ࣋͢ΔॲཧΛ࣮ߦ͢ Δ͜ͱՄೳ ू 7FSOPO