Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Как рефакторить метод со многими вложенными конструкциями в C# или Java

#java #c_sharp #шаблоны_проектирования #рефакторинг


Слышал, что не очень хорошо, когда в методе много вложенных конструкций. Видимо,
так говорят потому, что код становится не читабельным.

Например,

public void Do(int a, bool b, List c, object d = null)
{
    if ()
    {
        foreach ()
        {
            if ()
            {

            }
            else if ()
            {
                if ()
                {
                    foreach ()
                    {
                        if ()
                        {
                        }
                    }
                }   
            }
        }
    }
}


Какие существуют подходы, как такие методы рефакторить в уже написанном коде? Особенно,
в случаях, когда у метода много входных параметров и все они как-то переплетены внутри
него, так что и не догадаешься, как разбить на разные методы. Причем, когда код заново
не получится написать, потому, что всего там не понимаешь, риск, что перестанет правильно
работать. Существуют ли какие-нибудь шаблонные подходы? 

Приходит в голову:


использовать ключевые слова типа return, continue, break


Например, вместо

if (x != null)
{
    //code
}


писать так:

if (x == null)
    return;
//code


Еще чего-нибудь посоветуете?
    


Ответы

Ответ 1



Почитайте книгу Роберта Мартина "Чистый код" (Clean Code). Не все мысли автора бесспорны, но почитать точно стоит. По крайней мере после чтения, многие вещи будут восприниматься немного по другому. Ссылка на книгу в ozon.ru P.S. Электронная версия легко гуглится.

Ответ 2



Можно выполнить декомпозицию, что бы в каждом отдельном методе выполнялся 1 цикл, который вызывает другой метод. В этом случае получается самодокументированный код. Если в if находится какое-то большое выражение, то можно сделать отдельную функцию, которая возвращает true/false и опять же получается саомдокументированный код. В некоторых случаях if можно поменять на switch В "Чистый код", как раз такие советы и даются. Еще можно foreach и if заменить на LINQ выражение и несколько строчек сократить до 1. В некоторых случаях(когда условие небольшое) это не скажется на читаемости, а в итоге несколько строчек сократятся до 1-2.

Комментариев нет:

Отправить комментарий