Search code examples
c#design-patternsrefactoring

How can I refactor the mass if-else statement?


How can I refactor the mass if-else statement?? I have lots of big if-else statements in my app, do I need to refactor all this code or just leave it alone?

if (up > 80 && up < 140)
{
    if (distance)
    {
        go.transform.position = go2.transform.position;
    }
    go.transform.Translate(y, 0, x);
}
else
{
    if (down > 140)
    {
        if (distance)
        {
            go.transform.position = go2.transform.position;
        }
        go.transform.Translate(0, -y, x);
    }
    else if (down < 35)
    {
        if (distance)
        {
            go.transform.position = go2.transform.position;
        }
        go.transform.Translate(0, -y, -x);
    }
    else if (down > 35 && down < 140 && right > 0)
    {
        if (distance)
        {
            go.transform.position = go2.transform.position;
        }
        go.transform.Translate(-x, -y, 0);
    }
    else if (down > 35 && down < 140 && right < 0)
    {
        if (distance)
        {
            go.transform.position = go2.transform.position;
        }
        go.transform.Translate(x, -y, 0);
    }
}

How can I refactor the mass if-else statement?? I have lots of big if-else statements in my app, do I need to refactor all this code or just leave it alone?


Solution

  • Try this

    private static void Foo(bool distance, YourGoClass go, YourGoClass go2, double x, double y, double z)
    {
        if (distance) go.transform.position = go2.transform.position;
        go.transform.Translate(x, y, z);
    }
    

    And then you can change your code like this

    if (up > 80 && up < 140)
    {
        Foo(distance, go, go2, y, 0, x);
    }
    else
    {
        switch(down)
        {
            case var _ when down > 140:
                Foo(distance, go, go2, 0, -y, x);
                break;
            case var _ when down < 35:
                Foo(distance, go, go2, 0, -y, -x);
                break;
            default:
                if (right > 0) Foo(distance, go, go2, -x, -y, 0);
                else Foo(distance, go, go2, x, -y, 0);
                break;
        }
    }