【问题标题】:Best way to structure a parser class [closed]构造解析器类的最佳方法[关闭]
【发布时间】:2014-02-27 04:07:21
【问题描述】:

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

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

class Parser{

private:
 array parsedData;

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

};

class algorithms{


//functions that use data from parsedData array;

};

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

【问题讨论】:

    标签: java c++ oop design-patterns


    【解决方案1】:

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

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

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

    • 将数组初始化为空
    • 确保数组字段是私有的并且没有设置器
    • 有一个parse 方法,它将读取文本文件并设置数组字段的值
    • 如果数组字段不为空,让parse 抛出异常。

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

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

    单一方法方法的好处是您不需要将令牌数组作为有状态的东西进行管理的复杂性。而且你有一个更小的界面,这很好。

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

    【讨论】:

      【解决方案2】:

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

      然后调用程序可以对 parsedData 做任何它喜欢的事情;

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

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

      【讨论】:

      • 但是有没有更优雅的方法呢?
      • +1 关于不变性的必要性很好!恕我直言,这是避免类并从方法返回解析数据的一个很好的理由。
      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2018-12-22
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多