2

У меня есть это if-else заявление, которое делает то, что я хочу. То, что он делает, довольно просто, как вы должны быть в состоянии сказать.Neatest/самый идиоматический способ переписать это Если в C#

if (width != null && height != null) 
{ 
    if (top != null && left != null) 
    { 
     ret.type = VMLDimensionType.full; 
    } 
    else 
    { 
     ret.type = VMLDimensionType.size; 
    } 
} 
else 
{ 
    if (top != null && left != null) 
    { 
     ret.type = VMLDimensionType.positon; 
    } 
    else 
    { 
     ret.type = VMLDimensionType.unset; 
    } 
} 

enum именуется является:

private enum VMLDimensionType 
{ 
    unset = 0, 
    full = 1, 
    size = 2, 
    position = 3 
} 

Это так просто, я уверен, что есть гораздо более лаконична и более читаемый способ выразить это.

NB Если бы не смехотворное правило «одной скобки в строке», которое VS накладывает по умолчанию, я, вероятно, не буду так беспокоиться. Например, в VB я мог потерять около 10 строк из этого кодового блока! (любые мысли о том, что, как в сторону?)

+0

Если бы я не просчет его, версия VB.NET будет 7 строк короче, версия без скобок 12 строк. – Bobby

+0

Можете ли вы разместить перечисление 'VMLDimensionType'? Это могло бы быть проще, если бы это было перечисление Flags. – Ani

+0

@Bobby Correctomundo :) –

ответ

8

Одним из вариантов было бы сделать VMLDimensionTypeFlags перечисление:

[Flags] 
enum VMLDimensionType 
{ 
    Unset = 0, 
    Size = 1, 
    Position = 1 << 1, 
    Full = Size | Position 
} 

И затем:

ret.Type = VMLDimensionType.Unset; 

if(width != null && height != null) 
    ret.Type |= VMLDimensionType.Size; 

if (top != null && left != null) 
    ret.Type |= VMLDimensionType.Position; 
+0

Хм, мне, возможно, придется изменить принятый ответ :) Это имеет смысл, поскольку перечисление отражает реальную логику ... –

+0

Это не обрабатывает 'Full'. –

+1

@cibacity Full подразумевается, когда оба параметра и положение установлены. Это его красота. Выполнение логического 'ИЛИ' делает это. –

5

Как насчет этого:

bool hasSize = width != null && height != null; 
bool hasPosition = top != null && left != null; 

if (hasSize && hasPosition) 
{ 
    ret.type = VMLDimensionType.full; 
} 
else if (hasSize && !hasPosition) 
{ 
    ret.type = VMLDimensionType.size; 
} 
else if (!hasSize && hasPosition) 
{ 
    ret.type = VMLDimensionType.positon; 
} 
else 
{ 
    ret.type = VMLDimensionType.unset; 
} 
+0

+1 Мне очень нравится читаемость, которую дает это решение. Он по-прежнему довольно большой, но это может быть только для меня, когда я привык ко всем этим брекетам :) –

+0

@El Ronnoco В операциях с одной строкой вы можете удалить фигурные скобки - я бы порекомендовал их сохранять, поскольку это облегчает слияние изменений в исходном управлении, и дает вам окончательные группы, которые ваш глаз может пережить. –

+0

@ Да, когда я впервые начал с C#, я использовал, чтобы оставить фигурные скобки для блоков с одной строкой. Затем мне пришлось сделать некоторые из них двумя строчными кодовыми блоками .... –

9
bool hasPosition = (top != null && left != null); 
bool hasSize = (width != null && height != null); 

if (hasSize) 
{ 
    ret.type = hasPosition ? VMLDimensionType.full : VMLDimensionType.size; 
} 
else 
{ 
    ret.type = hasPosition ? VMLDimensionType.positon : VMLDimensionType.unset; 
} 
+0

Кодирование с наименьшим количеством строк не является лучшим IMHO. Код с меньшим количеством строк с четкой читаемостью делает его лучшим. Это соответствует законопроекту. –

+0

+1 Мне нравится, приятно и понятно. Вид, как чтение с графика. Как и другие, но все же ... –

+0

Извиняюсь, я изменил принятый ответ на вопрос Ани, поскольку мне нравится, как они сделали enum отражением логики происходящего. –

1

Что об этом:

if(width != null && height != null) 
    ret.type = top != null && left != null ? VMLDimensionType.full : VMLDimensionType.size; 
else 
    ret.type = top != null && left != null ? VMLDimensionType.positon : VMLDimensionType.unset; 
+0

Не видел комментарий Чибипути до того, как я опубликовал :( – TJHeuvel

+0

Ну, это самый короткий ... –

+0

+1 для кратчайшего! –

1

Я хотел бы извлечь метод GetDimensionType(). И сделайте его не таким маленьким, но более читаемым и самоописательным.

private VMLDimensionType GetDimensionType() 
{ 
    bool hasSize = width != null && height != null; 
    bool hasPosition = top != null && left != null; 

    if (hasSize && hasPosition) 
     return VMLDimensionType.full; 

    if (hasSize) 
     return VMLDimensionType.size; 

    if (hasPosition) 
     return VMLDimensionType.positon; 

    return VMLDimensionType.unset; 
} 

Использование:

ret.type = GetDimensionType(); 
+0

Откуда берутся «верх, левая, ширина» и «высота»? Или они доступны в качестве членов? –

+0

Да, я полагаю, это члены какого-то объекта. В любом случае, если это не так, вы можете передать их в качестве параметров. –

+0

+1 для возврата средней функции. Обратите внимание, как красиво они превращают 'else if' из всех других решений в более простые' if's. –

Смежные вопросы