Как Еще Использовать Безопасность Типов Для Улучшения Api

Всем привет! Я ведущий разработчик cocos2d-objc. В настоящее время мы находимся в процессе портирования на Swift. Я планирую освещать процесс разработки, рассказывать об архитектурных решениях и т. д. Пока проект все еще на стадии проверки концепции, поэтому сегодня я расскажу лишь о небольшой хитрости, которая, на мой взгляд, имеет сделали нашу математическую библиотеку немного лучше.

Если интересно, смотрите кат.

Как еще использовать безопасность типов для улучшения API

Прежде чем начать переписывать движок на Swift, стала очевидна необходимость современной библиотеки для математических нужд. Изначально движок был ориентирован на X-платформу, поэтому мы не могли использовать типы CG*, а API CoreGraphics не был для нас достаточно Swift. Существующие решения нас не удовлетворили, поэтому мы решили написать свой велосипед, придерживаясь при этом определенного аскетизма.

Мы ограничились скромным набором типов: Vector2f, Vector3f, Vector4f, Matrix3f, Matrix4f, Rect .

Мы твердо решили, что хотим полностью устранить накладные расходы ARC и определенно хотим иметь поддержку.

SIMD (по крайней мере, для Дарвин платформы для Глибк пока алгоритмы писались вручную, пока simd не стал общедоступным), по этой причине пришлось отказаться от дженериков и строить всю библиотеку на типе Плавать , без поддержки Двойной .

Ок, я понимаю, что вам это не интересно, это введение.

О чем эта статья? В какой-то момент мы поняли, что API, работающий с углами (например, методы создания матрицы вращения и т. д.), нуждается в доработке.

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

Изначально мы хотели создать псевдонимы для Float, например:

  
  
  
   

typealias Radians = Float; typealias Degrees = Float;

Понятно, что это не особо помогает, потому что.

Еще есть вероятность передать в метод неправильное значение.

Мы также рассмотрели создание функций rad() и deg(), которые возвращали бы желаемое значение.

Варианты расширений Int и Float, а также их литералы вида

45.degrees 180.radians

Нам это не понравилось, потому что.

разрешено делать:

180.radians.radians

В результате было принято решение создать для типа Угол отдельную структуру:

/// A floating point value that represents an angle public struct Angle {

Теги: #swift 3 #безопасность типов #методы #математика #Cocos2d #Fiber2D #строгая типизация #разработка для iOS #Swift #разработка для MacOS

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.