Избегайте множественных If в c # - лучшая практика - PullRequest
4 голосов
/ 28 октября 2010

Сценарий: Допустим, мы должны проверить адресные строки. который включает addressline1, addressline2, город, страну, почтовый индекс Если введено какое-либо свойство, все остальные поля являются обязательными. Если ничего из этого не введено, проверка не должна инициироваться.

Чтобы достичь этого, я получил две строки оператора If. Нравится

if(AddressLine1 != null || AddressLine2 != null || Town != null || Country != null)
{
    if(AddressLine1 != null && AddressLine2 != null && Town != null && Country != null) == false
     {
          return false;
     }   
}

Примечание: я использую c #. Существуют ли какие-либо языковые конструкции, которые я могу использовать.

Ответы [ 4 ]

8 голосов
/ 28 октября 2010
private bool IsAddressValid(params string[] addressParts)
{
    return addressParts.Any(p => p != null) ? addressParts.All(p => p != null) : true;
}

Называться так:

var addressValid = IsAddressValid(AddressLine1, AddressLine2, Town, County);
6 голосов
/ 28 октября 2010

Если вы сделаете массив полей в группе, то вы можете сделать:

var fields = new object[] {AddressLine1, AddressLine2, Town, Country};
return fields.All(f => f == null) || fields.All(f => f != null);
6 голосов
/ 28 октября 2010

Хорошо, оператор с нулевым слиянием может помочь с первым:

if (AddressLine1 ?? AddressLine2 ?? Town ?? Country != null)
{
    if (AddressLine1 == null || AddressLine2 == null ||
        Town == null || Country == null)
    {
        return false;
    }
    // Presumably there's more here
}

Возможно, вы захотите написать несколько вспомогательных методов:

if (IsAnyNonNull(AddressLine1, AddressLine2, Town, Country))
{
    if (IsAnyNull(AddressLine1, AddressLine2, Town, Country))
    {
        return false;
    }
}

Где бы служебные методы были бычто-то вроде:

public static bool IsAnyNonNull(params object[] values)
{
    return values.Any(x => x != null);
}

public static bool IsAnyNull(params object[] values)
{
    return values.Any(x => x == null);
}

Конечно, у вас все еще есть два if заявления - но я думаю, что это в любом случае необходимо здесь.

0 голосов
/ 29 октября 2010

Определите это:

public static bool SameNullness(params object[] values)
{
    int nullCount = 0;
    foreach (var value in values)
    {
        if (value == null) nullCount++;
    }

    return nullCount == values.Length;
}

Затем используйте его как:

SameNullness(AddressLine1, AddressLine2, Town, Country); 
...