Может ли быть хорошим примером использования объекта-компаньона (статического) таким образом? - PullRequest
0 голосов
/ 06 июля 2018

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

Поэтому я почувствовал необходимость управлять, объективизировав Action, и реализовал это следующим образом.

1. Реализация RecoverableAction

abstract class RecoverableAction {
    abstract fun getActionName(): String
    abstract fun run()
    abstract fun undoActionName(): String

    enum class List(val action: RecoverableAction) {
        CONTAINER_CREATE(ContainerActions.CREATE), 
        CONTAINER_COPY(ContainerActions.COPY), 
        CONTAINER_DELETE(ContainerActions.DELETE)
    }
}

2. Реализация Actions для Redo

    class ContainerActions private constructor() {
        companion object {
            val CREATE = object : RecoverableAction {
                override fun run() {
                    //do create
                }
                override fun getActionName() = List.CONTAINER_CREATE.name
                override fun undoActionName() = List.CONTAINER_DELETE.name
            }

            val DELETE = object : RecoverableAction {
                override fun run() {
                    //do create
                }
                override fun getActionName() = List.CONTAINER_CREATE.name
                override fun undoActionName() = List.CONTAINER_DELETE.name
            }

            val COPY = object : RecoverableAction {
                override fun run() {
                    //do copy
                }
                override fun getActionName() = List.CONTAINER_CREATE.name
                override fun undoActionName() = List.CONTAINER_DELETE.name
            }
        }
    }

3. Do Action в любом месте 2 пути

    CotainerActions.CREATE.run()
    RecoverableAction.List.CONTAINER_COPY.action.run()

Мне не нравится использовать static переменные, но я не хочу, чтобы каждый Action создавался каждый раз, когда он выполняется пользователем. Я также реализовал его как companion, чтобы я мог запустить соответствующий Action напрямую из нескольких разных классов.

Кроме того, мне нужно реализовать функцию redo, управляя действиями, выполняемыми пользователем как stack. Причина, по которой я реализовал действие, поддерживаемое RecoverableAction как enum, заключается в том, что я хочу управлять им в Action record stack с помощью name, а не Action object.

Я много думал о разработке структуры для реализации этих требований, но я думаю, что это может быть хорошей структурой. Может ли это быть "хороший путь"?

1 Ответ

0 голосов
/ 06 июля 2018

Для меня

RecoverableAction.List.CONTAINER_COPY.action.run ()

Кажется грязным.


Почему бы и нет:

sealed class RecoverableActions {
    abstract val actionName: String

    abstract val undoActionName: String

    abstract fun run()

    object CreateAction : RecoverableActions() {
        override fun run() {
            //do create
        }
        override val actionName = CreateAction::class.java.simpleName
        override val undoActionName = DeleteAction::class.java.simpleName
    }

    object DeleteAction : RecoverableActions() {
        override fun run() {
            //do create
        }
        override val actionName = DeleteAction::class.java.simpleName
        override val undoActionName = CreateAction::class.java.simpleName
    }

    object CopyAction : RecoverableActions() {
        override fun run() {
            //do create
        }
        override val actionName = CopyAction::class.java.simpleName
        override val undoActionName = CopyAction::class.java.simpleName // ?
    }
}

И

RecoverableActions.CreateAction.run()
...