构造解析器类的最佳方法

时间:2014-02-27 04:07:21

标签: java c++ oop design-patterns

我正在开发一个项目,我需要解析一个文本文件并使用该信息来进行一些数据操作。

我有一个解析器类,我使用一个数组来存储文本文件中的数据。然后我有一个单独的类使用这些数据。我目前的设置是这样的(显然是伪代码):

class Parser{

private:
 array parsedData;

public:
 inline array getParsedData(){
     return parsedData;
 }

};

class algorithms{


//functions that use data from parsedData array;

};

我觉得拥有一个私有数组然后只有一个只返回我可以抛出的数组的公共函数是相当低效的。我觉得有更好的方法来构建它。关于如何构建代码的任何建议?

2 个答案:

答案 0 :(得分:2)

你是对的,因为这里有很多问题:

  • 你的解析器会被重用吗?
  • 是否需要线程安全?
  • 您是在解析大量文本文件吗?在这种情况下,缓存已解析的数据将不如“流式传输”它有效。

如果你有一个相对较小的文本文件,并且你只想在一个线程上使用你的解析器一次,那么可以

  • 将数组初始化为null
  • 确保数组字段为私有且没有setter
  • 使用parse方法读取文本文件并设置数组字段的值
  • 如果数组字段不为空,则parse抛出异常。

然而,这很复杂。小文本文件的另一种方法,但您需要多次解析:

  • 解析器只有一个名为parse的静态方法,它接收文本文件并返回解析后的令牌数组。

单方法方法的好处在于,您不需要将令牌数组管理为有状态的复杂功能。你有一个较小的界面,这很好。

最后,如果您有一个大文本文件,请让您的parse方法将标记生成为流。

答案 1 :(得分:1)

在Java中,至少“return parsedData”将返回对“私有数组”的引用。

然后,调用程序可以使用parsedData执行它喜欢的任何操作;

所以它非常有效,因为只传递了一个地址,但是,如果你的目的是在你的类中保留一个私有的不可变副本,那么你需要返回一个效率较低的parsedData副本。

在c ++中,您需要显式返回引用或副本,但是,在Java中,您可以返回引用。