Псевдокод — Примеры

Пример 1 — Спецификация с записанными краями

Сервис читает CSV с заказами. Каждая строка содержит id, имя и сумму, и файл может содержать заголовок, пустые строки и строки, сумма в которых не является числом. Псевдокод ниже — черновик, написанный до всякого кода: скажите, что он делает с пустой строкой и плохой суммой, затем приведите тот же алгоритм на настоящем языке.

parse_line(line):
  fields = split(line, ",")
  id = fields[0]
  name = fields[1]
  amount = number(fields[2])
  return { id, name, amount }

Решение

пустая строка разбивается в одно пустое поле, поэтому fields[1] и fields[2]
отсутствуют; нечисловая сумма становится неверным числом, а не ошибкой.
В черновике есть счастливый путь и нет краёв.

parse_line(line):
  if строка пуста: return skip
  fields = split(line, ",")
  if в fields меньше 3 частей: return reject "короткая строка"
  amount = number(fields[2]), иначе return reject "amount не число"
  return { id: fields[0], name: fields[1], amount }
def parse_line(line):
    if not line.strip():
        return None                      # заголовок или пустая строка
    parts = line.split(",")
    if len(parts) < 3:
        return None
    try:
        amount = float(parts[2])
    except ValueError:
        return None
    return {"id": parts[0], "name": parts[1], "amount": amount}

Записывание веток до кода вскрывает два решения, которые черновик оставил неявными: пустые строки пропускаются молча, а плохая сумма отвергает строку, а не вызывает исключение. Ловушка в том, что на чистом файле оба варианта ведут себя одинаково. Поэтому разницу находят либо проход по псевдокоду, либо тест на нарочно неряшливом файле.

Пример 2 — Одно предложение, скрывающее пять шагов

На разборе замысла всплывает блок ниже. Он читается как один шаг, поэтому рецензент не видит, где принимаются решения. Скажите, что с ним не так, и перепишите его так, чтобы каждый слой был виден.

process_upload(file):
  прочитать файл, пропустить заголовок, разбить каждую строку, проверить
  столбцы, вставить строки и отправить сводку загрузившему по почте

Решение

process_upload(file):
  rows = read_rows(file)           # чтение, пропуск заголовка, разбиение строк
  valid, rejected = validate(rows)
  inserted = insert(valid)
  notify_uploader(inserted, rejected)

read_rows(file):
  lines = прочитать все строки файла
  отбросить первую строку, если это заголовок
  return разбить каждую оставшуюся строку по ","

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