说,我为类型DataObject提供了Json解析器类,如下所示:
class JsonDataParser{
public DataObject parseData(String data){
// Parse data
return dataObject;
}
}
现在我必须连接到服务器以获取Json,所以我有这个:
class DataRetriever{
public String getData(){
// Get data from server using URL
return jsonDataString;
}
}
问题是,在主类(Method-A)
中编码如何更好DataObject d = new JsonDataParser().parseData(new DataRetriever().getData());
或者修改DataRetriever以包含Json解析(Method-B),如下所示:
class DataRetriever{
public DataObject getData(){
// Get data from server using URL
return new JsonDataParser().parseData(jsonDataString);
}
}
结果在两种情况下都是相同的,但从概念上讲,使用Method-A或Method-B进行编码会更好吗?
我通常会创建一个控制器类来跟随Method-A,但我不确定这是否有效。
修改
事实上,我正在考虑在解析Json时使用GenericType和Interface。所以我准备了以下内容:
public interface IJsonParser<T> {
public T parseJSON(String jsonString);
public T parseJSON(JSONObject jsonObject);
}
然后将其添加到DataRetriever的构造函数中,如下所示:
class DataRetriever<T>{
private IJsonParser<T> parser;
public DataRetriever(IJsonParser<T> parser){
this.parser = parser;
}
public DataObject getData(){
// Get data from server using URL
return new JsonDataParser().parseData(jsonDataString);
}
}
最终,我考虑允许多种类型的解析器,所以每次我们可以提供自己的解析器来增加它的灵活性。这被认为是弊端吗?
答案 0 :(得分:3)
在这里你不应该看到效率,因为两者同样有效。但是,不应该这样做,而应该考虑类的未来可扩展性。
在这个问题上,我认为方法B 会很好,因为你可以在将来改变解析器以及其他一些解析器。
class DataRetriever{
private DataParser dataParser;
public DataRetriever(){
dataParser = new JsonDataParser(); //tomorrow this can be changed to something else
}
public DataObject getData(String data){
// Get data from server using URL
return dataParser.parseData(data);
}
}
<强>更新强>: 如果您正在为此寻找合适的OOP解决方案,那么您应该使用工厂模式,它将根据您提供的类型返回解析器的实例。
class ParserFactory{
//get parser
public DataParser createParser(int type){
//creates the new parser based on type and returns it
}
}
这会更好,因为解析器的创建将是工厂的责任,这将使IMO更有意义。
的链接答案 1 :(得分:1)
取决于您调用该方法的频率。通常你会把新的JsonDataParser()放在对象保持活着的地方,直到下一个parseData(...)。例如,作为DataRetriever的对象属性。
编辑: 反过来,这也需要您的DataRetriever对象保持活跃。如果这是针对网站(例如Tomcat或其他Servlet容器),您应该查看tomcat的功能,将对象放入servlet或应用程序上下文中。
答案 2 :(得分:1)
这取决于你对getData()
方法的使用。在第一种情况下,你从方法中检索String,然后使用JsonDataParser对象来转换它。在第二种情况下,你将DataRetriever类紧密耦合JsonDataParser对象,这不是一个好习惯。假设您想稍后更改您的JsonDataParser类。您必须在那种情况下更改代码DataRetriever。从设计角度来看,第二种方法更好