Skip to content

Commit eaede9b

Browse files
committed
📝 код-ревью 10: разобрал fixme-комменты из задачи — модель Item, типы, порог low_stock, возврат структурой
1 parent ca6be99 commit eaede9b

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

‎code-review-practice/solutions/10_inventory.md‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44

55
1. **`process_order` конкатенирует строку с числом** (строка 39). `"...: " + inventory.total_value()`
66
— `total_value()` возвращает число (int/float), `str + float` → `TypeError`, функция
7-
всегда падает в конце. Фикс: `+ str(inventory.total_value())` или f-строка.
7+
всегда падает в конце. Фикс: `+ str(inventory.total_value())` или f-строка. Но глубже —
8+
**возврат человекочитаемой строки вместо структуры** делает результат нетестируемым и
9+
непригодным для вызывающего кода: парсить число из строки никто не будет. Возвращать
10+
стоит данные (статус + `total_value` числом / dataclass / dict), а форматирование — на
11+
границе (в UI/логе).
812

913
2. **Частичное списание заказа без атомарности** (строки 36–38). `process_order` идёт по
1014
позициям и вызывает `remove_stock`, **игнорируя возвращаемый `bool`**. Если по одной
@@ -29,5 +33,25 @@
2933
8. Конструктор принимает внешний `items` и хранит по ссылке — внешний код может мутировать
3034
склад мимо методов класса.
3135

36+
9. **Товар — сырой вложенный dict вместо модели** (`{name: {"qty": ..., "price": ...}}`).
37+
`self.items[name]["qty"]` раскидан по всем методам: опечатка в ключе не поймается, схема
38+
позиции нигде не зафиксирована, `mypy` бессилен. Честный `@dataclass Item(qty: int, price: float)`
39+
(или `NamedTuple`) убирает магические строки-ключи и даёт типизацию. Это же снимает
40+
вопрос из п.5 (Decimal — поле модели).
41+
42+
10. **Нет аннотаций типов** (все методы, `process_order`). `name: str`, `qty: int`,
43+
`threshold: int`, возвращаемые типы — контракт склада должен читаться из сигнатур.
44+
45+
11. **Порог `low_stock`: `<` или `<=`?** (строка 30). `qty < threshold` — граничное значение
46+
(`qty == threshold`) считается достаточным. Это семантический выбор («низкий остаток» —
47+
строго меньше или не больше?), его надо зафиксировать в докстринге/контракте, а не
48+
оставлять читателю гадать.
49+
50+
12. **Контракт `remove_stock` при нехватке** (строки 15–18). Сейчас при недостатке остатка
51+
метод просто возвращает `False`, ничего не меняя — это ок. Но стоит продумать краевые
52+
случаи явно: что делать с позицией при нулевом остатке (оставлять `qty=0` или удалять),
53+
и как отличать «товара нет» от «не хватило» — сейчас первое даёт `KeyError` (п.3),
54+
второе — `False`.
55+
3256
**Итого:** `TypeError` в `process_order` (падает всегда) + неатомарное частичное списание
3357
+ игнор возвращаемого `bool`. Мораль: если метод возвращает флаг успеха, вызывающий обязан его проверять.

0 commit comments

Comments
 (0)