# 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) Удалил алгоритм расчета, \ который больше не используется" ``` --- Стив Макконнелл ![](https://static.my-shop.ru/product/3/165/1642017.jpg) --- Роберт Мартин ![](https://files.books.ru/pic/890001-891000/890941/1113032169c.jpg) --- Пишите код для людей, а не для машин! :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}]"}
    261 views