Slide 1

Slide 1 text

ROM.rb: Another Approach to Persistence Seiya IZUMI (@sy_izumi)

Slide 2

Slide 2 text

About me • ෢ଂେֶ4೥ • 1೥ؒٳֶͯ͠ITاۀͰΊͪΌͪ͘ΌΠϯλʔ ϯͨ͠Γͨ͠ • ීஈ͸Vue.js΍ReactNativeͳͲΛ৮ͬͯ·͢ @sy_izumi IzumiSy

Slide 3

Slide 3 text

ࠓ೔͸ROM.rbͷ͸ͳ͠Λ͠·͢

Slide 4

Slide 4 text

RailsΞϓϦέʔγϣϯΛ࡞͍ͬͯͯ • Model͕σʔλϕʔεʹର͢Δૢ࡞ͱɺυϝΠ ϯର͢Δૢ࡞ͱ͍͏̎ͭͷ੹຿Λ͕࣋ͪͪʹ ͳΔ͜ͱ͕ଟ͍ • Ϟσϧ͕࣮࣭ɺӬଓԽϨΠϠͱૄ݁߹
 database schema ≒ domain model

Slide 5

Slide 5 text

ActiveRecordͷ͍ͤͰ͸ͳ͍ • ActiveRecordύλʔϯʹ͓͍ͯ͸ɺϞσϧ͕ ӬଓԽϨΠϠͷߏ଄ͱಉ͡Ͱ͋Δͱ͍͏͜ͱ ͸ར఺ɻ • ϦϑΝΫλϦϯάύλʔϯͳͲʹΑͬͯద੾ͳ ରॲ͕Ͱ͖Δ
 (FormObject, Validator, Callback,etc …)

Slide 6

Slide 6 text

ʮAR͡Όͳ͍ͱμϝʯͰ͸ͳ͍ • ϦϑΝΫλϦϯάύλʔϯΛۦ࢖ͯ͠ ActiveRecordΛ࢖͍͜ͳ͢ͷ΋ͻͱͭͷબ୒ • Ͱ΋ɺ΋͔ͨ͠͠Β୅ସʹͳΔΑ͏ͳҟͳΔ ࢥ૝ͷORϚούʔ͕͋Δ͔΋ʂ • άάͬͯΈΔ

Slide 7

Slide 7 text

͋ͬͨ

Slide 8

Slide 8 text

ROM.rbͱ͸ • RubyΞϓϦέʔγϣϯͷͨΊͷӬଓԽϥΠϒ ϥϦ • ୯ͳΔORϚούʔͰ͸ͳ͘ɺ༷ʑͳӬଓԽ૷ ஔΛϓϥΨϒϧͳΞμϓλͱͯ͠࢖͑Δ • Separating persistence from domain layer

Slide 9

Slide 9 text

ϔΩαΰφϧɾΞʔΩςΫνϟ http://blog.tai2.net/hexagonal_architexture.html

Slide 10

Slide 10 text

ӬଓԽΛͲ͏ଊ͑Δ͔ʁ User.create(name: “Bob”) POST https://api.stripe.com/v1/charges

Slide 11

Slide 11 text

ӬଓԽϨΠϠͱૄ݁߹ੑ • ΞϓϦέʔγϣϯͷ֎෦ʹ͋Δ૷ஔͷૢ࡞ํ ๏ʹؔͯ͠Ͱ͖Δ͚ͩૄ݁߹ʹ͢Δ • WebAPI͸͍ͭ·Ͱ΋࢖͑Δͱ͸ݶΒͳ͍
 ʢcf. WebPayͷαʔϏεऴྃ in 2016ʣ • ΞϓϦέʔγϣϯ͕ϏδωεҎ֎ͷ΋ͷʹґ ଘ͠ॊೈੑ͕ࣦΘΕΔͷΛආ͚Δ

Slide 12

Slide 12 text

How to use ROM.rb?

Slide 13

Slide 13 text

Architecture .PEFM 3FQPTJUPSZ 3FMBUJPO "EBQUFS Infratructure Layer Domain Layer

Slide 14

Slide 14 text

Architecture 1030 ROM::Repository ROM::Relation ROM::Gateway Infratructure Layer Domain Layer

Slide 15

Slide 15 text

Model module Domain class Book attr_reader :id, :title, :price def initialize(attrs) @id, @title, @price = attrs.values_at(:id, :title, :price) end end end • POROͳΞϓϦέʔγϣϯݻ༗ͷϩδοΫΛ࣋ͭ੹຿ • ଟ͘ͷ৔߹RepositoryʹΑͬͯੜ੒͞ΕΔ • ROM.rb͕͜͜ʹ༩͑ΔӨڹ͸࠷খݶ

Slide 16

Slide 16 text

Repository module Repository class Book < ROM::Repository[:books] def by_id(id) books.by_pk(id).map_to(Domain::Books).one! end def all books.map_to(Domain::Book) end end end • υϝΠϯϨΠϠͱӬଓԽϨΠϠͷ૭ޱʹͳΔ෦෼ • υϝΠϯʹద੾ͳΦϒδΣΫτΛੜ੒͠ɺӬଓԽ૷ஔʹݻ༗ͳΫΤϦੜ ੒ͳͲ͸Relation͕੹຿ͱͯ͠੥͚ෛ͏

Slide 17

Slide 17 text

Relation class Books < ROM::Relation[:sql] schema(infer: true) do associations do belongs_to :author end def by_id(id) where(id: id) end def available where(is_available: true) end end end • ӬଓԽϨΠϠͱͯ͠Ξμϓλʹ ର͢Δૢ࡞Λϥοϓ͢Δ • ΞιγΤʔγϣϯ΍ϑΟʔϧυ όϦσʔγϣϯͳͲΛ͜͜Ͱఆ ٛ • ର৅ͱͳΔΞμϓλʹݻ༗ͷૢ ࡞͕Ͱ͖Δ • ͜͜Ͱఆٛͨ͠ϝιου܈Λ RepositoryͰ࢖͑Δ

Slide 18

Slide 18 text

Adapter • ӬଓԽ૷ஔͷ۩ମతͳૢ࡞Λߦ͏੹຿ • 3rd-partyͷओཁͳAPIΞμϓλ͸͍͔ͭ͘༻ҙ͞Ε͍ͯΔ • SQLΞμϓλʹ͸Sequel͕ϥοϓ͞Ε͍ͯΔ

Slide 19

Slide 19 text

·ͱΊ

Slide 20

Slide 20 text

·ͱΊ • ROM.rb͸ӬଓԽϨΠϠͷந৅ԽͱυϝΠϯϨ ΠϠ͔Βͷ෼཭ΛΨονϦͱαϙʔτͯ͘͠ ΕΔ • υϝΠϯʢϞσϧʣϨΠϠͱӬଓԽϨΠϠΛ ૄ݁߹ʹͯ͠ɺΞϓϦέʔγϣϯΛมԽʹڧ ͘͠Α͏

Slide 21

Slide 21 text

Ұํ·ͨผͷҙݟ • Ͳͷ੹຿ΛͲ͏෼͚Δ͔ͱ͍͏؍఺ͷ౷Ұ͕ ग़དྷ͍ͯͳ͍ͱӡ༻ͣ͠Β͍ݒ೦͕͋Δ • ιʔείʔυ͕ࢄΒ͹ͬͯݟ௨͕͠ѱ͘ͳΔͱ ͍͏ਓ΋͍Δ • ΞϓϦέʔγϣϯͷ૝ఆن໛ʹ߹Θͤͯద੾ ͳπʔϧΛબͿͷ͕BEST

Slide 22

Slide 22 text

https://github.com/IzumiSy/sample_bookshelf

Slide 23

Slide 23 text

Thank You! http://rom-rb.org