我喜欢用动态的方法调用这种事情:
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
一个警告。你的第一个正则表达式将匹配文件名'BA001.txt',这可能不是你想要的。它也会匹配'A001.txt2'。你想像这样'/^A。+ \。txt $ /'锚定你的正则表达式的开始和结束。使其不区分大小写也是有意义的。 –