amarao (amarao_san) wrote,
amarao
amarao_san

Category:

башененависть

А вот главная моя претензия к башу, это то, что бизнес-логика в нём чаще всего реализуется не силами баша.

Я сейчас переписывал чек нагиоса с баша на питон, и вот что меня поразило:

Переписывал я его из-за смены формата, так что "$3" поехал, но принцип тот же.

Баш:
UniqDest=$(awk '!seen[$3]++{}END{print length(seen)}' $Path)
ActualNextC=$(awk '!seen[$5]++{}END{print length(seen)}' $Path)

Питон:
def parse_data(data):
    for line in data.readlines():
        try:
            prefix, path = line.split(';')
            first, _ = path.split(' ', 1)
            uplinkAS = int(first)
        except Exception as e:
            CRIT("Solution is invalid: %s" % str(e))
        yield (prefix, uplinkAS)


def process_solution(solution_file):
    prefixes = set()
    uplinks = set()
    with open(solution_file, 'r') as solution:
        for prefix, uplinkAS in parse_data(solution):
            prefixes.add(prefix)
            uplinks.add(uplinkAS)
    return (len(prefixes), len(uplinks))


я далёк от того, чтобы считать этот код хорошим (возврат tuple'ов - зло), но читая питон, вы примерно догадаетесь, что я хочу, и что должно быть в файле. А читая два взбрыка на awk'е - нет.

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

Слово "понятно" в себя включает не инструкции для машины (мы их будем понимать на любом языке - PHP, m4, ассемблер sendmail'а или даже машинный код), а семантику (смысл, вытекающий из синтаксиса). Семантика формируется из именования промежуточных объектов, передачи намерений, достаточной степени verbosity в критичных местах. (например, если мы можем обойтись без цикла изящным изворотом языка, но его трудно понять, то лучше написать цикл).

Ещё одна цель кода - сделать тестирование возможным. Для баша с примером выше возможно только интеграционное тестирование. Дали файл - проверяем результат. Юнит-тестирование невозможно, хотя у нас внутри баша и есть две завершённые программы на другом языке программирования (не баше). Почему невозможно? ПОтому что в таком виде я не могу их "вызвать" мимо всей остальной обвязки. Такой код (плохо приготовленный к тестированию) - низкого качества. Даже если он "делает то, что нужно".

Код должен:
1) Делать то, что нужно (Good path)
2) Знать что делать, если получается "не то, что нужно" (Sad path)
3) Не иметь ситуаций, когда "шути что" (bad path)
4) Быть готовым к тестированию покусочно
5) Объяснять, что происходит в коде (и зачем) тому, кто этот код читает (не компьютеру! человеку!)

Баш успешно срезает 4 из 5 добродетелей. Да, он может делать то, что нужно. Sad path на баше писать сложно, избегать bad path почти невозможно, тестировать покусочно - сложно и неудобно, а уж с объяснением всё просто швах.
Subscribe

  • 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.
  • 59 comments