'这是一个设计和技术代码方面的问题,所以在我对一个随机项目进行一些重构以使其更新时,我遇到了以下部分,一个密封类上的中缀函数正在执行某种验证:
infix fun TaskState.allowsOperation(operation: TaskOperation): Boolean {
return when (this) {
TaskState.Scheduled -> {
when (operation) {
TaskOperation.Start -> true
TaskOperation.Stop -> false
TaskOperation.Pause -> false
TaskOperation.Resume -> false
}
}
TaskState.Running -> {
when (operation) {
TaskOperation.Start -> false
TaskOperation.Stop -> true
TaskOperation.Pause -> true
TaskOperation.Resume -> false
}
}
TaskState.Stopped -> {
when (operation) {
TaskOperation.Start -> false
TaskOperation.Stop -> false
TaskOperation.Pause -> false
TaskOperation.Resume -> false
}
}
TaskState.Suspended -> {
when (operation) {
TaskOperation.Start -> false
TaskOperation.Stop -> true
TaskOperation.Pause -> false
TaskOperation.Resume -> true
}
}
TaskState.Terminated -> {
when (operation) {
TaskOperation.Start -> true
TaskOperation.Stop -> false
TaskOperation.Pause -> false
TaskOperation.Resume -> false
}
}
TaskState.Created -> {
when (operation) {
TaskOperation.Start -> true
TaskOperation.Stop -> false
TaskOperation.Pause -> false
TaskOperation.Resume -> false
}
}
}
}
所以基本上,发生了什么是糖语法添加,它允许在其他部分像这样调用代码:
if (task.state allowsOperation operation) doSomething()
但是,我发现那堆特定的代码看起来很难看,我想不出另一种合理的方法来做这件事,但同时又不会产生太多的变化。
TaskState 和 TaskOperation 只是一些密封类:
sealed class TaskState {
object Created : TaskState()
object Scheduled : TaskState()
object Running : TaskState()
object Stopped : TaskState()
object Terminated : TaskState()
}
sealed class TaskOperation {
object Start : TaskOperation()
object Stop : TaskOperation()
object Pause : TaskOperation()
object Resume : TaskOperation()
}
你对如何重构这种类型的东西有什么建议吗?