[ruby-list:50441] Re: [質問] インスタンスメッソド hookについて
From:
Toshihiko Ichida <dogatana@...>
Date:
2016-10-25 12:21:40 UTC
List:
ruby-list #50441
市田です。
On 2016/10/25 14:04, yamataka@u08.itscom.net wrote:
> if !@is_in_nw then … return nil end を実行している method が多数でてきた
> ので、
> 該当部分を、hook を用いて記述すれば、綺麗なコードになるなと思い、Web等で
共通の処理をくくりだすというのであれば、共通部分を別メソッドとして定義
して、対象となるメソッドの先頭で呼び出すというのはどうでしょうか。
チェックしているのを明らかにしたい、チェック処理に色々バリエーションが
ある場合は「チェック付きインスタンスメソッドを定義するクラスメソッド」
を定義する方法もありかと。
「何が綺麗か」「どれだけ綺麗にしたいか」によるのでしょうね。
以下少し長いですが、WebAPI#register が前者の例、
WebAPI.def_method_with_check が後者の例のつもりです。
check メソッドの指定方法はもっと良い方法があると思いますが。。
class WebAPI
attr_reader :is_in_nw
def initialize(ip, is_in_nw = false)
@ip = ip
@is_in_nw = is_in_nw
end
def check_ip
return true if @is_in_nw
puts "TV(#{@ip}) is not in Network"
false
end
def register(code)
return nil unless check_ip
puts "register #{code}"
end
def self.def_method_with_check(name, check, &block)
define_method name do |*args|
return nil unless self.__send__(check)
block.call(*args)
end
end
def_method_with_check(:getInformation, :check_ip) do
puts 'getInformation'
end
def_method_with_check(:play, :check_ip) do |function|
puts "play #{function}"
end
end
puts WebAPI.methods(false)
obj = WebAPI.new('192.168.250.1', false)
obj.getInformation
obj.play('track 1')
obj.register(1)
obj2 = WebAPI.new('192.168.250.2', true)
obj2.getInformation
obj2.play('track 2')
obj2.register(2)