読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

Ruby 動的メソッド

前回の続き。
今回は重複するクラスの中のメソッドをリファクタリングしてみよう。
こんなクラスがあったとする。


1 class Hoge
2 def hoge1
3 p "hoge1 was called..."
4 p "Whohooo!"
5 end
6
7 def hoge2
8 p "hoge2 was called..."
9 p "Whohooo!"
10 end
11
12 def hoge3
13 p "hoge3 was called..."
14 p "Whohooo!"
15 end
16 end
17
18 hoge = Hoge.new
19
20 hoge.public_methods.delete_if{|method_name| method_name !~ /hoge/}.each do |method|
21 hoge.send(method)
22 end

  • >

1 "hoge1 was called..."
2 "Whohooo!"
3 "hoge2 was called..."
4 "Whohooo!"
5 "hoge3 was called..."
6 "Whohooo!"

意外と同じクラスの中のメソッドって同じようなことをやる場合が多いですよね。そんな時はdefine_methodを使ってコードの重複を消してみましょう!


26 class Hoge2
27 def self.define_component(name)
28 define_method(name){
29 p "#{name} was called..."
30 p "Whohooo!"
31 }
32 end
33 (1..3).each do|a|
34 define_component "hoge#{a}"
35 end
36 end

38 hoge2 = Hoge2.new
39 hoge2.public_methods.delete_if{|method_name| method_name !~ /hoge/}.each do |method|
40 hoge2.send(method)
41 end

  • >

8 "hoge1 was called..."
9 "Whohooo!"
10 "hoge2 was called..."
11 "Whohooo!"
12 "hoge3 was called..."
13 "Whohooo!"

どうですか?スッキリしたでしょう。
是非業務の中でこういうリファクタリングをやってみたいところです。
早くそんなシチュエーションこないかなー!