Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Создание абстракции Python: Абстракция с помощью данных

Декартова система координат — не единственный способ графического описания. Другой способ — полярная система. В этом уроке мы познакомимся с ней и узнаем, чем она полезна. Также разберем, как скрывать внутреннюю структуру.

Полярная система координат

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

Polar Coordinate System

Представим, что мы разрабатываем графический редактор по типу 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)
    }

Выводы

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

Важно понимать, что после начала работы через абстракцию данных пути назад нет. Придерживайтесь всегда тех функций, которые вы создали сами. Либо тех, которые вам предоставляет используемая библиотека.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»