Псевдокод — Примеры
Пример 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 разбить каждую оставшуюся строку по ","
Именование четырёх шагов обнажает решения, которые похоронило длинное предложение: всегда ли есть заголовок, что происходит с отвергнутыми строками и отправляется ли сводка, когда ничего не вставлено. Ловушка в том, что версия в одно предложение выглядит полной — каждая операция названа. Однако она не даёт рецензенту ничего, с чем можно не согласиться.