0

以下は、私たちの会社で他の誰かが書いたクラスです。

public class Reader1 extends PdsxAdapterBaseGemsReader {

    @Override
    public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) {
       return new PdsxUserReadOnlyGemsReader(pdsxReadRequest);
    }

    protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader {

           protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest) {
              super(pdsxReadRequest);
           }

           protected ClusterIdEnum getClusterId() {
              return ClusterIdEnum.MARKEPLACE1;
           }

           @Override
           public List<PdsxRecord> readData() {
               List<UserCacheDoImpl> userDos = readUserCacheRecords(req, serverId,startLastModifiedDate, endLastModifiedDate);
               // some code
           }


           private List<UserCacheDoImpl> readUserCacheRecords(PdsxReadRequest req, int serverId, Date startLastModifiedDate, Date endLastModifiedDate) {
              List<UserCacheDoImpl> userDos = new ArrayList<UserCacheDoImpl>();
              BackEndIterator userIter = new BackEndIterator(getClusterId().getId(), serverId, startLastModifiedDate, endLastModifiedDate, READ_BATCH_SIZE);
              //some code
           }


           private PdsxRecord createPdsxRecordFromUserDO(UserCacheDoImpl userCache) {
              //some code
           }

           private void xValidateAttrKey(PdsxAttrKey readAttr) {
              // some code
           }
    }

}

問題文:-

すべてのメソッド名をそのままにして、同じ機能を持つ別のクラスを作成する必要があります。唯一の違いは、この方法です-

protected ClusterIdEnum getClusterId() {
    return ClusterIdEnum.MARKEPLACE1;
}

それはする必要があります

protected ClusterIdEnum getClusterId() {
    return ClusterIdEnum.MARKEPLACE2;
}

したがって、非常に昔ながらの方法でそれを行う必要がある場合は、最初の Reader クラスからすべてをコピーして貼り付け、クラスター ID メソッドを変更して新しい Reader2 クラスを作成できます。それで全部です。しかし、それは良い方法ではありません。

何度も書かずに同じことをする最善の方法を誰か教えてもらえますduplicate codeか?

私は、このようgetLcusterId() methodなコードで、基本クラスの をオーバーライドすることで、このようなことを考えていました-

public class Reader2 extends Reader1 {

    @Override
    public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) {
       return new PdsxUserNewReadOnlyGemsReader(pdsxReadRequest);
    }

    protected static class PdsxUserNewReadOnlyGemsReader extends PdsxUserReadOnlyGemsReader {

       protected PdsxUserNewReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest) {
          super(pdsxReadRequest);
       }

       @Override
       protected ClusterIdEnum getClusterId() {
          return ClusterIdEnum.MARKEPLACE2;
       }
    }
}

最初のクラスではすべてが同じなので、Reader2 クラスに何も実装する必要はありません。をオーバーライドできるというだけですgetClusterId() method

ここで何か不足している場合はお知らせください。

4

1 に答える 1

0

メソッドのシグネチャを変更できる場合はacquireReader、リーダー クラスにフィールドを追加できます。

public class Reader1 extends PdsxAdapterBaseGemsReader {

@Override
public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) {
   return new PdsxUserReadOnlyGemsReader(pdsxReadRequest, clusterId);
}

protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader {
       private ClusterIdEnum clusterId;

       protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) {
          super(pdsxReadRequest);
          this.clusterId = clusterId;
       }

       protected ClusterIdEnum getClusterId() {
          return clusterId;
       }

       //...
}

または、これを Reader1 コンストラクターに追加することもできますが、リーダー オブジェクトの作成時に clusterId を渡すことができます。

public class Reader1 extends PdsxAdapterBaseGemsReader {
       private ClusterIdEnum clusterId;

       public Reader1 (ClusterIdEnum clusterId) {
          this.clusterId = clusterId;
       }

       @Override
       public PdsxReader acquireReader(PdsxReadRequest pdsxReadRequest) {
          return new PdsxUserReadOnlyGemsReader(pdsxReadRequest, clusterId);
       }

protected static class PdsxUserReadOnlyGemsReader extends PdsxAdapterBaseGemsReader.PdsxBaseGemsReader {
       private ClusterIdEnum clusterId;

       protected PdsxUserReadOnlyGemsReader(PdsxReadRequest pdsxReadRequest, ClusterIdEnum clusterId) {
          super(pdsxReadRequest);
          this.clusterId = clusterId;
       }

       protected ClusterIdEnum getClusterId() {
          return clusterId;
       }

       //...
}
于 2012-11-09T21:10:50.257 に答える