Java OO概念在展平时是否更好或包含不必要的流程以简化使用?

时间:2013-02-20 09:55:03

标签: java oop object-oriented-analysis

说,我为类型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);
   }
}

最终,我考虑允许多种类型的解析器,所以每次我们可以提供自己的解析器来增加它的灵活性。这被认为是弊端吗?

3 个答案:

答案 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更有意义。

Factory Pattern

的链接

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

这取决于你对getData()方法的使用。在第一种情况下,你从方法中检索String,然后使用JsonDataParser对象来转换它。在第二种情况下,你将DataRetriever类紧密耦合JsonDataParser对象,这不是一个好习惯。假设您想稍后更改您的JsonDataParser类。您必须在那种情况下更改代码DataRetriever。从设计角度来看,第二种方法更好