Как создать глубоко вложенную модель данных, которая поддерживает глубокое копирование? - PullRequest
1 голос
/ 01 апреля 2020

Я портирую движок 2D-графики со Swift на Kotlin. Большие части модели данных являются вложенными структурами в Swift. В качестве простого примера:

struct Point {
  var x: Float
  var y: Float
}

struct Size {
  var width: Float
  var height: Float
}

struct Rect {
  var origin: Point
  var size: Size
}

Многие структурные модели глубоко вложены, с гораздо большим количеством уровней, чем здесь. Кроме того, поскольку мы используем struct s вместо class es для большинства типов, значения которых вводятся в Swift, мы можем легко использовать чистые функции для 2D-операций, как в этом небольшом надуманном примере:

func translate(rect1: Rect, dx: Float) -> Rect {
  var rect2 = rect1 // Creates a mutable deep copy
  rect2.origin.x += dx
  return rect2
}

Такой подход обеспечивает нам высокую производительность, отсутствие проблем с обработкой памяти (все работает в стеке) и отличную тестируемость. Поскольку struct s имеют типизированное значение, мы не можем случайно создать мелкие копии и изменить неправильные объекты.

Какой идиоматический c способ создания такой модели в Kotlin?

Похоже, классы данных Kotlin являются решением, но я не знаю, как Копирование глубоко вложенных классов данных обычно выполняется. Вы создаете собственные методы deepCopy () везде?

Должен ли я беспокоиться о производительности, если вызов метода copy () / deepCopy () запускает поток другой функции copy () / deepCopy (), вызывающей модель? (С точки зрения C программиста, я вижу тысячи маленьких, недолговечных выделений в куче)

...