私はこの種のもののための動的なメソッド呼び出しを使用したい:ここでは前の回答です
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 $ /'のようにアンカーしたいとします。大文字小文字を区別しないようにすることもできます。 –