以下は、私たちの会社で他の誰かが書いたクラスです。
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
。
ここで何か不足している場合はお知らせください。