- 入力フォーマット
- 登録処理の中でのデータモデル
- 出力フォーマット
が分離していて、それがコード上の構造で表現されているのがよいと思います。 分離すると、どこかで結合しないといけないのでマッピングが発生します。 そこは互いのインターフェイスをどう解釈するかという表現なので明示的になっているほうがよいと思います。
が分離していて、それがコード上の構造で表現されているのがよいと思います。 分離すると、どこかで結合しないといけないのでマッピングが発生します。 そこは互いのインターフェイスをどう解釈するかという表現なので明示的になっているほうがよいと思います。
たとえば、subject でこのように書けて、
subject { model.errors }
it { is_expected.to be > 0 }
これを DRY にしたくて
class Injectee | |
def hello | |
puts :hello | |
end | |
end | |
module DI | |
class Injector | |
def initialize(module_object) | |
@module = module_object |
## | |
# 知りたかったこと | |
def foo(a: 1, b: 2, c: 3, d: 4) | |
p a, b, c, d | |
end | |
# 1. bar の引数定義を a~d のキーワード引数として foo へすべて委譲したい | |
# 2. bar の引数定義を a~d のキーワード引数とさらに e: 5 を追加したい | |
def bar( ??? ) |
class Foo | |
extend Ruby::Spock | |
spec 'maximum of two numbers', ->(*) { | |
expect { | |
assert { [a, b].max == c } | |
} | |
where [ | |
[ :a, :b, :c ], | |
[ 1, 3, 3 ], #=> . |
def e &blk | |
s = Struct.new(:a,:b,:c).new(1,2,3) | |
s.instance_eval(&blk) | |
end | |
def foo | |
e { a + b + c } | |
end | |
puts foo #=> 6 |
class Foo | |
extend Ruby::Spock | |
spec 'maximum of two numbers', ->(*) { | |
expect ->(a, b, c) { [a, b].max == c } | |
where [ | |
# a | b | c | |
[ 1 , 3 , 3 ], | |
[ 7 , 4 , 4 ], | |
[ 0 , 0 , 0 ], |
module Ruby | |
module Spock | |
def spec(description, definition = nil, &proc_definition) | |
raise ArgumentError if [ definition, proc_definition ].all? {|d| d.nil? } | |
if definition.nil? | |
spec_runner(description, proc_definition) | |
else | |
spec_runner(description, definition) | |
end | |
end |
Ruby+Rails を始めるのにこの辺をおさえておくといいのでは。 というのを書いていきます。
Ruby
制約フレームワークを書かないと連載させてもらえない Web 雑誌があるようなので、昨日こんなの書いてた。
静的解析もできないし、ドキュメンテーションにも活きないので各方面の識者から怒られそうだが {}
で書けるという見た目の点で許してほしい。
あとはつっこまれるとしたら、継承したときに事前条件、事後条件が強化される/緩和されるのあたり。全部やると大変なんすよ。invariant もないですね (method_added でイベントフックしてすべてのメソッドコールへ prepend かぶせるとかすればできるかな)。
class BeerLover
extend Contracts
attr_accessor :age