[ruby-list:50457] Re: [質問] classから作成したインスタンスから作成元のclassのインスタンス変数を参照するには
From:
Toshihiko Ichida <dogatana@...>
Date:
2016-11-07 13:35:45 UTC
List:
ruby-list #50457
市田です。 質問の意図を正しく把握できているか不安ですが。 On 2016/11/07 15:54, yamataka@u08.itscom.net wrote: > class NetWorkAudioDevice > > attr_reader :is_in_nw > > def initialize(device,is_in_nw) > @is_in_nw = is_in_nw > ... > @webapi = WebAPI.new(@ip,api_port,@is_in_nw) > @render = Rendering.new(device.service,@is_in_nw) > @avtransport = AVTransport.new(device.service,@is_in_nw) > end > end > > 各WebAPI,Rendering,AVTransportをインスタンス作成する際に、@is_in_nwを渡 > し、 > それぞれの関数内で、判別するしかないのかでしょうか? > > NetWorkAudioDevice class内から、それぞれWebAPI,Rendering,AVTransportのイ > ンスタンスを作成しているので、 > インスタンス作成時に、@is_in_nwを渡さなくても、参照できるんいい方法があ > るんじゃないか? Renderのインスタンスから何かの方法で参照できたとして、その情報を元に SetMute(これは set_mute が良いかと)のふるまいを変えるなら > それぞれの関数内で、判別するしかないのかでしょうか? となってしまうのではと思います。 2つのインスタンスは独立したオブジェクトなので、作成されたインスタンス側 で判定するのであれば、判定できるよう、何らか参照できる手段を提供する必要 があり、思いつくのは 1. @is_in_nw を渡す(書かれている方法) 2. self を渡す 3. @is_in_nw を判定できるクロージャを渡す くらいです。 もっとも渡さなくても、render メソッドを単なるアクセッサメソッドとせずに @is_in_nw が false の場合は、render メソッドが false を返すとか、例外と する手もあります。これだとDeviceクラス側の処理で済みます。 ただこう考えてくると - @is_in_nw が false の場合でも Render などのインスタンスを作成する意味 があるか - 作成したとして、その場合に呼びされたインスタンスメソッドは @is_in_nw の値に従ってどう振る舞うのが良いか - @is_in_nw は動的に変わるのか、それともDeviceインスタンス生成時に指定し た以降変化するのか など、クラスにどのような役割をもたせるのかなど、クラス設計の話になるので はと思います。