И что делать вместо

В компьютерных науках есть только две сложные вещи: аннулирование кеша и присвоение имен.

– Фил Карлтон

Называть вещи трудно. Но, следуя некоторым эвристикам, мы можем сделать это немного проще. В этой статье я расскажу об одном из моих любимых.

Допустим, вы хотите вычислить площадь фигуры. Для этого вы пишете большую красивую функцию:

def calculate_area(shape):
  return do_some_stuff()

Мы можем сделать это имя короче, выразительнее и элегантнее без потери информации:

def area(shape):
  return do_some_stuff()

Функции calculate_area() и area() означают одно и то же.

Выбор глагола действия

Одна из веских причин неиспользовать глаголы действия в своих функциях заключается в том, что их сложно выбрать. Имя должно было быть calculate_area или compute_area? Как насчет get_area или find_area? Все эти имена были бы вполне разумными, но они несут не больше информации, чем короткое элегантное имя area .

Функции делают вещи

Если что-то является функцией, вы можете быть уверены, что она делает что-то. Добавление бессмысленных глаголов действия перед тем, что функция на самом деле генерирует, вычисляет или делает, ничего не добавляет и на самом деле ухудшает читабельность, потому что это затрудняет придумывание соглашения, которое вы будете использовать сегодня.

Называть функции с помощью глаголов — это здорово, когда это возможно — некоторые известные примеры, которые приходят на ум, — это plot(), run(), write() или read(). Но не бойтесь использовать существительные сами по себе, когда нет хорошей замены. Если это функция, она будет прочитана так, как будто она что-то делает.

Лучшие библиотеки в бизнесе

Существует огромное количество примеров функций, смысл которых ясен без лишних глаголов действия. Они являются частью стандартных библиотек и одними из самых популярных сторонних программ, когда-либо написанных. Вот лишь некоторые из них, которые вы могли видеть:

mean()
floor()
ceiling()
median()
length()
size()

Заметное исключение — set()

Есть одно исключение, которое я часто делаю из этого правила, и оно касается определенного типа функции — функции, имеющей побочные эффекты. К ним относятся функции, которые изменяют свои входные аргументы (пожалуйста, не делайте этого), а также функции, которые изменяют переменные экземпляра. Например:

class Shape:
  def set_area(width, height):
    self.width = width
    self.height = height
    self.area = width * height

На первый взгляд вы можете возразить, что set — это просто пустой глагол действия, который не добавляет никакой информации. Эта функция просто вычисляет площадь, верно?

Неправильный.

Эта функция в первую очередь изменяет экземпляр класса, которому она принадлежит. Поскольку мы не можем видеть внутренности функции при ее вызове, добавление к ней set_ дает нам понять, что она изменяет состояние класса, из которого она вызывается. Это может привести к возникновению ошибок, которые трудно отследить, и по этой причине использование set_ в качестве означающего фактически добавляет информацию к функции.

Заключительные мысли

Называть вещи трудно. Но есть эвристики, которым мы можем следовать, чтобы сделать это немного проще.

Так что используйте глаголы действия, когда можете, но не бойтесь использовать только короткие существительные для обозначения функций, если вам нужно добавить в начало слово, такое как calculate или generate. length() работает очень хорошо.