我正在学习OO原则和实践我正在用Java开发一个应用程序。
该应用程序是在每个扑克牌之后解析扑克网站发布的手牌历史文本文件,并从文件中提取相同类型的数据,无论手牌历史来自哪个网站。
根据扑克网站的不同,手牌历史文件的格式可能会有很大差异。有些网站每个人都有一个非常人性化的风格,例如:
NL $0.25/$0.50 Texas Hold'em - Tuesday, June 22, 19:55:24 GMT 2010
和其他人都有XML风格。
我的问题是:从文本中解析上面的行时,我应该有单独的类来解析每个元素吗?例如,我应该有一个带有parseStakes()方法的StakesParser类,然后是带有parseCurrency()方法的CurrencyParser类等。或者我应该有一个类可以解析该行并从中获取所有不同的信息位?
对于我要解析的每个东西都有一个单独的类似乎更多OO,但效率较低。有什么建议吗?
作为解析过程的结果,我想要的是一个GameState类,它可以保存扑克单手的所有信息。因此,无论手历史文件来自哪个站点,我都可以创建一个GameState类型的对象,其中包含HHParser类为其解析的所有相关信息。
为此,我认为有一个必须实现的接口是一个好主意,这将确保每个扑克网站的HHParser最终生成一个GameState类。所以接口会有parseStakes(),parseCurrency()等方法。这是正确的方法吗?
让我感到困惑的是,在不同的网站上,信息的顺序不同,所以我可能需要一个控制器类,确保按正确的顺序调用每个方法,具体取决于文本文件的位置。从
对于华夫饼干感到抱歉,但我很感激有关最佳做法的任何指示。
非常感谢提前。 : - )
答案 0 :(得分:4)
我想知道“每个元素的类”策略是否过于细化。我想也许某种工厂可以为特定网站返回正确的解析器实现。
public class ParserFactory {
public static Parser get(String url) {...};
}
所以你最终得到了一个Parser接口,负责返回一些封装扑克牌属性的java bean。
public interface Parser {
public Collection<Hand> parse();
}
你为每个可以获得手的网站实施Parser,从工厂返回正确的网站。我可能会将Commons Digester用于XML站点和ANTLR,甚至可以用于非XML站点的正则表达式。
答案 1 :(得分:1)
由于它只是一行数据,我建议使用单个解析器对象来处理解析货币,赌注等。然后,这个类可以实例化不同的对象来保存数据。
这不违反OO原则,因为解析器类只负责读取文本数据并从中生成Java对象。每个Java对象都有责任保存它的给定数据以供程序使用。