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解析をinside(Method-B)に含めます。

class DataRetriever{
   public DataObject getData(){
      // Get data from server using URL 
      return new JsonDataParser().parseData(jsonDataString);
   }
}

結果はどちらの場合も同じですが、概念的には、Method-AまたはMethod-Bを使用してコーディングする方がよいでしょうか。

私は通常、メソッド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

メソッドを呼び出す頻度によって異なります。通常、新しいJsonDataParser()は、次のparseData(...)までオブジェクトが存続する場所に配置します。たとえば、DataRetrieverのオブジェクトプロパティとして。

編集:これにより、DataRetrieverオブジェクトも存続する必要があります。これがWebサイト(Tomcatやその他のサーブレットコンテナなど)の場合は、tomcatの機能を調べて、オブジェクトをサーブレットまたはアプリケーションのコンテキストに配置する必要があります。

于 2013-02-20T09:58:04.043 に答える
1

これは、メソッドの使用法によって異なりますgetData() 。最初のケースでは、メソッドから文字列を取得し、後でJsonDataParserオブジェクトを使用して変換します。2番目のケースでは、DataRetrieverクラスをJsonDataParserオブジェクトと緊密に結合しています。良い習慣です。後でJsonDataParserクラスを変更したいとします。その場合は、コードDataRetrieverも変更する必要があります。SOは設計パースペクティブから、2番目のアプローチの方が優れています。

于 2013-02-20T10:03:42.100 に答える