3

我的应用程序中有一个文本框,用户可以输入任何内容。我正在创建一个控制器,它根据关键字解释一些命令。

用户可以选择是否设置密码。取决于这一点,我的解释器要么期望密码,要么不期望密码。

例如,如果设置了密码并且用户输入:“password1 显示列表”。解释器检查第一个单词中的密码,然后检查命令(显示)和参数(列表)。

如果没有设置密码,用户输入“显示列表”并且解释器理解。

我目前的代码是:

// 'words' is a String array which contains the user input.

if (passwordEnabled()==true) {

    if (words[0].contentEquals(getPassword())
                    && words[1].contentEquals("show")
                    && words[2].contentEquals("list")) {

        // Perform action

    }
}
else {

    if (words[0].contentEquals("show")
                    && words[1].contentEquals("list")) {

        // Perform action

    }

}

我的问题是,是否有更有效/更好的方式来处理命令?我确信我的方法是非常粗暴的。

4

3 回答 3

2

如果用户可以记住命令的语法,那么您的方式(或任何基于语法的方法)是可以的。

如果您想在用户用不受限制的自然语言表达意图时理解他们,您需要做一些Natural Language Understanding

像 Wit ( http://wit.ai ) 这样的东西可能会为您完成这项工作。它基于机器学习。它将自由文本句子转换为具有用户意图和规范化参数的 JSON。

于 2013-09-07T20:10:33.317 回答
1

如果您尝试设计基于“语言”的系统,在您询问命令的地方,您应该根据系统复杂性考虑两种可能的方法:

  • 构建系统的有限自动机。您的 if 语句是这种结构的非常基本的形式,但将其定义为实际的自动机,其中您有状态和将您移动到另一个状态的命令 - 是一种非常干净和通用的方法。
  • 构建语法+解释器/编译器。将正确的命令定义为语法(+编译器)规则将使您在表达可能的命令和动作方面更有能力。

当然,这些不是交替的解决方案 - 为语言构建语法是一个非常广泛的事情,应该用于解析命令,而有限状态自动机用作内部存储器和可能动作的定义。

于 2013-09-07T09:50:52.830 回答
1

同意建立语法或有限自动机是这样做的正确方法。

如果你想要一个简单的方法,你可以像这样简化你的代码:

if (passwordEnabled()) {
    if  (! words.get(0).contentEquals(getPassword()))
    {
        // wrong password
        return;
    }
    words.remove(0); // skip password
}

if (words.get(0).contentEquals("show")
                && words.get(1).contentEquals("list")) {

    // Perform action

}

假设您使用ArrayListfor words

于 2013-09-07T10:29:13.097 回答