Подтвердить что ты не робот

Я ищу бесплатный инструмент автономного или надстройки, который может разлагать тернарные выражения

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

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

Кто-нибудь знает бесплатный инструмент, автономный или как надстройку для VS 2008, который может разлагать тернарные выражения? В этом проекте нет бюджета для CodeRush. Я буду продолжать перекодировать, если это необходимо, но я хочу немного поверить здесь.

Вот пример проблемы (извините, что вы смотрите на это).

sNoteType = objSelection.Items[1].Selected ? 
    objSelection.Items[0].Selected ? 
    objSelection.Items[3].Selected ? 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " :
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " :
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ?
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "BA " : 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LS " : 
    objSelection.Items[3].Selected ? 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "BA " : 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "FD " : 
    objSelection.Items[0].Selected ? 
    objSelection.Items[3].Selected ? 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "BA " : 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LS " : 
    objSelection.Items[3].Selected ? 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "BA " : 
    objSelection.Items[4].Selected ? 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "LT " : 
    objSelection.Items[5].Selected ? 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty + "EV " : 
    objSelection.Items[2].Selected ? 
    string.Empty + "OV " : 
    string.Empty;
4b9b3361

Ответ 1

CodeRush Xpress (бесплатно) делает это и многое другое. См. здесь.

Ответ 2

Значение кода намного проще, чем кажется. Продолжая работу с ReSharper, я нашел следующее:

string sNoteType;
var items = objSelection.Items;

var item0Selected = items[0].Selected;
string item3NotSelectedValue;
if (items[1].Selected)
{
    item3NotSelectedValue = item0Selected ? "LS " : "FD ";
}
else
{
    item3NotSelectedValue = item0Selected ? "LS " : string.Empty;
}

if (items[2].Selected)
{
    sNoteType = "OV ";
}
else
{
    if (items[5].Selected)
    {
        sNoteType = "EV ";
    }
    else
    {
        if (items[4].Selected)
        {
            sNoteType = "LT ";
        }
        else
        {
            if (items[3].Selected)
            {
                sNoteType = "BA ";
            }
            else
            {
                sNoteType = item3NotSelectedValue;
            }
        }
    }
}

Поскольку Джон сделал всю тяжелую работу, здесь редактирование, которое, я думаю, сводит его к сути. Очевидно, что вы захотите поставить тесты вокруг этого кода как можно скорее, поскольку я не могу себе представить, что вы не ошиблись при декодировании этого чудовища, и автоматическое рефакторинг только доберет вас до сих пор (не очень, из взглядов образцов здесь):

var items = objSelection.Items;
string sNoteType = string.Empty;    
if (items[0].Selected && items[1].Selected) {
    sNoteType = "LS ";
} else if (items[1].Selected) {
    sNoteType = "FD ";
} else if (items[2].Selected) {
    sNoteType = "OV ";
} else if (items[3].Selected) {
    sNoteType = "BA ";    
} else if (items[4].Selected) {
    sNoteType = "LT ";
} else if (items[5].Selected) {
    sNoteType = "EV ";
}

Ответ 3

ReSharper может преобразовать тройную в if/else.

Я на самом деле запускал его через ReSharper, и результат одинаково ужасен. Желаю вам удачи в рефакторинге.

if (objSelection.Items[1].Selected)
            if (objSelection.Items[0].Selected)
                if (objSelection.Items[3].Selected)
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "BA ";
                        }
                    }
                else
                {
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LS ";
                        }
                    }
                }
            else
            {
                if (objSelection.Items[3].Selected)
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "BA ";
                        }
                    }
                else
                {
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "FD ";
                        }
                    }
                }
            }
        else
        {
            if (objSelection.Items[0].Selected)
                if (objSelection.Items[3].Selected)
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "BA ";
                        }
                    }
                else
                {
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LS ";
                        }
                    }
                }
            else
            {
                if (objSelection.Items[3].Selected)
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "BA ";
                        }
                    }
                else
                {
                    if (objSelection.Items[4].Selected)
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "LT ";
                        }
                    else
                    {
                        if (objSelection.Items[5].Selected)
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty + "EV ";
                        else
                        {
                            if (objSelection.Items[2].Selected) sNoteType = string.Empty + "OV ";
                            else sNoteType = string.Empty;
                        }
                    }
                }
            }
        }

Ответ 4

Этот код должен вести себя одинаково с оригинальным монстром:

string sNoteType;
if (objSelection.Items[2].Selected)
{
    sNoteType = "OV ";
}
else if (objSelection.Items[5].Selected)
{
    sNoteType = "EV ";
}
else if (objSelection.Items[4].Selected)
{
    sNoteType = "LT ";
}
else if (objSelection.Items[3].Selected)
{
    sNoteType = "BA ";
}
else if (objSelection.Items[0].Selected)
{
    sNoteType = "LS ";
}
else if (objSelection.Items[1].Selected)
{
    sNoteType = "FD ";
}
else
{
    sNoteType = string.Empty;
}

Чтобы достичь этого, я начал с предположения, что все, что делает текущий код, является правильным. Затем я написал script для генерации 64 тестовых примеров - по одному для каждой комбинации значений истинности. Представьте себе, что это:

[TestCase("EV ", "000001")]
[TestCase("LT ", "000010")]
[TestCase("EV ", "000011")]
[TestCase("BA ", "000100")]
[TestCase("EV ", "000101")]

Затем я рассмотрел шаблоны и добавил if-statements один за другим, пока монстра больше не понадобилась. Я не могу гарантировать, что именно так автор воображал логику, но я могу гарантировать, что она будет вести себя одинаково во всех возможных случаях.

Ответ 5

Я преобразовал его для вас, используя свой CodeRush Xpress

if (objSelection.Items[1].Selected)
    if (objSelection.Items[0].Selected)
        if (objSelection.Items[3].Selected)
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "BA ";
        else
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LS ";
    else
        if (objSelection.Items[3].Selected)
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "BA ";
        else
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "FD ";
else
    if (objSelection.Items[0].Selected)
        if (objSelection.Items[3].Selected)
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "BA ";
        else
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LS ";
    else
        if (objSelection.Items[3].Selected)
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "BA ";
        else
            if (objSelection.Items[4].Selected)
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "LT ";
            else
                if (objSelection.Items[5].Selected)
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty + "EV ";
                else
                    if (objSelection.Items[2].Selected)
                        sNoteType = string.Empty + "OV ";
                    else
                        sNoteType = string.Empty;

Однако это все еще крайне уродливо. Я бы предложил вам использовать шестимерную таблицу истинности

string[,,,,,] table = new string[2,2,2,2,2,2];
table[0, 0, 0, 0, 0, 0] = "AA";
table[0, 0, 0, 0, 0, 1] = "BB";
table[0, 0, 0, 0, 1, 0] = "CC";
table[0, 0, 0, 0, 1, 1] = "DD";
...

Затем он может быть запрошен как

string sNoteType = table[
    objSelection.Items[0].Selected ? 1 : 0,
    objSelection.Items[1].Selected ? 1 : 0,
    objSelection.Items[2].Selected ? 1 : 0,
    objSelection.Items[3].Selected ? 1 : 0,
    objSelection.Items[4].Selected ? 1 : 0,
    objSelection.Items[5].Selected ? 1 : 0];

Ответ 6

Если бы мне пришлось столкнуться с такой ситуацией, я бы использовал ее для расследования Рослина и посмотреть, как это может помочь. Я думаю, что разработка плагина для VS, реорганизация выбранного вами тройного выражения, будет соответствовать проекту "выходные".

http://blog.filipekberg.se/2011/10/23/exploring-how-to-write-a-code-analyzer-with-roslyn/ http://blogs.msdn.com/b/csharpfaq/archive/2011/11/03/using-the-roslyn-syntax-api.aspx