Лучший синтаксис для оператора If - PullRequest
4 голосов
/ 16 августа 2011

У меня есть такое условие:

if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small")

Вероятность того, что в будущем мне придется управлять большим количеством size в выражении if.

Я хотел бы знатьесли есть более понятный и понятный способ написания этого условия.

Пожалуйста, предоставьте реальный пример, спасибо, что уделили нам время.

Ответы [ 8 ]

6 голосов
/ 16 августа 2011

Вы можете сохранить хэш-набор слов и проверить:

HashSet<string> filterWords = new HashSet<string>();
// Put all words in the hash set


if (filterWords.contains(size))
{
    // Do what ever you need
}
3 голосов
/ 16 августа 2011

Поместите размеры в какую-нибудь коллекцию и используйте «Содержит».См. MSDN для примера: http://msdn.microsoft.com/en-us/library/bb352880.aspx

3 голосов
/ 16 августа 2011
// you could externalize and manage this list somewhere else 
var sizes = new[] { "Large", "Medium", "Small" }; 

if (string.IsNullOrEmpty(filename) || !sizes.Contains(size))
{
    ...
}
1 голос
/ 16 августа 2011

Ниже разрывов строки делает его более читабельным.

   if (string.IsNullOrEmpty(filename) || 
    size != "Large" || 
    size != "Medium" || 
    size != "Small")

Совет по дизайну

Если с вашим длинным условием if связано много объектов, хорошо написать небольшие свойства / методы, которые возвращают true / false в этих классах.

if (string.IsNullOrEmpty(filename) || object.IsProperSize)

Иногда Enum Flags Attribute также помогает в таком случае. Посмотрите на здесь для хорошего объяснения.

1 голос
/ 16 августа 2011

То, что вы сделали, выглядит самым прямым способом сделать это.Любая модификация будет просто перемещать беспорядок в другом месте.Если вам не нужно повторно использовать этот код где-либо еще, я бы оставил все как есть.

1 голос
/ 16 августа 2011

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

В противном случае, если у вас есть множество этих значений, было бы лучше сохранить список в каком-то словаре - скажем, notHandledSizes. Назначьте «Large» => true, «Medium» => true, ... и просто проверьте, существует ли size и истинно ли в этом словаре.

1 голос
/ 16 августа 2011

Если они собираются измениться, возможно, статический список лучше:

private static List<string> Sizes = new List<string> { "large", "medium", "small" };

if (string.IsNullOrEmpty(filename) || Sizes.Contains(size.ToLower()))
{

}

Для еще более чистого кода инкапсулируйте проверку размера в свой собственный метод и при необходимости измените этот метод:

if (MeetsSizeRequirementsOrIsNull(filename, size))
{        
}

private static bool MeetsSizeRequirementsOrIsNull(string filename, string size)
{
    List<string> sizes = new List<string>() { "..." };

    return string.IsNullOrEmpty(filename) || sizes.Contains(size.ToLower())
}
1 голос
/ 16 августа 2011

Опция 1:

Напишите небольшую функцию, которая возвращает bool и содержит только тесты размера, и используйте ее в вашем if.

if (string.IsNullOrEmpty(filename) || GoodSize(size))
{
 //...
}

private bool GoodSize(string size)
{
   return size != "Large" || size != "Medium" || size != "Small";
}

Опция 2:

Создайте список размеров для проверки и используйте Contains:

var goodSizes = new[] { "Large", "Medium", "Small" };
if (string.IsNullOrEmpty(filename) || !goodSizes.Contains(size))
{
    //...
}

И вы можете комбинировать оба варианта для большей ясности и инкапсуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...