我正在编写一个获取网站html源代码的应用程序,并从中解析对象X的列表。
我写了一个课程HTMLGetter
和HTMLParser
,HTMLParser
返回了X列表。
几天之后,这个设计对我来说似乎有点不对劲,我开始认为我应该有一个包含HTMLGetter
的类作为子类,这个新类将返回X的列表(基本上是make {{ 1}} HTMLGetter
)的子类,我们将此类称为HTMLParser
。
但是,现在我不确定如何处理从XsListGetter
返回的HTTP响应代码。
我可以抛出一些异常,但后来我打破了HTMLGetter
的封装。
我可以检查XsListGetter
中的响应代码,如果发生了一些错误则返回null但是我丢失了关于发生了什么问题的信息。
这里的设计是什么?有正确的设计吗?也许与我建议的两个完全不同?
谢谢!
答案 0 :(得分:0)
这是一个个人意见,这就是我要做的事情:
只要有一个班级,就按照你的建议调用它XsListGetter
。你可以把它变成一个单例,或者把它作为一个静态类(让所有方法都是静态的)。
然后,有一种方法来实际获取数据,这将是:
从您提供的URL中获取HTML源代码,并将其放在类中的私有String变量中。
将HTTP状态代码放在另一个私有变量中。
如果完全失败(例如没有互联网连接),也要记录下来。
其次,有另一种方法检查请求是否成功,这将检查请求是否完全失败以及状态代码是否正确。
第三,有一个方法可以将HTML字符串解析为对象列表。
描述我的意思的一些伪代码:
class XsListGetter {
private String sourceHtml;
private boolean requestSucceeded = false;
private int httpStatusCode = 0;
public void fetchHtml(String url) {
try {
sourceHtml = //get the HTML as a string from the url
httpStatusCode = //get the status code of the request, will be 200 if successful
requestSucceeded = true //if we get here, we were successful
} catch (IoException e) {
requestSucceeded = false //otherwise, we didn't succeed
}
}
public boolean requestSucceeded { //allow to check if the request succeeded
return requestSucceeded && httpStatusCode == 200;
}
public List<MyItem> parseHtmlToList() {
return parseHtmlStringToList(sourceHtml); //parse your Html to a list of items here
}
}
然后,在您的调用代码中,您可以像这样使用它:
XsListGetter getter = new XsListGetter();
getter.fetchHtml();
if (getter.requestSucceeded() {
myObjectsList = getter.parseHtmlToList();
} else {
//Show helpful error message
}
当然,有很多不同的方法可以做到这一点,而我的可能不是最好的: - )
有些注意事项:
如果您没有使用HTML解析器,请使用一个!我推荐Jsoup。
你应该进行实验,如果找到更好的方法,就这样做。
我不确切知道你在做什么,所以这可能不是最好的方式。
没有“正确”的设计 - 有很多方法可以做到这一点,每种方法都有优点和缺点。
希望这会有所帮助: - )