You have two methods that contain nearly identical code. The variance is in the middle of the method.
Extract the duplication into a method that accepts a block and yields back to the caller to execute the unique code.
def charge(amount, credit_card_number)
begin
connection = CreditCardServer.connect(...)
connection.send(amount, credit_card_number)
rescue IOError => e
Logger.log "Could not submit order #{@order_number} to the server: #{e}"
return nil
ensure
connection.close
end
end
def charge(amount, credit_card_number)
connect do |connection|
connection.send(amount, credit_card_number)
end
end
def connect
begin
connection = CreditCardServer.connect(...)
yield connection
rescue IOError => e
Logger.log "Could not submit order #{@order_number} to the server: #{e}"
return nil
ensure
connection.close
end
end