市田です。

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)