Slide 1

Slide 1 text

Is this Rails model? @2016-11-12 #ckpd_LT ٕज़෦ ։ൃج൫ @moro ॾڮګհ

Slide 2

Slide 2 text

‣ ུྺ ‣ 3BJMTᴈ໌ظ͔Β೥΄Ͳ3BJMT࢖͖ͬͯͨ ‣ ࠷ۙ΍͍ͬͯΔ͜ͱ ‣ 3BJMTΞϓϦͷઃܭࢧԉ΍ίʔυϨϏϡʔ ‣ ΄͔ʹΞδϟΠϧ͓͡͞Μͱ͔ ‣ ΋ͪΖΜࣗ෼Ͱίʔυ΋ॻ͍ͯΔ

Slide 3

Slide 3 text

‣ 10೥ઓ͖ͬͯͨRubyͱRails͸ɺWebαʔϏεͷ
 Ձ஋ΛϢʔβʔʹಧ͚ΔϨʔϧʹͳ͍ͬͯΔ ‣ ϒϥ΢β޲͚: HTML, JS & CSS ‣ ΞϓϦ޲͚: JSON over HTTP ‣ ֤छσʔλετΞͷಡΈॻ͖ Why: ͜ͷ࿩͕Ͳ͏໾ʹཱͪͦ͏͔

Slide 4

Slide 4 text

‣ ϒϥ΢β޲͚ʹ΋Γ΋Γॻ͘ ‣ ΞϓϦ޲͚ͷAPI࡞Δͷʹͦͦ͜͜ॻ͘ ‣ ผαʔϏεͰ࡞ͬͨσʔλΛϢʔβʹಧ͚ΔͨΊʹ ͪΐͬͱॻ͘ ‣ DWHͷूܭσʔλ ‣ ػցֶशͷ෼ྨ݁Ռ… ͜Ε͔Βͷ͍ΖΜͳΤϯδχΞʹͱͬͯͷRails

Slide 5

Slide 5 text

Is this Rails model? dେͳΓখͳΓ3BJMTΛ͞ΘΔͱ͖ͷΨΠυ

Slide 6

Slide 6 text

Before Rails

Slide 7

Slide 7 text

‣ Enterprise Java ‣ PofEAA, PofEAAಡॻձ ‣ Ruby ͸Ұ෦Ͱ͸࢖ΘΕ͍͕ͯͨʮ࢓ࣄͰ࢖͏ݴޠʯ Ͱ͸ͳ͔ͬͨɻ ‣ 2001-04: tDiary ‣ 2002- kagemai Before Rails: ~2003

Slide 8

Slide 8 text

‣ จܥେֶੜ ‣ େखిػϝʔΧʔʹSEͱͯ͠ब৬ ‣ 100+ਓɺ਺೥(?)͕͔ΓͷϓϩδΣΫτʹ഑ଐ ‣ ϓϩδΣΫτ಺ͷޮ཰ԽπʔϧΛ࡞ΔͷʹRuby͞ΘΔ NF!#FGPSF3BJMT

Slide 9

Slide 9 text

‣ וాͷຊ԰Ͱങͬͨ ‣ net/telnetͰSolarisʹϩάΠϯͯ͠ ‣ γΣϧεΫϦϓτ࣮ߦͯ͠ ‣ ग़དྷͨϑΝΠϧΛnet/ftpͰ࣋ͬͯ͘ΔεΫϦϓτʹ ‣ VisualuRubyͰUI͚ͭͯ ‣ exerbͰݻΊͯϙϯஔ͖

Slide 10

Slide 10 text

Rails was coming

Slide 11

Slide 11 text

‣ 2005-09: 
 AgileWebDevelopment with Rails ‣ 2005-12: Rails 1.0 ‣ 2007-12: Rails 2.0

Slide 12

Slide 12 text

‣ “Sustainable productivity for web-application development. ” ‣ 5෼ͰϒϩάΛ࡞Δ ‣ Opinionated framework: ओு͕ڧ͍ ‣ MVC, DRY… Rails was coming : 2004-2007

Slide 13

Slide 13 text

‣ At the heart of MVC (sniff) is what I call Separated Presentation. ‣ In MVC, the domain element is referred to as the model. Model objects are completely ignorant of the UI. ‣ http://martinfowler.com/eaaDev/uiArchs.html MVC

Slide 14

Slide 14 text

‣ app/{views,controllers,models} ‣ app/models ʹ͸ AcitveRecord::Base Λ
 ܧঝͨ͠”Ϟσϧ”ͷ਽ܗ͕Ͱ͖Δ Rails’ scaffold MVC

Slide 15

Slide 15 text

‣ σʔλϕʔεͷςʔϒϧ΍ϏϡʔͷྻΛϥοϓ͠ɺ σʔλϕʔεΞΫηεΛΧϓηϧԽ͠ɺυϝΠϯϩδο ΫΛ௥Ճ͢Δ ‣ http://bliki-ja.github.io/pofeaa/ActiveRecord/ Active recordύλʔϯ

Slide 16

Slide 16 text

‣ ΞΫηαΛDBεΩʔϚ͔Βಈతʹఆٛ ‣ fkͰࢀরͰ͖Δςʔϒϧؒͷؔ࿈(association)΋
 Ruby͔Βѻ͍΍͍͢ ‣ (͔ΜͨΜʹ࢖͏෼ʹ͸)SQLΛॻ͔ͳ͍͍ͯ͘ ActiveRecord: Rails default ORM

Slide 17

Slide 17 text

‣ ೔ຊRubyΧϯϑΝϨϯε2006 ͰͷDHHΩʔϊʔτ ‣ http://www.slideshare.net/vishnu/ discovering-a-world-of-resources-on-rails ‣ Webͷੈք΋CRUDʹந৅ԽͰ͖ΔͷͰ͸? RESTful & ActiveResource

Slide 18

Slide 18 text

‣ POST /groups/42/membership ‣ ͋ΘͤͯಡΈ͍ͨ: ָʑERDϨοεϯ ʮͰ͖͝ͱʯͷΤϯςΟςΟԽ

Slide 19

Slide 19 text

‣ Rails͕େϒʔϜʹ ‣ ʮϞσϧʯͱ͍͑͹ActiveRecord ‣ ग़དྷࣄΛΤϯςΟςΟԽ͢Ε͹RESTful΋Πέͦ͏ ‣ ʮ͖Ε͍ͳRESTʯͱ͸DBͷϨίʔυΛXML(!!)Ͱ
 ఏڙ͢Δ͜ͱ Rails was coming : 2004-2007

Slide 20

Slide 20 text

me @ 2004 - 2007 ‣ Railsษڧձ@౦ژ ‣ લ৬ ESMʹస৬ ‣ ࢓ࣄͰRailsΛ࢖͍࢝ΊΔ ‣ RSpec΋

Slide 21

Slide 21 text

RailsϒʔϜ

Slide 22

Slide 22 text

‣ 2010-08: Rails 3.0 ‣ Merb, Rack, Arel ‣ ·͞ʹ3rd system

Slide 23

Slide 23 text

‣ ARʹϩδοΫΛॻ͔ͳ͍ͷ͕ྲྀߦΔ(?) ‣ ෳ਺ςʔϒϧͷϨίʔυΛಡΈॻ͖Ͱ͖ͳ͘ͳΔ ‣ ʮͦ͏ͩ! ίϯτϩʔϥʹॻ͜͏!!ʯ Anemic domain model (υϝΠϯϞσϧශ݂঱)

Slide 24

Slide 24 text

‣ ίϯτϩʔϥʹϩδοΫ͕ॻ͔ΕΔ ‣ ڞ௨Խ΍ςετ͕೉͘͠ͳΔ ‣ MVCͱ͸ Fat Controller

Slide 25

Slide 25 text

‣ HTTPܦ༝ͰϨίʔυΛ࿐ग़͢Δ͚ͩͰ͸଍Γͳ͍ ‣ N+1໰୊ ‣ APIΫϥΠΞϯτͱαʔόͷີ݁߹Խ ‣ ΠϕϯτΤϯςΟςΟͷ๨٫ ‣ Anemic REST ʮ͖Ε͍ͳRESTʯͱARes

Slide 26

Slide 26 text

‣ ͍ΖΜͳاۀͰ࢖ΘΕΔΑ͏ʹͳͬͨ ‣ ελʔτΞοϓͳαʔϏεͰ΋ ‣ Πϯϋ΢εͰ΋ ‣ ٕज़తෛ࠴ΛෛͬͯαʔϏεΛ࢝ΊΔ/ҭͯΔ࣌ظ RailsϒʔϜ: 2008-2011

Slide 27

Slide 27 text

‣ RailsϨγϐϒοΫ, Rails 3Ϩγϐ ϒοΫ, ͸͡ΊΔCucumber!ͳͲ ग़൛ ‣ RailsͰςετΛॻ͖ͳ͕Βίʔυ Λॻ͍͍ͯͨɻ me@ 2008-2011

Slide 28

Slide 28 text

Fat models & beyond: 2011-

Slide 29

Slide 29 text

‣ 2013-06: Rails 4.0 ‣ Bundler, StrongParameters, Better ActiveModel ‣ 2016-08: Rails 5.0 ‣ ActiveJob, RailsAPI…

Slide 30

Slide 30 text

‣ ϩδοΫΛίϯτϩʔϥʹஔ͘ͱϝϯςφϯεੑ͕ Լ͕Δ ‣ ʮͦ͏ͩ! Ϟσϧʹॻ͜͏!!ʯ ‣ Ϟσϧ = ARϞσϧ Fat Models

Slide 31

Slide 31 text

‣ User΍Recipeͱ͍ͬͨαʔϏεͷओཁΤϯςΟςΟ ͕1,000+ߦ͘Β͍(Ժ౰ͳදݱ) ʹͳΔɻ ‣ όον͔Βsaveͨ࣌͠ʹൃՐ͢ΔίʔϧόοΫ΍ό Ϧσʔγϣϯɻ ‣ helper hell or දࣔ༻ϩδοΫͷϞσϧ௥Ճɻ Fat Models

Slide 32

Slide 32 text

‣ ʮϨίʔυʯ͡Όͳ͍Ϟσϧͷந৅ϨΠϠ͕Ͱ͖ͨɻ ‣ Rails 4+ Ͱ͔ͳΓ࢖͍΍͘͢ɻ ‣ FormObjectύλʔϯ ActiveModel::Model

Slide 33

Slide 33 text

‣ ϞσϧΫϥεԣஅతͳؔ৺͝ͱΛConcernʹநग़͠ ͨɻ ‣ app/{m,v,c}/concerns ‣ ࣮ଶ͸mixinͳͷͰ஫ҙɻ AS::Concern

Slide 34

Slide 34 text

‣ AMo::ValidatorΛܧঝͨ͠όϦσʔγϣϯ
 ϩδοΫͷநग़ɻ ‣ app/validators/ Validatorͷ෼཭

Slide 35

Slide 35 text

‣ Draper ΍ ActiveDecorator ͕ ‣ දࣔ༻ϩδοΫΛϞσϧ͔Β෼཭ͤ͞Δɻ ‣ helperͰ໊͋ͬͨલۭؒڞ༗΍ୀ۶ͳୈҰҾ਺໰୊ ͕཈੍͞ΕΔɻ ‣ Ϟσϧͷ੹຿͕ݮΔɻ Decorator / Presenter

Slide 36

Slide 36 text

‣ 2-3ͭ΄ͲͷʮηοτͰѻ͏σʔλʯΛαʔϏεಛఆ ͷΫϥεͱͯ͠நग़ͨ͢͠΋ͷ ‣ ௨՟(୯Ґ, ֹۚ) ‣ ೔෇ൣғ(։࢝, ऴྃ) ͳͲͳͲ ValueObject (஋ΦϒδΣΫτ)

Slide 37

Slide 37 text

‣ ෳ਺ςʔϒϧͷૢ࡞ͦΕࣗମΛΦϒδΣΫτͱͯ͠ நग़͢Δɻ ‣ ͋Δը໘͔ΒͷΈ࢖͏ϩδοΫΛɺڞ༗͞ΕΔAR Ϟσϧ͔Β෼཭ͤ͞Δɻ ‣ cf: DCIͷӨڹ ‣ http://magazine.rubyist.net/?0041-RailsTheBadParts#l9 Interaction Object, Operation Object or Service Layer

Slide 38

Slide 38 text

‣ ϑϨʔϜϫʔΫͷ”͍͢͝”ΫϥεΛܧঝ͠ͳ͍
 ʮ;ͭ͏ͷʯ(plain old)ͳΫϥεɻ ‣ ૉ௚ʹॲཧΛநग़ͯ͠OOP͢Ε͹Α͍ɻ ‣ VO͸େ఍͜Ε ‣ αʔϏεΫϥε΋ॏްͳ਌Ϋϥεͳ͍ํ͕Αͦ͞͏? PORO: Plain Old Ruby Object

Slide 39

Slide 39 text

‣ https://github.com/trailblazer/trailblazer ‣ ͱ͍͏Α͏ͳ͜ͱΛʮ͜͜Ζ͕͚ʯ͔Β࣮૷ʹͯ͠ ͍Δgem ‣ Opinionated ͳͷͰ·Δͬͱ࠾༻Ͱ͖Δ͔Ͳ͏͔͸ͱ ΋͔͘ɺࢀߟʹͳΓͦ͏ɻ Trailblazer

Slide 40

Slide 40 text

‣ ඇಉظ ‣ ෳ਺DB (ਨ௚෼ׂ, ਫฏ෼ׂ, RW-Spliting, NoSQL) ‣ APIܦ༝ͷଞγεςϜ࿈ܞ ‣ JavaScriptͷ·͢·͢ͷߴ౓Խ ‣ WebSocket … More & more new challengers!

Slide 41

Slide 41 text

‣ Fat C ΑΓ͸Ϛγ͕ͩ Fat M ΋ͭΒ͍ɻ ‣ AR͚͕ͩϞσϧ͡Όͳ͍ɻ ‣ VO΍ServiceLayer΋MVCͰ͍͏ϞσϧͷҰछ ‣ ઐ༻ͷσΟϨΫτϦ΄ͬͯ΋͍͍ ‣ Railsͷ্ͰͩͬͯOOPͰ͖Δ! ΦϨλνͷFatModelͱͷઓ͍͸͜Ε͔Βͩ

Slide 42

Slide 42 text

‣ Railsͱ͔RSpecͱ͔nि໨ͷπϥϛΛຯΘ͍ͳ͕Β αʔϏε։ൃࢧԉ ‣ ίʔυϨϏϡʔͱ͔ ‣ GitHubͰͷιϑτ΢ΣΞ։ൃ͕ҰൠԽͨ͠ ‣ 2015 Cookpadʹస৬ͨ͠ ‣ Ruby΍Railsͷઃܭվળͱ͔ΞδϟΠϧ͓͡͞Μ me@ 2012-

Slide 43

Slide 43 text

Is this Rails model?

Slide 44

Slide 44 text

‣ ͨͿΜϞσϧͰ͢ɻ ‣ ͦͷ্Ͱ෼ׂ͍ͯ͘͠ͱ͍͍: ‣ දࣔϩδοΫΛdecoratorʹ ‣ VOΛ୳ͦ͏ ‣ ෳ਺ϞσϧΛ͞ΘΓ͚ͨΕ͹αʔϏεϨΠϠநग़͢Δͱྑ͍͔΋? Yes, maybe…

Slide 45

Slide 45 text

‣ ϢʔβʔʹՁ஋Λಧ͚ΔͷʹඞཁͳϨʔϧͱͯ͠
 ॻ͘ͱ͖ʹͨͷ͘͠ॻ͍ͯ΄͍͠ͳɻ ‣ ΨοπϦͱɺRailsͱOOઃܭপʹ͸·ͬͯॻ͘ͷ΋
 ͨͷ͍͠ͷͰҰॹʹ΍ͬͯ͘ΕΔਓ଴ͬͯ·͢ɻ ͳΜ͔ͩΜ͍ͩͬͯ΋Rails͸ͨͷ͍͠