0

说,我有 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;
   }
}

问题是,在主类中编写如下代码更好吗(方法-A)

DataObject d = new JsonDataParser().parseData(new DataRetriever().getData());

或者修改 DataRetriever 以在内部包含 Json 解析(方法-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);
   }
}

最终,我正在考虑允许多种类型的解析器,这样每次我们都可以提供自己的解析器来增加它的灵活性。这被认为是某种渎职行为吗?

4

3 回答 3

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。

工厂模式链接

于 2013-02-20T09:59:42.277 回答
1

这取决于您对方法的使用。getData() 在第一种情况下,您从方法中检索字符串,然后使用 JsonDataParser 对象对其进行转换。在第二种情况下,您将 DataRetriever 类与 JsonDataParser 对象紧密耦合,这不被视为一个好的做法。假设您想稍后更改 JsonDataParser 类。在这种情况下,您还必须更改代码 DataRetriever。从设计的角度来看,第二种方法更好

于 2013-02-20T10:03:42.100 回答
1

取决于您调用该方法的频率。通常,您会将新的 JsonDataParser() 放在对象将保持活动状态直到下一个 parseData(...) 的位置。例如作为 DataRetriever 的对象属性。

编辑:这反过来也需要您的 DataRetriever 对象保持活力。如果这是针对网站(例如 Tomcat 或其他 Servlet 容器),您应该查看 tomcat 将对象放入 servlet 或应用程序上下文的功能。

于 2013-02-20T09:58:04.043 回答