Декартова система координат — не единственный способ графического описания. Другой способ — полярная система. В этом уроке мы познакомимся с ней и узнаем, чем она полезна. Также разберем, как скрывать внутреннюю структуру.
Полярная система координат — это двухмерная система координат, в которой каждая точка на плоскости определяется двумя числами: полярными углом и радиусом. Полярная система полезна в случаях, когда отношения между точками проще изобразить в виде радиусов и углов. В более распространенной декартовой или прямоугольной системе координат такие отношения можно установить только с помощью тригонометрических уравнений.
Представим, что мы разрабатываем графический редактор по типу Photoshop. Библиотека для работы с графическими примитивами построена на базе декартовой системы координат. Мы понимаем, что переход на полярную систему поможет сделать работу проще и быстрее. Но для этого придется переписать практически весь код:
point = {"x": 2, "y": 3}
symmetrical_point = {
"x": -point["x"],
"y": point["y"],
}
Связано это с тем, что наша библиотека не скрывает внутреннюю структуру. Любой код, который использует точки или отрезки, знает о том, как они устроены внутри. Это относится как к коду, который создает новые примитивы, так и к коду, извлекающий из них составные части.
Изменить ситуацию и спрятать реализацию можно с помощью функции:
point = make_point(3, 4)
symmetrical_point = make_point(-get_x(point), get_y(point))
В примере мы видим три функции: make_point()
, get_x()
и get_y()
:
make_point()
называется конструктором, потому что она создает новый примитивget_x
и get_y
называются селекторами или selector — от слова select. Это в переводе означает «извлекать» или «выбирать»Такое небольшое изменение приведет к долгосрочным последствиям. Главное, что в прикладном коде, который использует библиотеку, нет работы со структурой напрямую:
# То есть мы работаем не так
point = [1, 4] # мы знаем, что это список
print(point[1]) # прямое обращение к списку
# А так
point = make_point(3, 4) # мы не знаем как устроена точка
print(get_y(point)) # мы получаем доступ к частям только через селекторы
Если посмотреть на этот код, нельзя сказать, что представляет точка изнутри, и какими конструкциями языка она представлена. Так мы построили абстракцию данных.
Суть абстракции заключается в том, что мы скрываем внутреннюю реализацию. То есть создание абстракции с помощью данных скрывает эти данные от внешнего кода.
Посмотрим на один из способов реализовать абстракцию для работы с точкой:
def make_point(x, y):
return {"x": x, "y": y}
def get_x(point):
return point["x"]
def get_y(point):
return point["y"]
Теперь мы можем менять реализацию и не переписывать весь код. При этом иногда придется переписывать отдельные части кода.
В этом примере мы используем функцию make_point()
, которая создает точку на основе декартовой системы координат. Она принимает на вход координаты x
и y
. При этом внутри она может представляться в полярной системе координат. Получается, что во время конструирования один формат транслируется в другой:
import math
def make_point(x, y):
# конвертация
return {
"angle": math.atan2(y, x),
"radius": math.sqrt(x ** 2 + y ** 2)
}
В этом уроке мы познакомились полярной системой координат и узнали, чем она полезна. Также разобрали, как скрывать внутреннюю структуру.
Важно понимать, что после начала работы через абстракцию данных пути назад нет. Придерживайтесь всегда тех функций, которые вы создали сами. Либо тех, которые вам предоставляет используемая библиотека.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт