我喜歡用動態的方法調用這種事情:
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 $ /'錨定你的正則表達式的開始和結束。使其不區分大小寫也是有意義的。 –