我喜欢对这类事情使用动态方法调用:
def Function1(input)
prefix = filename[0].downcase
handler = "import_#{preview}_file"
handler = 'import_unknown_file' if !respond_to?(handler)
send(handler, input)
end
def import_a_file(input); end
def import_b_file(input); end
def import_unknown_file(input); end
您可以更进一步,使其更具可读性:
HANDLERS_FOR_PREFIXES = {
'a' => :import_account_file,
'b' => :import_balance_file,
'default' => :import_other_file
}
def Function1(input)
prefix = filename[0].downcase
handler = HANDLERS_FOR_PREFIXES[prefix] || HANDLERS_FOR_PREFIXES['default']
send(handler, input)
end
def import_account_file(input); end
但是,我怀疑您处理文件的顺序可能很重要(如果您要导入银行信息,则需要先导入账户,然后再将交易导入账户)。所以这样做可能是有意义的:
FILE_HANDLERS = {
'A*.txt' => :import_account_file,
'T*.txt' => :import_transaction_file
}
def Function1(input)
FILE_HANDLERS.each do |file_pattern, handler|
Dir.glob(file_pattern).each do |filename|
File.open(filename) do |f|
f.each_line do |line|
parsed_line = parse(parse)
send(handler, parsed_line);
end
end
end
end
end
虽然我会重构它以删除深层嵌套。
最后,随着您的代码变得越来越复杂,您可能希望将其分解为单独的类来处理每种类型的文件。这为您提供了很多重用和分解代码的机会。例如:
class AccountImporter < Importer
def initialize(input); end
def process
end
HANDLERS_FOR_PREFIXES = {
'a' => AccountImporter,
...
}
def Function1(input)
prefix = filename[0].downcase
handler = HANDLERS_FOR_PREFIXES[prefix] || HANDLERS_FOR_PREFIXES['default']
handler.new(input).process
end