Есть ли какие-либо рекомендации руководств по стилю или конвенции для форматирования сложной булевой логики?

Вот мое решение (в Python):

def spiral(X, Y):
    x = y = 0
    dx = 0
    dy = -1
    for i in range(max(X, Y)**2):
        if (-X/2 < x <= X/2) and (-Y/2 < y <= Y/2):
            print (x, y)
            # DO STUFF...
        if x == y or (x < 0 and x == -y) or (x > 0 and x == 1-y):
            dx, dy = -dy, dx
        x, y = x+dx, y+dy
5
задан Anthony 15 June 2012 в 05:16
поделиться

5 ответов

Я бы реорганизовал код, чтобы использовать внешние методы, чтобы облегчить чтение.

if( ValidAngle(angle, previousAngle) && ValidAngle(pairedAngle, previousPairedAngle) )

ValidAngle( angle, prevAngle){
    return angle.angle < kQuiteLow && (previousAngle.angle > kQuiteHigh || previousAngle.time == kUnknownTime)
}
7
ответ дан 14 December 2019 в 04:44
поделиться

Я согласен с samuelcarrijo и pb, извлекайте сложные выражения в методы или переменные.

Если вы не можете извлечь метод в значимую абстракцию, вы можете рассмотреть код фрагменты или блоки .

0
ответ дан 14 December 2019 в 04:44
поделиться

Одно из предложений - разбить логику на методы. Также проще преобразовать ваши комментарии в имя метода, чтобы они вам не понадобились. Или, если они слишком сложные, их включают в документацию по методу.

if (anglesAreOk(...))
{
}

public bool analyseAngles() {
    return angleOk(...) && previousAngleOk(...) && pairedAngleOk(...)
}

Вы поняли ...

1
ответ дан 14 December 2019 в 04:44
поделиться

Как насчет добавления ограничений для ваших классов?

например,

if ( angle.isQuiteLow() && previousAngle.isQuiteHigh() && previousAngle.isUnknownTime() )
0
ответ дан 14 December 2019 в 04:44
поделиться

Из книги Фаулера по рефакторингу я согласен с советом, что сложная логическая логика должна быть заменена методами с осмысленными именами, например

if(x && y || !b) { }

vs

if(customerIsRepeatCustomerFromIdaho(x,y,b)){ }

Или множеством модульных тестов с осмысленными именами

например,

[Test]
public void CustomersFromIdahoGetDiscountsOnAlternatingTuesdays()
{
  isRepeat=true;isFromIdaho=false;isTuesday=true;
  Assert.AreEqual(Customer.CalclateDiscount(isRepeat,isFromIdaho,isTuesday),.10)
}
0
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: