# 10 способов сделать код лучше
---
или как быть плохим разведчиком
:sleuth_or_spy:
---
## Не замалчивайте ошибки
---
:x: никто не узнает, если код не выполнится
```python
try:
process_report()
except:
pass
```
---
:heavy_check_mark: Увидят в логе
```python
try:
process_report()
except ReportError:
log.error(...)
```
---
## Давайте больше контекста
---
:x: Непонятно, что не найдено
```python
def sum_numbers_in_file(path):
if not os.path.exists(path):
raise RuntimeError("Not found")
```
---
:heavy_check_mark: Есть ~~контакт~~ контекст!
```python
def sum_numbers_in_file(path):
if not os.path.exists(path):
raise RuntimeError(
f"File with numbers not exists: {path}"
)
```
---
## Используйте объясняющие имена
---
:x: Получена шифровка
```python
def count(lst, num):
res = 0
for i in lst:
if i > num:
res += 1
return res
res = count([1,3,4,5,6], 4)
```
---
:heavy_check_mark: Можно понять по заголовку что делает функция
```python
def count_measurements_above_threshold(
measurements,
threshold
):
count = 0
for value in measurements:
if value > threshold:
count += 1
return count
```
---
## Выделите связный код в функцию
---
:x: Сложные вычисления внутри большого алгоритма
```python
...
# Далее вычисляем очень нужные данные
bucks = count_money(date)
cents = count * 100
tax_in_cents = cents * 0.15
...
```
---
:heavy_check_mark: Вычисления отдельно, и у них есть понятное имя
```python
def calc_taxes(date):
bucks = count_money(date)
cents = count * 100
return cents * 0.15
```
```python
...
tax_in_cents = calc_taxes(date)
...
```
---
## Используйте переменные для сложных условий
---
:x: Сложное непонятное условие
```python
if (
(year == 2010 and month == 10 and day == 12) or
(user.active and user.balance > 100)
):
do_smth()
```
---
:heavy_check_mark: Части условия получили свои иимена
```python
is_special_date = year == 2010 and month == 10 and day == 12
is_payer = user.active and user.balance > 100
if is_special_date or is_payer:
do_smth()
```
---
## Объедините повторяющиеся аргументы
---
:x: Много повторяющихся аргументов, которые передаются из функции в функцию
```python
def load_report(report, from_line, to_line): pass
def update_coefficients(report, from_line, to_line, multiplier): pass
def zero_bad_values(report, from_line, to_line, func): pass
```
---
:heavy_check_mark: Повторы заменены на один объект
```python
@dataclass
class ReportSlice:
report: Any
from_line: int
to_line: int
def parse_report(report_slice: ReportSlice): pass
def calc_coefficients(
report_slice: ReportSlice,
multiplier
): pass
```
---
## Не делайте слишком многого
---
:x: Функция делает слабо связанные дествия
```python
def load_report_and_find_payers(path):
pass
payers = load_report_and_find_payers(path)
```
---
:heavy_check_mark: Более последовательный код
```python
def load_report(path): pass
def find_payers_in_report(report): pass
report = load_report(path)
payers = find_payers_in_report(report)
```
---
## Сделайте ранний возврат
---
:x: Большая вложенность
```python
def calc_any_sum(x, y):
if is_number(x):
if is_number(y):
return x + y
else:
raise ...
else:
raise ...
```
---
:heavy_check_mark: Защитные проверки в начале
```python
def calc_any_sum(x, y):
if not is_number(x):
raise ...
if not is_number(y):
raise ...
return x + y
```
---
:exploding_head: Или даже так
```python
def calc_any_sum(x, y):
return x + y
```
---
## Используйте аннотации типов
---
:x: Непонятно, какой тип данных у аргумента
```python
def inc_date(dt):
converted = strptime(dt, "%d%m%Y").date()
new_date = converted + timedelta(days=100)
return new_date.strftime("%d%m%Y")
```
---
:heavy_check_mark: Так понятно
```python
def add_100_days_to_date(date_as_str: str) -> str:
converted = strptime(date_as_str, "%d%m%Y").date()
new_date = converted + timedelta(days=100)
return new_date.strftime("%d%m%Y")
```
---
## Удалите мертвый код
- Сделайте это отдельным коммитом
- Дайте коммиту подходящий комментарий, чтобы его было легко найти
```
git commit -m "(removed) Удалил алгоритм расчета, \
который больше не используется"
```
---
Стив Макконнелл

---
Роберт Мартин

---
Пишите код для людей, а не для машин!
:robot_face:
{"metaMigratedAt":"2023-06-15T17:39:56.311Z","metaMigratedFrom":"YAML","title":"10 способов сделать код лучше","breaks":false,"contributors":"[{\"id\":\"4e26b559-162b-4f85-ad1a-424e3bb43fb6\",\"add\":6631,\"del\":1950}]"}