amarao (amarao_san) wrote,
amarao
amarao_san

рефакторинг

Итак, я продолжаю рефакторить getSVG в FreeCAD. Я закончил переделывать несколько маленьких функций, написал для них тесты.

Вот пример простого:

Было:
def getProj(vec, plane):
    if not plane: return vec
    nx = DraftVecUtils.project(vec,plane.u)
    lx = nx.Length
    if abs(nx.getAngle(plane.u)) > 0.1: lx = -lx
    ny = DraftVecUtils.project(vec,plane.v)
    ly = ny.Length
    if abs(ny.getAngle(plane.v)) > 0.1: ly = -ly
    #if techdraw: buggy - we now simply do it at the end
    #    ly = -ly
return Vector(lx,ly,0)



Стало:

def projected_length(vec, axis):
    projected_vector = DraftVecUtils.project(vec, axis)
    length = projected_vector.Length
    if abs(projected_vector.getAngle(axis)) > math.pi/2:  # near 0 or near pi
        length = -length
    return length


def getProj(vec, plane):
    if not plane:
        return vec
    coord_x = projected_length(vec, plane.u)
    coord_y = projected_length(vec, plane.v)
    return Vector(coord_x, coord_y, 0)



Основное моё достижение тут - это имена функций и переменных, плюс исправление 0.1 на pi/2 (что делает константу самоописующей для понимания почему "минус"). Над projected_length (именем функции) я думал очень долго. Сейчас кажется, что "ну да, а что тут такого", но я перебрал больше десятка имён, пока не нашёл подходящее.

А вот дальше начинается ад. Я чуть-чуть кое-как выковырял функцию getPath из getSVG (135 строк си-подобного питона), и мне очень больно. В оригинале это была вложенная функция, которая имела доступ к переменным вышестоящей функции. И их много, и они разные (и в разных местах getSVG используются разные ветвления getPath). Сейчас я борюсь за хотя бы один успешный тест. Пока что не удалось сделать прямоугольник - оказывается, оно не вызывается для прямоугольников. Я сейчас найду объект, для которого оно вызывается и буду медленно распиливать getPath на разумные кусочки. Вот функция, если кому-то интересно: https://github.com/amarao/FreeCAD/blob/getSVG_refactoring/src/Mod/Draft/getSVG.py#L98

Основная проблема в getPath, что я не могу охватить её взглядом. Я не понимаю, что она делает и меня сносит на 150ой строке. В то же самое время, я отказываюсь её менять не имея хотя бы одного теста. В любом случае, локальная цель - описать тест-кейс, хоть один (у которого в результате не пустой path d="...")
Tags: #if, refactoring
Subscribe

  • фурикури

    Я тут его ещё раз пересмотрел, и за гламурным дребезгом (который хорош), я, наконец-таки, рассмотрел сюжет. Первые три серии (я про оригинальный…

  • поздне-анимешное

    Один из интересных водоразделов между западной и восточной (японской, японской) культурой я вижу в районе толстовской фразы "Все счастливые семьи…

  • berserk 2017

    Внезапно, если кто не заметил, уже аж 4 серии нового сезона. И он не менее офигенен, чем предыдущий. При том, что местами анимация провисает, история…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 18 comments

  • фурикури

    Я тут его ещё раз пересмотрел, и за гламурным дребезгом (который хорош), я, наконец-таки, рассмотрел сюжет. Первые три серии (я про оригинальный…

  • поздне-анимешное

    Один из интересных водоразделов между западной и восточной (японской, японской) культурой я вижу в районе толстовской фразы "Все счастливые семьи…

  • berserk 2017

    Внезапно, если кто не заметил, уже аж 4 серии нового сезона. И он не менее офигенен, чем предыдущий. При том, что местами анимация провисает, история…