Вот мое решение (в 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
Я бы реорганизовал код, чтобы использовать внешние методы, чтобы облегчить чтение.
if( ValidAngle(angle, previousAngle) && ValidAngle(pairedAngle, previousPairedAngle) )
ValidAngle( angle, prevAngle){
return angle.angle < kQuiteLow && (previousAngle.angle > kQuiteHigh || previousAngle.time == kUnknownTime)
}
Я согласен с samuelcarrijo и pb, извлекайте сложные выражения в методы или переменные.
Если вы не можете извлечь метод в значимую абстракцию, вы можете рассмотреть код фрагменты или блоки .
Одно из предложений - разбить логику на методы. Также проще преобразовать ваши комментарии в имя метода, чтобы они вам не понадобились. Или, если они слишком сложные, их включают в документацию по методу.
if (anglesAreOk(...))
{
}
public bool analyseAngles() {
return angleOk(...) && previousAngleOk(...) && pairedAngleOk(...)
}
Вы поняли ...
Как насчет добавления ограничений для ваших классов?
например,
if ( angle.isQuiteLow() && previousAngle.isQuiteHigh() && previousAngle.isUnknownTime() )
Из книги Фаулера по рефакторингу я согласен с советом, что сложная логическая логика должна быть заменена методами с осмысленными именами, например
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)
}