2
一旦我有一个File
实例,我想检查是否它的文件格式和extend
该实例与相应的方法一致:红宝石:文件格式通过模块扩展文件处理
module MP3
def self.extended(base)
raise "Can only extend a File" unless base.is_a?(File)
raise "Incorrect file format" unless is_mp3?(base)
end
def self.is_mp3?(file)
# Full metadata check if it is a MP3 format
end
def year
# Extract year from metadata
end
end
song = File.new("song.mp3")
if MP3.is_mp3?(song)
song.extend(MP3)
puts song.ctime # Original File method
puts song.year # Extended MP3 method
end
picture = File.new("picture.jpg")
MP3.is_mp3?(picture) #=> False
picture.extend(MP3) #=> raise "Incorrect file format"
我猜是不是传统的,但我的需求是:
- 能够处理多种文件格式。
- 在知道其格式之前打开文件。
- 重新使用相同的
File
实例,而不必创建新对象。 (见下文) - 在同一个对象中同时使用原始的
File
方法和格式特定的方法。 - 添加相应方法前检查文件格式是否正确。
该方法是否正确?
这个问题是后续的previous question。
我想延长的,而不是因为我使用File
的包装,保存在RAM中的整个文件中创建一个新的实例现有File
实例(从磁带驱动器不允许顺序访问读取)。
正如我所说,在我的情况下,文件是打开之前,我不想创建一个新的实例。这就是为什么我正在考虑扩展实例,而不是课堂。基本上,这是因为我需要传递比'filename'更多的东西,使用大量内存。所以这种直接从'filename'创建实例的方法对我不起作用。 – Victor
@Victor关键是将所有的逻辑放到工厂类中。我重新激活了工厂来证明这一点。 – Schwern
@Victor让工厂方法的班级为您开放。你是什么意思“更多的记忆”?任意扩展对象比使用特定子类的库存类实例在性能方面更受惩罚。 – tadman