内海@ベルギーです

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”)
>
>
>