|
4 | 4 |
|
5 | 5 | 1. **`process_order` конкатенирует строку с числом** (строка 39). `"...: " + inventory.total_value()` |
6 | 6 | — `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/логе). |
8 | 12 |
|
9 | 13 | 2. **Частичное списание заказа без атомарности** (строки 36–38). `process_order` идёт по |
10 | 14 | позициям и вызывает `remove_stock`, **игнорируя возвращаемый `bool`**. Если по одной |
|
29 | 33 | 8. Конструктор принимает внешний `items` и хранит по ссылке — внешний код может мутировать |
30 | 34 | склад мимо методов класса. |
31 | 35 |
|
| 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 | + |
32 | 56 | **Итого:** `TypeError` в `process_order` (падает всегда) + неатомарное частичное списание |
33 | 57 | + игнор возвращаемого `bool`. Мораль: если метод возвращает флаг успеха, вызывающий обязан его проверять. |
0 commit comments