Проверка значений перечислений - альтернатива корпусу переключателя с 30 случаями? - PullRequest
1 голос
/ 16 июня 2020

Мне нужно определить, все ли условия соответствуют определенным критериям.

public class OfferServiceConditionDto
{

    public long Id { get; set; }

    public Parameter Parameter { get; set; }

    public Enums.Condition Condition { get; set; }

    public double? Value { get; set; }

    [JsonIgnore]
    public long? OfferSubServiceId { get; set; }
}

Параметры имеют 5 вариантов:

public enum Parameter : int
{
    Length,
    Width
    Height,
    Area,
    Volume
}

Условие имеет 6 вариантов:

public enum Condition : int
{
    LessThan,
    LessThanOrEqualTo,
    Equals,
    GreaterThan,
    GreaterThanOrEqualTo,
    DoesNotEqual
}

В моей функции мне дается ширина элемента, высота и длина, и мне нужно проверить соответствие условиям, параметрам и значению OfferServiceConditionDto. Это колоссальные 30 проверок.

Есть ли лучшая альтернатива для этого?

1 Ответ

4 голосов
/ 16 июня 2020

Просто извлеките несколько методов. Поступая таким образом, вы можете легко превратить 30 (5 * 6) случаев в 11 (5 + 6).

public static bool CheckCondition(double width, double height, double length, OfferServiceConditionDto dto) {
    switch (dto.Parameter) {
    case Parameter.Length:
        return CheckCondition(dto.Condition, length, dto.Value);
    case Parameter.Height:
        return CheckCondition(dto.Condition, height, dto.Value);
    // plus 3 more...
    }
    return false;
}

private static bool CheckCondition(Enums.Condition condition, double value1, double? value2) {
    if (value2 == null) {
        return true; // decide what to do if Value is null
    }
    switch (condition) {
    case Enums.Condition.LessThan:
        return value1 < value2.Value;
    case Enums.Condition.LessThanOrEqualTo:
        return value1 <= value2.Value;
    // plus 4 more...
    }
    return false;
}
...