Search code examples
c#design-patternsrefactoring

Refactor help c#


I have several hundred lines of code like this:

if (c.SomeValue == null || c.SomeProperty.Status != 'Y')
{
    btnRecordCall.Enabled = false;
}

if (c.SomeValue == null || (c.SomeProperty.Status != 'Y' &&
    c.SomeOtherPropertyAction != 'Y'))
{
    btnAddAction.Enabled = false;
}

if (c.SomeValue == null || c.SomeProperty.Processing != 'Y')
{
    btnProcesss.Enabled = false;
}

How can I refactor this correctly? I see that the check 'c.SomeValue == null' is being called every time, but it is included with other criteria. How can I possibly eliminate this duplicate code?


Solution

  • If you don't want to do much refactoring, you can easily pull the null check out.

    if (c.SomeValue == null)
    {
        btnRecordCall.Enabled = false;
        btnAddAction.Enabled = false;
        btnProcesss.Enabled = false;
    }
    else
    {
        if(c.SomeProperty.Status != 'Y')
        {
            btnRecordCall.Enabled = false;
        }
    
        if((c.SomeProperty.Status != 'Y') &&
           (c.SomeOtherPropertyAction != 'Y'))
        {
            btnAddAction.Enabled = false;
        }
    
        if(c.SomeProperty.Processing != 'Y')
        {
            btnProcesss.Enabled = false;
        }
    }
    

    If you're looking to refactor instead of shuffle, the wall of boolean testing could be moved in to methods/extension methods of whatever class your object c is an instance of - that way you could say

    btnRecordCall.Enabled = c.IsRecordCallAllowed();