[ruby-list:50440] Re: [質問] インスタンスメッソド hookについて
From:
Masahiro Utsumi <utsumi@...>
Date:
2016-10-25 08:44:23 UTC
List:
ruby-list #50440
内海@ベルギーです
TVが見つからないことをエラーとしてトラップするのは
どうでしょうか。
class TvNotFound < StandardError
end
class WebAPI
def play
raise TvNotFound "Error message" unless @is_in_tw
:
:
end
end
tv_obj = WebApi.new(ip, flag)
begin
tv_obj.getInformation
tv_obj.register(code)
tv_obj.play('tuner')
rescue TvNotFound
#
end
On 2016/10/25 7:04, yamataka@u08.itscom.net wrote:
> 山口と申します。
>
> インスタンスメッソド hookについて、質問させて下さい。
>
> 下記のclassのインスタンスメッソド内で、
> if !@is_in_nw then … return nil end を実行している method が多数でてきた
> ので、
> 該当部分を、hook を用いて記述すれば、綺麗なコードになるなと思い、Web等で
> 色々調べたのですが、
> これといった方法が見当たらず、良い記述方法があれば、ご教示いただけますで
> しょうか?
>
> if !@is_in_nw the … が無いmethodや、他のクラス(別ファイルで定義)にも似た
> ような箇所があるので、
> それらを考慮し、クラス内にて記述できればと思っています。
>
> http://stackoverflow.com/questions/3236194/defining-method-called-how-do-i-make-a-hook-method-which-gets-called-every-t
>
> に記載されていた
> set_trace_func proc { |event, file, line, id, binding, classname|
> # only interested in events of type 'call' (Ruby method calls)
> # see the docs for set_trace_func for other supported event types
> puts "#{classname} #{id} called" if event == 'call'
> }
> だと、claass name id event で、case等を用いて記述するのがいいのかな…とは
> 思いつつ
> や
> エイリアスチェイニング http://blog.kymmt.com/entry/hook-by-alias-chaining-in-ruby
>
> だと、多数のmethodがあるので、method内で記述した方がよいし…
> と悩んでおります。
>
> class WebAPI
>
> attr_reader: is_in_nw
>
> def initialize(ip,is_in_nw=false)
> @ip = ip
> @is_in_nw = is_in_nw
> ….
> end
>
> def getInformation
> if !@is_in_nw then
> puts "TV(#{@ip}) is not in Network"
> return nil
> end
> ….
> end
>
> def Register(code)
> if !@is_in_nw then
> puts "TV(#{@ip}) is not in Network"
> return nil
> end
> ….
> end
>
> def Play(function)
> if !@is_in_nw then
> puts "TV(#{@ip}) is not in Network"
> return nil
> end
> …
> # network上に存在しない場合、
> # 以降のコードを実行すると、使用しているgem が raise を上げるのでスクリ
> プトが終了してしまう
> end
>
> …
>
> # 上の様な if !@is_in_nw then … return nil end
> # を実行している method が多数あるので
> # 該当部分を hook を用いて記述したい
> # 中には、if !@is_in_nw the … が無い場合も考慮
>
> end
>
> TV_IP=’192.168.0.11’
>
> # TV_IPを持つ機器がネットワーク上にいるか確認
>
> if TVがネットワーク上に存在 then
> is_in_nw = true
> else
> is_in_nw = false
> end
>
> # tv_obj 作成
> tv_obj = WebAPI.new(TV_IP,is_in_nw)
> tv_obj.Play(“tuner”)
>
>
>