I first saw this gigantic if and tried to refactor it. Could only end with a endless switch statement.
Old code -
# It is a Cause
if @causality == "C"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@notice = 'New cause linked Successfully'
end
# It is an Inhibitor
if @causality == "I"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'I'
@notice = 'New reducing issue linked Successfully'
end
# It is a Superset
if @causality == "P"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'H'
@notice = 'New superset linked Successfully'
end
# It is an Effect
if @causality == "E"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@notice = 'New effect linked Successfully'
end
# It is an Inhibited
if @causality == "R"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@relationship.relationship_type = 'I'
@notice = 'New reduced issue linked Successfully'
end
# It is a Subset
if @causality == "S"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@relationship.relationship_type = 'H'
@notice = 'New subset linked Successfully'
end
That's in one side of the if, in the 'else' side a similar piece of code goes like this
# Populate User_Id if relationship was created by a logged in User
if @issue.user_id.to_s != ""
@relationship.user_id = @issue.user_id
end
# It is a Cause
if @causality == "C"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@notice = 'New Issue was created and linked as a cause'
end
# It is an Inhibitor
if @causality == "I"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'I'
@notice = 'New Issue was created and linked as reducer'
end
# It is a Superset
if @causality == "P"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'H'
@notice = 'New Issue was created and linked as a superset'
end
# It is an Effect
if @causality == "E"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@notice = 'New Issue was created and linked as an effect'
end
# It is an Inhibited
if @causality == "R"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@relationship.relationship_type = 'I'
@notice = 'New Issue was created and linked as reduced'
end
# It is a Subset
if @causality == "S"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@relationship.relationship_type = 'H'
@notice = 'New Issue was created and linked as a subset'
end
New code -
def set_type_of_relationship(already_exists)
if !already_exists
case @causality
when "C"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@notice = 'New Issue was created and linked as a cause'
when "I"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'I'
@notice = 'New Issue was created and linked as reducer'
when "P"
@relationship.cause_id = @issue.id
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'H'
@notice = 'New Issue was created and linked as a superset'
when "E"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@notice = 'New Issue was created and linked as an effect'
when "R"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@relationship.relationship_type = 'I'
@notice = 'New Issue was created and linked as reduced'
when "S"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id
@relationship.relationship_type = 'H'
@notice = 'New Issue was created and linked as a subset'
else
@notice = 'Error creating and linking issue'
end
else #if already_exists
case @causality
when "C"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@notice = 'New cause linked Successfully'
when "I"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'I'
@notice = 'New reducing issue linked Successfully'
when "P"
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
@relationship.relationship_type = 'H'
@notice = 'New superset linked Successfully'
when "E"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@notice = 'New effect linked Successfully'
when "R"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@relationship.relationship_type = 'I'
@notice = 'New reduced issue linked Successfully'
when "S"
@relationship.cause_id = @causality_id
@relationship.issue_id = @issueid
@relationship.relationship_type = 'H'
@notice = 'New subset linked Successfully'
else
@notice = 'Error creating and linking issue'
end
end
end
This endless switch (case) statement drove me a little bit crazy but I found no way of translating the enormous list of ifs to anything easier to debug and more importantly, with less duplication. I chose to extract everything into two switch mainly because switches are implemented with an indexed branch table in Ruby – i.e its quite faster. Take a close look at this one and help me to refactor it!
Caution: Pay attention at the differences between
@relationship.cause_id = @issueid
@relationship.issue_id = @causality_id
and
@relationship.cause_id = @causality_id
@relationship.issue_id = @issue.id