Ах, идиоматичный код — это разница между написанием программного обеспечения и созданием цифровой поэзии. Представьте, что вы заказываете «жидкую сущность обжаренных зёрен Coffea arabica в цилиндрической термоизолированной ёмкости», когда можно просто сказать «кофе с собой». Давайте разберёмся, почему написание кода, который «пахнет» своим языком программирования, важнее, чем вы думаете.
Почему важен идиоматичный код (не только для того, чтобы похвастаться)
Идиоматичный код подобен хорошо подогнанному костюму:
- Поддерживаемый (будущий вы отправит благодарственные письма)
- Производительный (проникает оптимизация, о существовании которой вы не знали)
- Коллективный (использует тайный язык жестов команды)
Рассмотрим этот поединок на Python:
Отвратительный вариант
def process_data(input_data):
output = []
for i in range(len(input_data)):
if i % 2 == 0:
output.append(input_data[i].upper())
return output
Питонический шик
def process_even_items(items):
return [item.upper() for index, item in enumerate(items) if index % 2 == 0]
Пересмотренная версия (1) использует чёткие названия, (2) использует enumerate
, и (3) использует списковое включение — три питонических идиомы, которые делают код на 63 % вкуснее (научно доказано в моей кухонной лаборатории).
Питонические идиомы, которые сделают ваш код запоминающимся
1. Дзен эксплицитности
Из питонических писаний (PEP 20): «Эксплицитность лучше, чем имплицитность». Давайте проведём вскрытие на типичном месте преступления:
Функция «Mystery Meat»
def make_complex(*args):
x, y = args
return dict(**locals())
Самодокументируемый код
def create_coordinates(x, y):
return {'x': x, 'y': y}
Усовершенствованная версия (1) раскрывает своё назначение в названии, (2) объявляет параметры явно и (3) избегает колдовства с locals(). Ваши коллеги действительно будут добровольцами просматривать ваши PR!
2. Циклом по-настоящему
Забудьте range(len())
, как в 1999 году. Узрите мощь zip и друзей:
# Поиск совпадений между двумя списками
names = ["Alice", "Bob", "Charlie"]
scores = [95, 89, 92]
# Вместо этого...
for i in range(len(names)):
print(f"{names[i]}: {scores[i]}")
# Сделайте так!
for name, score in zip(names, scores):
print(f"{name}: {score}")
Бонусные баллы: добавьте strict=True
, чтобы перехватывать несоответствующие длины в Python 3.10+.
3. Контекстные менеджеры: ваша бригада уборщиков
# Спектакль «Я забываю закрыть файлы»
file = open('data.txt', 'r')
try:
data = file.read()
finally:
file.close()
# Подход «профессионального взрослого»
with open('data.txt', 'r') as file:
data = file.read()
Контекстные менеджеры автоматически управляют очисткой ресурсов — как робот-дворецкий, который знает, когда вы закончите с посудой.
Идиомы JavaScript: от «работает» до «вау»
Хотя мы сосредоточены на Python, давайте отдадим дань уважения JS двумя быстрыми ударами:
Магия массивов
// Вместо
const results = []
for (let i = 0; i < data.length; i++) {
if (data[i].isValid) results.push(data[i])
}
// Попробуйте
const results = data.filter(item => item.isValid)
Сокращённая запись объектов
const name = 'Alice'
const age = 30
// Вместо {name: name, age: age}
const person = {name, age}
Как стать детективом по идиомам: профессиональные советы
- Рулетка с просмотром кода — найдите самый некрасивый код в своей кодовой базе и преобразите его.
- Сафари по стандартной библиотеке — 80 % питонических решений уже есть в стандартной библиотеке.
- Тренировка по PEP 8 — ежедневно проверяйте свой код, пока правильное форматирование не станет мышечной памятью.
Помните: написание идиоматичного кода — это не про то, чтобы показаться умным, а про то, чтобы быть добрым. Добрым к себе будущему, добрым к своей команде и добрым к тому бедному стажёру, который когда-нибудь унаследует ваш код.
Теперь вперёд и сделайте Гвидо ван Россума гордым! (Или Брендона Эйха, если вы предпочитаете JS. Здесь нет дискриминации по языкам.)