서버와 아직 연결 하지 않았을 때, 화면에 잘 그리기 위한 구조로 저장

일단 노드에 저장되어야 할 정보는 다음과 같다.

Parent의 정보도 저장하고 있어야할 지 고민했는데, Node를 그리기 위해서는 어차피 Root Node를 기반으로 한번 순회가 이루어지고, 그때 parent Node를 알고 있기 때문에 저장할 필요는 없다고 생각했다. 오히려 나중에 이동 기능을 추가하게 된다면 parent도 같이 바꿔줘야 한다는 점에서 chileren만 저장하고 있으면 될 것 같다고 생각했다.

또, 디자인 설계상 Root Node는 동그라미, 하위 노드들은 사각형으로 설계되어야 했다.

동그라미와 사각형은 그리기 위한 정보가 달랐기 때문에, 이를 상속 구조로 구현하고자 했다.

최종적으로 다음과 같이 설계했다.

sealed class Node(
    open val path: NodePath,
    open val description: String,
    open val children: List<Node>,
)

data class CircleNode(
    override val path: CirclePath,
    override val description: String,
    override val children: List<Node>,
) : Node(id, parentId, path, description, children)

data class RectangleNode(
    override val path: RectanglePath,
    override val description: String,
    override val children: List<Node>,
) : Node(id, parentId, path, description, children)
sealed class NodePath(open val centerX: Dp, open val centerY: Dp)

data class RectanglePath(
    override val centerX: Dp,
    override val centerY: Dp,
    val width: Dp,
    val height: Dp,
) : NodePath(centerX, centerY) {
    fun leftX() = centerX - (width / (Dp(2f)))

    fun topY() = centerY - (height / (Dp(2f)))

    fun rightX() = centerX + (width / (Dp(2f)))

    fun bottomY() = centerY + (height / (Dp(2f)))
}

data class CirclePath(
    override val centerX: Dp,
    override val centerY: Dp,
    val radius: Dp,
) : NodePath(centerX, centerY)

CRDT 알고리즘 적용을 위해 노드 구조 변경

CRDT 알고리즘을 적용을 하면서, undo, redo 등의 연산을 해야되기 때문에 부모가 누구인지 저장해야될 필요성이 있었다.

또, 이전엔 협업이나 CRDT 알고리즘을 고려하지 않고 설계했기 때문에, 노드끼리의 구분이 필요없었다. 그저 그리기 위한 정보만 담고있으면 충분히 그릴 수 있었다.

sealed class Node(
    open val id: String,
    open val parentId: String?,
    open val path: NodePath,
    open val description: String,
    open val children: List<String>,
)

data class CircleNode(
    override val id: String,
    override val parentId: String?,
    override val path: CirclePath,
    override val description: String,
    override val children: List<String>,
) : Node(id, parentId, path, description, children)

data class RectangleNode(
    override val id: String,
    override val parentId: String,
    override val path: RectanglePath,
    override val description: String,
    override val children: List<String>,
) : Node(id, parentId, path, description, children)