gpt4 book ai didi

java - 编写一个更简洁、更模块化的命令解析器

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:14 25 4
gpt4 key购买 nike

我正在使用 Java 为我们在学校项目中编写的 Z80 仿真器编写调试器。调试器从用户读取一个命令,执行它,读取另一个命令,等等。

命令可以是无参数的,有可选参数的,或者有无限数量的参数。参数大多是整数,但偶尔也是字符串。

目前,我们正在使用 Scanner 类来读取和解析输入。 The read-method looks kinda like like this (I'm writing this off the top of my head, not paying attention to syntax nor correctness).

这是在项目开始时编写的一个混编,随着我们向调试器添加越来越多的命令,它很快就失控了。

我对这段代码的主要问题是大量的重复、高水平的 if/else 嵌套以及所有的丑陋之处。

我想请教一下如何让这段代码更加美观和模块化,什么样的模式适合这种程序。

我还想要关于代码风格的更一般性建议。

最佳答案

是的,有一种更简单/更好的方法,尤其是在 Java 或其他 OO 语言中。

首先,基本认识是您的命令解析器是一个有限状态机:START 状态是一个空行(或行开头的索引)。

让我们想想echo :

$ echo foo bat "bletch quux"
  1. 将行分词:

    “echo”“foo”“bar”“bletch quux”

  2. 在 shell 中,语法通常是verb noun noun noun... 所以这样解释吧。您可以使用一系列 if-else if 来做到这一点,但散列更好。您使用字符串作为索引加载散列,并索引其他内容。它可能只是一个数字,将进入一个开关:

(这是伪代码):

  Hashtable cmds = new Hashtable();
enum cmdindx { ECHO=1, LS=2, ...}
cmds.add("echo", ECHO); // ...

// get the token into tok
switch (cmds.get(tok)) {
case ECHO: // process it
// get each successor token and copy it to stdout
break;
...
default:
// didn't recognize the token
// process errors
}

更好的是,您可以应用命令和对象工厂模式。现在你有一个类 Command

  public interface Command {
public void doThis(String[] nouns) ;
public Command factory();
}

public class Echo implements Command {
public void doThis(String[] nouns){
// the code is foreach noun in nouns, echo it
}
public Command factory(){
// this clones the object and returns it
}
}

现在,你的代码变成了

  // Load the hash
Hashtable cmds = new Hashtable();
cmds.add("echo", new Echo()); // one for each command


// token is in tok
// the "nouns" or "arguments are in a String[] nouns
((cmds.get(tok)).factory()).doThis(nouns);

看看这是如何工作的?您在散列中查找对象。你调用factory获取新副本的方法。然后,您使用 doThis 调用该命令的处理方法。

更新

这可能有点一般,因为它使用了工厂模式。为什么要有工厂方法?主要是,您将使用它以便每次执行命令时,“动词”对象(如 Echo 的实例)都可以拥有自己的内部状态。如果不需要状态持久化,可以简化为

  (cmds.get(tok)).doThis(nouns);

现在它只是获取并使用 Echo使用 cmds.add("echo", new Echo()); 实例化时创建的对象.

关于java - 编写一个更简洁、更模块化的命令解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com