書き換えてみる 書き換えてみる 書き換えてみる 書き換えてみる 書き換えてみる 書き換えてみる 例えば、0 チェックやタイプチェックをしてあげる? 例えば、0 チェックやタイプチェックをしてあげる? 例えば、0 チェックやタイプチェックをしてあげる? 例えば、0 チェックやタイプチェックをしてあげる? 例えば、0 チェックやタイプチェックをしてあげる? 例えば、0 チェックやタイプチェックをしてあげる? def def div a div a, , b b return return false false if if b b == == 0 0 return return false false unless unless [ [a a, , b b] ]. .all all? ?{ {| |v v| | v v. .is_a is_a? ? Numeric Numeric } } a a / / b b end end div div 10 10, , 0 0 #=> false #=> false div div '10' '10', , 3 3 #=> false #=> false 7 / 22
例えば、数値以外の値が入った時、よしなに変換をしてあげる? 例えば、数値以外の値が入った時、よしなに変換をしてあげる? 例えば、数値以外の値が入った時、よしなに変換をしてあげる? 例えば、数値以外の値が入った時、よしなに変換をしてあげる? 例えば、数値以外の値が入った時、よしなに変換をしてあげる? 例えば、数値以外の値が入った時、よしなに変換をしてあげる? def def div a div a, , b b a a, , b b = = [ [a a, , b b] ]. .map map( (& &method method( (:Float :Float) )) ) a a / / b b rescue rescue false false end end div div '10' '10', , 3 3 #=> 3.3333333333333335 #=> 3.3333333333333335 8 / 22
例えば、返す値の精度や丸めを調整してあげる? 例えば、返す値の精度や丸めを調整してあげる? 例えば、返す値の精度や丸めを調整してあげる? 例えば、返す値の精度や丸めを調整してあげる? 例えば、返す値の精度や丸めを調整してあげる? 例えば、返す値の精度や丸めを調整してあげる? def def div a div a, , b b a a, , b b = = [ [a a, , b b] ]. .map map( (& &method method( (:Float :Float) )) ) ( (a a / / b b) ). .round round( (3 3) ) end end div div 10 10, , 3 3 #=> 3.333 #=> 3.333 9 / 22
まとめてみる まとめてみる まとめてみる まとめてみる まとめてみる まとめてみる def def div a div a, , b b a a, , b b = = [ [a a, , b b] ]. .map map( (& &method method( (:Float :Float) )) ) return return false false if if b b == == 0 0 return return false false unless unless [ [a a, , b b] ]. .all all? ?{ {| |v v| | v v. .is_a is_a? ? Numeric Numeric } } ( (a a / / b b) ). .round round( (3 3) ) rescue rescue false false end end 10 / 22
くらべてみる くらべてみる くらべてみる くらべてみる くらべてみる くらべてみる def def div a div a, , b b a a / / b b end end def def div a div a, , b b a a, , b b = = [ [a a, , b b] ]. .map map( (& &method method( (:Float :Float) )) ) return return false false if if b b == == 0 0 return return false false unless unless [ [a a, , b b] ]. .all all? ?{ {| |v v| | v v. .is_a is_a? ? Numeric Numeric } } ( (a a / / b b) ). .round round( (3 3) ) rescue rescue false false end end 11 / 22
契約による設計 契約による設計 契約による設計 契約による設計 契約による設計 契約による設計 {P} A {Q} {P} A {Q} {P} A {Q} {P} A {Q} {P} A {Q} {P} A {Q} 任意の A の実行は、P の状態になったときに始まり、 任意の A の実行は、P の状態になったときに始まり、 任意の A の実行は、P の状態になったときに始まり、 任意の A の実行は、P の状態になったときに始まり、 任意の A の実行は、P の状態になったときに始まり、 任意の A の実行は、P の状態になったときに始まり、 Q の状態になったときに終了する。 Q の状態になったときに終了する。 Q の状態になったときに終了する。 Q の状態になったときに終了する。 Q の状態になったときに終了する。 Q の状態になったときに終了する。 by バートランド・メイヤー さん by バートランド・メイヤー さん by バートランド・メイヤー さん by バートランド・メイヤー さん by バートランド・メイヤー さん by バートランド・メイヤー さん 15 / 22
require require 'contracts' 'contracts' class class Example Example include include Contracts Contracts: :: :Core Core include include Contracts Contracts: :: :Builtin Builtin Contract Contract Num Num = => > Num Num def def double double( (x x) ) x x * * 2 2 end end end end puts puts Example Example. .new new. .double double( ("oops" "oops") ) 19 / 22
ParamContractError ParamContractError: : Contract Contract violation violation for for argument argument 1 1 of of 1 1: : Expected Expected: : Num Num, , Actual Actual: : "oops" "oops" Value Value guarded guarded in in: : Example Example: :: :double double With With Contract Contract: : Num Num = => > Num Num At At: : ( (pry pry) ): :7 7 20 / 22