Вложенные условия if против нескольких разделенных условий if с оператором return в каждом - PullRequest
1 голос
/ 29 мая 2019

Каков наиболее профессиональный стиль кода в следующих двух функциях?
А что, если функция станет более сложной и крупной, например, с 20 проверками?
Примечание: мне нужно делать некоторые вещи после каждой проверки, поэтому я не могу объединить все в одном операторе if, например:
if (vehicle.isBus) && (vehicle.numberOfWheels == 6) && (vehicle.motorVersion == 2019)

//first alternative
public bool validate(Vehicle vehicle)
{
    if(vehicle.isBus)
    {
        //do some stuff here related to vehicle.isBus
        if (vehicle.numberOfWheels == 6)
        {
            //do some stuff here related to vehicle.numberOfWheels
            if (vehicle.motorVersion == 2019)
            {
                //do some stuff here related to vehicle.motorVersion
                return true;
            }
        }
    }
    return false;
}

//second alternative
public bool validate(Vehicle vehicle)
{
    if (!vehicle.isBus)
    {
        return false;
    }
    //do some stuff here related to vehicle.isBus

    if (vehicle.numberOfWheels != 6)
    {
        return false;
    }
    //do some stuff here related to vehicle.numberOfWheels

    if (vehicle.motorVersion != 2019)
    {
        return false;
    }
    //do some stuff here related to vehicle.motorVersion

    return true;
}

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Одно золотое правило, которому я следую, - это Избегайте вложения столько, сколько я могу.

Используйте тот, который делает код более читабельным и понятным. Только для двух условий первый способ более логичен и читабелен. Это может быть не так с 5 или 6 условиями, связанными с &&, || и!.

Так что, когда количество чеков 5+, вы должны предпочесть второй вариант.

Примечание: Множественные if без каждого вызова return означают, что 2 или более if могут быть истинными.

0 голосов
/ 29 мая 2019

Второй пример должен потребовать меньше когнитивных издержек при чтении кода.

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

Второй пример также менее вероятно будет спутан неуместной скобкой; на самом деле в этом примере он вообще не требует никаких фигурных скобок.

...