I consider these two options exactly the same. I prefer the first one but I'm not sure if it's better than the second option in terms of cyclomatic complexity or readability.
Assuming that this is not pure Ruby and I can call to the try
method.
existing_transaction = database.find_transaction_by_id(transaction.id)
database.create_transaction(transaction) unless existing_transaction
database.update_transaction(transaction) unless existing_transaction.try(:processed)
existing_transaction = database.find_transaction_by_id(transaction.id)
if existing_transaction
unless existing_transaction.processed
database.update_transaction(transaction)
end
else
database.create_transaction(transaction)
end
2 Answers 2
It's obviously subjective, but IMHO inline conditionals make code harder to understand, indentation is very important. So I'd definitely take the second approach, but writing it differently to use only one indentation level:
existing_transaction = database.find_transaction_by_id(transaction.id)
if !existing_transaction
database.create_transaction(transaction)
elsif !existing_transaction.processed
database.update_transaction(transaction)
end
I would actually take a mixed approach:
if existing_transaction
database.update_transaction(transaction) unless existing_transaction.processed
else
database.create_transaction(transaction)
end
This way the code is more readable than the first option, but more succinct than the second option.
-
\$\begingroup\$ This is exactly my solution wrote with
unless
inlined. \$\endgroup\$Arturo Herrero– Arturo Herrero2014年03月15日 19:57:39 +00:00Commented Mar 15, 2014 at 19:57 -
\$\begingroup\$ Yes, it is - it just reads better IMHO \$\endgroup\$Uri Agassi– Uri Agassi2014年03月15日 20:18:52 +00:00Commented Mar 15, 2014 at 20:18
Explore related questions
See similar questions with these tags.