Search code examples
javasonarqubecyclomatic-complexity

Reducing the cyclomatic complexity, multiple if statements


I have the following code:

private Facility updateFacility(Facility newFacility, Facility oldFacility) {
    if (newFacility.getCity() != null)
        oldFacility.setCity(newFacility.getCity());
    if (newFacility.getContactEmail() != null) 
        oldFacility.setContactEmail(newFacility.getContactEmail());
    if (newFacility.getContactFax() != null) 
        oldFacility.setContactFax(newFacility.getContactFax());
    if (newFacility.getContactName() != null) 
        oldFacility.setContactName(newFacility.getContactName());
    // ......
}

There are around 14 such checks and assignments. That is, except for a few, I need to modify all the fields of the oldFacility object. I'm getting a cyclomatic complexity of this code 14, which is "greater than 10 authorized" as per SonarQube. Any ideas upon how to reduce the cyclomatic complexity?


Solution

  • At some point in your program, you will have to implement the logic:

    • If the new facility has a property defined, update the old facility accordingly
    • If not, do not override the previous value from the old facility.

    Without having a global look at your project, what you can do is to move that logic inside the setters of each property:

    public class Facility {
    
        public void setSomething(String something) {
            if (something != null) {
                this.something = something;
            }
        }
    
    }
    

    This way, your update method would simply be:

    private Facility updateFacility(Facility newFacility, Facility oldFacility) {
        oldFacility.setSomething(newFacility.getSomething());
        // etc for the rest
    }