Share
Embed
Transcript
141 slides
-
ϥϒϨεഢऋਓ ΦʔΨελɾΤΠμɾΩϯά ੈքͰ࠷ॳͷlϓϩάϥϚʔzɻ ࢻతՊֶऀ ࣗশ ɻ ࢻਓόΠϩϯ།Ұͷग़ࢠɻ όϕοδͷղੳػؔʹ͍ͭͯͷ ஶ࡞ͰΒΕΔɻ Augusta
Ada King, Countess of Lovelace(1815-1852) -
օ͞Μ͕͍ͬͯΔιϑτΣΞ ϋʔυΣΞ Πϯλʔωοτʮ୭͔ʯ͕աڈʹ࡞ͬͨͷ Ͱ͋Γɺదʹಈ࡞͠ଓ͚ΔΑ͏ʹʮ୭͔ʯ͕ҡ ͍࣋ͯ͠Δɻ͍·͍ͬͯΔύιίϯεϚϗͷ ը໘ͷ͜͏ʹ͍Δͷਓؒͩɻ͋ͳͨͷੜΈग़ ͨ͠ίʔυ ςΩετ ը૾
Ի ө૾σʔλ͜Ε ͔Βͷʮ୭͔ʯ͕৮ΕΔ͔͠Εͳ͍ɻ৮Εͳ͍ ͔͠Εͳ͍ɻͦͷʮ୭͔ʯ͔ࣗ͠Εͳ͍ ࠓޙCPUΞϧΰϦζϜ͔͠Εͳ͍͚Ͳʜ ɻ -
Ruby “The State of the Octoverse”, Top languages section, GitHub
https://octoverse.github.com/#top-languages -
ͪΐͬͱ3VCZΛॻ͍ͯΈΑ͏͔ɻ༷ wϘʔφεͷֹۚΛࢉग़͢ΔΑ ͜ΕՍۭͷྫͰ͋Γ࣮ࡏͷਓஂମͱ SZ wڅ༩άϨʔυ͝ͱʹج४ֹ͕ۚ͋ΔΑ 4ϥϯΫ ສԁ "ϥϯΫ ສԁ #ϥϯΫ
ສԁ wύϑΥʔϚϯεϨϏϡʔͷ݁ՌͰϘʔφε૿ݮ͢Δ ༏ल ສԁϓϥε ;ͭ͏ Մࢉͳ͠ ೦ ϚΠφεʜ આ໌༻ͷίʔυ͔ͩΒɺ͜Ε͕ʮਖ਼͍͠ʯॻ͖ํ͡Ό͋ͳ͍Α -
require_relative 'fjord_works' RSpec.describe 'ϘʔφεΛܭࢉ͢ΔΑ!!' do context 'komagata͞ΜͷάϨʔυB(ϕʔε100ສԁ)Ͱ' do komagata =
Person.new(name:'komagata', grade: :B) context 'ධՁ͕༏ल(+50ສԁ)ͷͱ͖' do bonus = Bonus.new(komagata, review: :excellent) check = bonus.call example 'Ϙʔφε150ສԁ' do expect(check).to eq(150) context 'machida͞ΜͷάϨʔυA(ϕʔε͕120ສԁ)Ͱ' do machida = Person.new(name:'machida', grade: :A) context 'ධՁ͕;ͭ͏(Մࢉͳ͠)ͷͱ͖' do bonus = Bonus.new(machida, review: :standard) check = bonus.call example 'Ϙʔφε120ສԁ' do expect(check).to eq(120) context 'kakutaniͷάϨʔυS(ϕʔε͕160ສԁ)Ͱ' do kakutani = Person.new(name:'kakutani', grade: :S) context 'ධՁ͕೦(2ׂݮ)ͷͱ͖' do bonus = Bonus.new(kakutani, review: :poor) check = bonus.call example 'Ϙʔφε128ສԁ' do expect(check).to eq(128) ennnnnd -
❯ rspec -fd fjord_works_spec.rb ϘʔφεΛܭࢉ͢ΔΑ!! komagata͞ΜͷάϨʔυB(ϕʔε100ສԁ)Ͱ ධՁ͕༏ल(+50ສԁ)ͷͱ͖ Ϙʔφε150ສԁ machida͞ΜͷάϨʔυA(ϕʔε͕120ສԁ)Ͱ ධՁ͕;ͭ͏(Մࢉͳ͠)ͷͱ͖
Ϙʔφε120ສԁ kakutaniͷάϨʔυS(ϕʔε͕160ສԁ)Ͱ ධՁ͕೦(2ׂݮ)ͷͱ͖ Ϙʔφε128ສԁ Finished in 0.00239 seconds (files took 0.2104 seconds to load) 3 examples, 0 failures -
class Person attr_reader :name, :grade def initialize(name:, grade:) @name, @grade
= name, grade end end class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review = person, review end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call case (g = @person.grade) when :S base = 160 apply_review(base) when :A base = 120 apply_review(base) when :B base = 100 apply_review(base) else raise "No such grade: '#{g}'" end end private def apply_review(base) case @review when :excellent base + 50 when :standard base when :poor base * 0.8 else raise "Nu such review: '#{@review}'" end end end -
class Person attr_reader :name, :grade def initialize(name:, grade:) @name, @grade
= name, grade end end -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, review end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call case (g = @person.grade) when :S base = 160 apply_review(base) when :A base = 120 apply_review(base) when :B base = 100 apply_review(base) else raise "No such grade: '#{g}'" end end private def apply_review(base) case @review when :excellent base + 50 when :standard base when :poor base * 0.8 else raise "Nu such review: '#{@review}'" end end end -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, review end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call case (g = @person.grade) when :S base = 160 apply_review(base) when :A base = 120 apply_review(base) when :B base = 100 apply_review(base) else raise "No such grade: '#{g}'" end end private def apply_review(base) case @review when :excellent base + 50 when :standard base when :poor base * 0.8 else raise "Nu such review: '#{@review}'" end end end άϨʔυΛQFSTPOʹਘͶͯ BTL ɺ ج४ֹۚΛఆ͍ͯ͠Δ ϨϏϡʔͷఆ༰ΛਘͶͯ BTL ɺ ϘʔφεΛ૿ݮ͍ͤͯ͞Δ #POVT͕άϨʔυϨϏϡʔʹ ฉ͖·Θͬͯࣄ͍ͯ͠Δ BTL -
Grade = Struct.new(:sym, :base) GRADES = [ Grade.new(:S, 160), Grade.new(:A,
120), Grade.new(:B, 100) ].each_with_object({}){|g,h| h[g.sym] = g }.freeze class Person attr_reader :name, :grade def initialize(name:, grade:) @name, @grade = name, GRADES[grade] end end class Review class Excellent < Review def call(base) base + 50 end end class Standard < Review def call(base) base end end class Poor < Review def call(base) base * 0.8 end end def self.of(sym) @_types ||= { excellent: Excellent.new, standard: Standard.new, poor: Poor.new } @_types[sym] end def call(base); end end class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review = person, Review.of(review) end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @person.grade.base.then {|b| @review.call(b)} end end QFSTPOͷάϨʔυ͝ͱͷج४ֹۚΛɺ ϨϏϡʔ݁Ռʹͯ͠ɺϘʔφεΛࢉग़͠ ͍ͯΔ UFMM #POVTάϨʔυͱϨϏϡʔʹ ࣄΛ͓ئ͍͍ͯ͠Δ UFMM -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, Review.of(review) end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @person.grade.base.then {|b| @review.call(b)} end end QFSTPOͷάϨʔυ͝ͱͷج४ֹۚΛɺ ϨϏϡʔ݁Ռʹͯ͠ɺϘʔφεΛࢉग़͍ͯ͠Δ UFMM #POVTάϨʔυͱϨϏϡʔʹ ࣄΛ͓ئ͍͍ͯ͠Δ UFMM -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, Review.of(review) end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @review.call(@person.grade.base) end end ͪΖΜɺ͜ΕͰߏΘͳ͍ #POVTάϨʔυͱϨϏϡʔʹ ࣄΛ͓ئ͍͍ͯ͠Δ UFMM -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, Review.of(review) end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @person.grade.base.then {|b| @review.call(b)} end end lͦͷਓͷάϨʔυʹɺϨϏϡʔΛద༻ͨ݁͠Ռ͕ ϘʔφεͩΑz #POVTάϨʔυͱϨϏϡʔʹ ࣄΛ͓ئ͍͍ͯ͠Δ UFMM -
Grade = Struct.new(:sym, :base) GRADES = [ Grade.new(:S, 160), Grade.new(:A,
120), Grade.new(:B, 100) ].each_with_object({}){|g,h| h[g.sym] = g }.freeze class Person attr_reader :name, :grade def initialize(name:, grade:) @name, @grade = name, GRADES[grade] end end class Review class Excellent < Review def call(base) base + 50 end end class Standard < Review def call(base) base end end class Poor < Review def call(base) base * 0.8 end end def self.of(sym) @_types ||= { excellent: Excellent.new, standard: Standard.new, poor: Poor.new } @_types[sym] end def call(base); end end #POVTάϨʔυͱϨϏϡʔʹ ࣄΛ͓ئ͍͍ͯ͠Δ UFMM -
Grade = Struct.new(:sym, :base) GRADES = [ Grade.new(:S, 160), Grade.new(:A,
120), Grade.new(:B, 100) ].each_with_object({}){|g,h| h[g.sym] = g }.freeze class Person attr_reader :name, :grade def initialize(name:, grade:) @name, @grade = name, GRADES[grade] end end άϨʔυ͕4ZNCPM͔Βج४ۚ ֹΛ࣋ͬͨ4USVDUʹͳͬͨ -
class Review class Excellent < Review def call(base) base +
50 end end class Standard < Review def call(base) base end end class Poor < Review def call(base) base * 0.8 end end def self.of(sym) @_types ||= { excellent: Excellent.new, standard: Standard.new, poor: Poor.new } @_types[sym] end def call(base); end end class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review = person, Review.of(review) end ϨϏϡʔ4ZNCPM͔ΒৼΔ ͍Λͬͨ3FWJFXΫϥεͷΦ ϒδΣΫτʹͳͬͨ ϘʔφεΛݺͼग़͢ଆͲͷϨϏϡʔ݁Ռͳͷ͔ 4ZNCPMͰࢦఆ͢Δ ΠϯλʔϑΣΠεมΘΒͳ͍ -
… context 'komagata͞ΜͷάϨʔυB(ϕʔε100ສԁ)Ͱ' do komagata = Person.new(name:'komagata', grade: :B) context
'ධՁ͕༏ल(+50ສԁ)ͷͱ͖' do bonus = Bonus.new(komagata, review: :excellent) check = bonus.call example 'Ϙʔφε150ສԁ' do expect(check).to eq(150) … ৼΔ͍มΘΒͳ͍ͷͰɺςετίʔυมΘΒͳ͍ ʘϦϑΝΫλϦϯάʗ -
class Review class Excellent < Review def call(base) base +
50 end end class Standard < Review def call(base) base end end class Poor < Review def call(base) base * 0.8 end end def self.of(sym) @_types ||= { excellent: Excellent.new, standard: Standard.new, poor: Poor.new } @_types[sym] end def call(base); end end &YDFMMFOU 4UBOEBSE 1PPS ͱճॻ͍ͯͯɺྔͷΘΓ ʹใྔ͕গͳ͍ͷͰ ݸਓͷײͰ͢ -
Review = Struct.new(:sym, :apply) REVIEWS = [ Review.new(:excellent, ->(base){ base
+ 50}), Review.new(:standard, ->(base){ base }), Review.new(:poor, ->(base){ base * 0.8 }) ].each_with_object({}){|r,h| h[r.sym] = r }.freeze class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review = person, REVIEWS[review] end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @person.grade.base.then {|b| @review.apply.(b) } end … खଓ͖ΛΦϒδΣΫτʹͨ݁͠Ռɺσʔλ͚ͩʹͳͬͨͷͰ4USVDUͷΠϯελϯεʹͯ͠Έͨɻ ϨϏϡʔ݁Ռͷ໊લճ͔͠ग़ͯ͜ͳ͍ɻ3VCZΜΓ 3FWJFXͷ"SSBZΛ3FWJFXͷγϯϘϧΛΩʔʹͨ͠3FWJFXͷ)BTIʹͯ͋͠Δ ͔Β4ZNCPMͰ3FWJFXΛબΔɻ3VCZΜΓ -
-BXPG%FNFUFSσϝςϧͷᎄ w ͋ΔΦϒδΣΫτͷಛఆϝιου্ͰݺΜͰ͍͍ͷ wࣗ͡͠Μ wͦͷϝιουͷҾͰ͖ͬͯͨΦϒδΣΫτ wͦͷϝιου͕ࣗͰΠϯελϯεԽͨ͠ΦϒδΣΫτ wͦͷΦϒδΣΫτΛߏ͢ΔΦϒδΣΫτ https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87 ͕ࣗΒͳ͍ΦϒδΣΫτʹ͔͚͠Δͳ %PO`UUBMLUPTUSBOHFST
ͱ͍͏ᎄͩΑɻ ʮσϝςϧͷ๏ଇʯͱ͍͏ͷ͕ఆ༁͚ͩͲɺ๏ଇͱ͍͏ΑΓɺΦϒδΣΫτࢦϓϩ άϥϛϯάͷమଇͱ͍͏ײͩ͡ͱࢥ͏͔ΒɺࢲʮᎄʯͱݺͿΑ -
❯ git diff diff --git a/fjord_works.rb b/fjord_works.rb index acb07f1..62f38e1 100644
--- a/fjord_works.rb +++ b/fjord_works.rb @@ -6,11 +6,13 @@ GRADES = [ ].each_with_object({}){|g,h| h[g.sym] = g }.freeze class Person - attr_reader :name, :grade + attr_reader :name def initialize(name:, grade:) @name, @grade = name, GRADES[grade] end + + def base_salary; @grade.base end end Review = Struct.new(:sym, :apply) @@ -28,6 +30,6 @@ class Bonus # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call - @person.grade.base.then {|b| @review.apply(b)} + @person.base_salary.then {|b| @review.apply.(b)} end end -
Review = Struct.new(:sym, :apply) REVIEWS = [ Review.new(:excellent, ->(base){ base
+ 50}), Review.new(:standard, ->(base){ base }), Review.new(:poor, ->(base){ base * 0.8 }) ].each_with_object({}){|r,h| h[r.sym] = r }.freeze class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review = person, REVIEWS[review] end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call @person.base_salary.then {|b| @review.apply.(b) } end … ਓؒͷج४ֹۚʹϨϏϡʔ݁ՌΛద༻ͨ͠ͷ͕Ϙʔφε -
class Bonus attr_reader :person, :review def initialize(person, review:) @person, @review
= person, review end # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞ def call case (g = @person.grade) when :S base = 160 apply_review(base) when :A base = 120 apply_review(base) when :B base = 100 apply_review(base) else raise "No such grade: '#{g}'" end end private def apply_review(base) case @review when :excellent base + 50 when :standard base when :poor base * 0.8 else raise "Nu such review: '#{@review}'" end end end #POVT͕άϨʔυϨϏϡʔʹ ฉ͖·Θͬͯࣄ͍ͯ͠Δ BTL -
lιϑτΣΞ։ൃνʔϜεϙʔπͰ͋Δ wݠڏ )VMJMJUZ ੈքͷத৺܅Ͱͳ͍ɻ܅શશೳͰͳ͍͠ɺઈରʹਖ਼͍͠Θ͚Ͱͳ͍ɻৗʹࣗΛ վળ͍ͯ͜͠͏ɻ wଚܟ 3FTQFDU Ұॹʹಇ͘ਓͷ͜ͱΛ৺͔Βࢥ͍Ζ͏ɻ૬खΛਓͷਓؒͱͯ͠ѻ͍ɺͦͷೳྗޭΛߴ
͘ධՁ͠Α͏ɻ w৴པ 5SVTU ࣗҎ֎ͷਓ༗ೳͰ͋Γɺਖ਼͍͜͠ͱΛ͢Δͱ৴͡Α͏ɻͦ͏͢ΕɺࣄΛ ͤΔ͜ͱ͕Ͱ͖Δɻ -
w͍·ͷؾ࣋ͪ ײ ͋ͳ͕ͨॻ͔ͳ͚Ε୭ʹΘΒͳ͍ɻl૬खʹΘΔΑ͏ʹzςΩετͰॻ͘ʹ܇࿅͕ඞཁͩɻ wͬͨ͜ͱ ࣄ࣮ ࠓҰ͕Μͬͨৄ͘͠ॻ͖͍ͨͩΖ͏͚ͲɺΈΜͳৄࡉΛಡΈ͍͔ͨͳ wΘ͔ͬͨ͜ͱ
ҙݟ ղऍ ͪΖΜɺײҎ֎దʹΘΔΑ͏ʹςΩετग़ྗ͢Δʹ܇࿅ɺ܇࿅ɺ܇࿅ɻ w࣍ʹΔ͜ͱ ܭը ද໌ ߟ͑Δ͜ͱେࣄ͚ͩΕͲɺ໌ͷࣗͷஔ͖खࢴ ໌ͷࣗʹదʹΘΔΑ͏ʹॻ͚Δ͔ͳ wγϟτΞτ ײँ νʔϜʹײँɻؒʹײँɻΑ͍ৼΔ͍ɺॿ͔ͬͨ͜ͱΛϑΟʔυόοΫͯ͠૿͑ͨΒ͏Ε͘͠ͳ͍ lใzͲ͜ʹྗΛೖΕͯॻ͘ͷ͕Α͍͔ -
͜Ε͔Βl*5ۀքzͰಇ͘͜ͱʹͳΔͷͳΒɺձ ࣾ๏ਓΑΓࣗͷΩϟϦΞͷ΄͏͕ण໋͕ ͍ ͔͠Εͳ͍ ͜ͱΛ಄ͷย۱ʹஔ͍͓͍ͯ ͯ΄͍͠ɻਓձࣾΛࣙΊΔ͕ɺ༷͟·ͳί ϛϡχςΟΛ௨ͯ͡ަྲྀ͕ଓ͘ ܧଓతɾஅଓ త ͜ͱ͋Δɻ৫ͱݸਓ͚ͯߟ͑ΒΕ
ΔΑ͏ʹͳΔͱΑ͍Ͱ͢Ͷɻ৫ͷঢ়گ͕ݸਓ ͷৼΔ͍ΛܾΊΔ͜ͱ͋Δ͔Βɺͳ͔ͳ͔ Ή͔͍ͣ͜͠ͱଟ͍Ͱ͚͢ΕͲɻ -
օ͞Μ͕͍ͬͯΔιϑτΣΞ ϋʔυΣΞ Πϯλʔωοτʮ୭͔ʯ͕աڈʹ࡞ͬͨͷ Ͱ͋Γɺదʹಈ࡞͠ଓ͚ΔΑ͏ʹʮ୭͔ʯ͕ҡ ͍࣋ͯ͠Δɻ͍·͍ͬͯΔύιίϯεϚϗͷ ը໘ͷ͜͏ʹ͍Δͷਓؒͩɻ͋ͳͨͷੜΈग़ ͨ͠ίʔυ ςΩετ ը૾
Ի ө૾σʔλ͜Ε ͔Βͷʮ୭͔ʯ͕৮ΕΔ͔͠Εͳ͍ɻ৮Εͳ͍ ͔͠Εͳ͍ɻͦͷʮ୭͔ʯ͔ࣗ͠Εͳ͍ ࠓޙCPUΞϧΰϦζϜ͔͠Εͳ͍͚Ͳʜ ɻ -
w͍·ͷؾ࣋ͪ ײ ͋ͳ͕ͨॻ͔ͳ͚Ε୭ʹΘΒͳ͍ɻl૬खʹΘΔΑ͏ʹzςΩετͰॻ͘ʹ܇࿅͕ඞཁͩɻ wͬͨ͜ͱ ࣄ࣮ ࠓҰ͕Μͬͨৄ͘͠ॻ͖͍ͨͩΖ͏͚ͲɺΈΜͳৄࡉΛಡΈ͍͔ͨͳ wΘ͔ͬͨ͜ͱ
ҙݟ ղऍ ͪΖΜɺײҎ֎దʹΘΔΑ͏ʹςΩετग़ྗ͢Δʹ܇࿅ɺ܇࿅ɺ܇࿅ɻ w࣍ʹΔ͜ͱ ܭը ද໌ ߟ͑Δ͜ͱେࣄ͚ͩΕͲɺ໌ͷࣗͷஔ͖खࢴ ໌ͷࣗʹదʹΘΔΑ͏ʹॻ͚Δ͔ͳ wγϟτΞτ ײँ νʔϜʹײँɻؒʹײँɻΑ͍ৼΔ͍ɺॿ͔ͬͨ͜ͱΛϑΟʔυόοΫͯ͠૿͑ͨΒ͏Ε͘͠ͳ͍ lใzͲ͜ʹྗΛೖΕͯॻ͘ͷ͕Α͍͔