1

私がこのようなモデルを持っている場合:

class Media
  attr_reader :title, :created_at
end

class Video < Media
end

class Picture < Media
  attr_reader :image_url
end

したがって、Pictureクラスには、スーパークラスに存在してはならない属性が1つあります。すべてのメディアを取得したい場合、通常、人々は何をしますか?メソッドに例外をスローしますimage_urlか?または、どのように改造しますか?

4

1 に答える 1

2

すべてのメディアに興味がある場合は、それがビデオであるか写真であるかを気にする必要はありません。つまり、のコレクションを受け入れるメソッドは、子孫Mediaからメソッドを呼び出さないでください。Mediaすべての写真が必要な場合は、で作業しPicture、過度に一般化しないでください。

タイプを区別しながらすべてのメディアを処理する必要がある場合は、タイプを分岐できます。

def process_media media
  media.each do |m|
    if m.is_a? Picture
      # work with picture
    elsif m.is_a? Video
      # work with video
    end
  end
end

別の方法は、ダックタイピングを使用することです。つまり、メソッドがある場合、それはimage_urlある種の画像である必要があります。

def process_media media
  media.each do |m|
    if m.respond_to? :image_url
      # work with picture
    elsif m.respond_to? :bitrate
      # work with video
    end
  end
end
于 2012-04-22T16:14:28.737 に答える