2016-10-05 46 views
-2

嗨,我想知道是否有一些模式,以避免代碼重複和ifs情況下這樣的Java。是否有任何方式或模式,以避免這種java代碼複製

public void updateSequence(DN dn, long seq, long countDescriptorId, int mode) { 
    Collection<ResyncNECountSequenceDescriptor> sequencesCollection = 
     sequences.get(dn); 
    ResyncNECountSequenceDescriptor neDescSeq = 
     new ResyncNECountSequenceDescriptor(countDescriptorId, seq); 
    if (sequencesCollection != null && sequencesCollection.size() > 0) { 
     boolean foundSeq = false; 
     for (ResyncNECountSequenceDescriptor sequence : sequencesCollection) { 
      if (sequence.getCountDescriptorId() == countDescriptorId) { 
       if (mode == LAST_CREATED_DATFILE_SEQUENCE) { 
        sequence.setLastCreatedDatfileSequence(seq); 
       } else { 
        if (seq > sequence.getLastCreatedDatfileSequence()) { 
         seq = 0; 
        } 
        sequence.setNextDatfileToProcessSequence(seq); 
       } 
       foundSeq = true; 
      } 
     } 
     if (!foundSeq) { 
      sequencesCollection.add(neDescSeq); 
     } 
    } else { 
     Collection<ResyncNECountSequenceDescriptor> col = new 
      ArrayList<ResyncNECountSequenceDescriptor>(); 
     col.add(neDescSeq); 
     sequences.putIfAbsent(dn, col); 
    } 
} 

在這種方法中,例如,我想擺脫模式的參數,並做兩種方法來代替。事情只是變化是內在的條件和邏輯,但其餘的都是相同的。在這種情況下如何避免或最小化代碼重複?

+0

那麼最簡單的方法是使這種方法'private',然後做出不使用'mode'兩個新的'public'方法。讓這兩個方法中的每一個用相應的'mode'調用這個方法。不過,我不確定這是否符合您的要求。 – Zircon

+0

請發表一個最簡單的例子,我幾乎看不懂代碼 –

+0

您可以傳遞一個lambda來定義要執行的操作。 –

回答

0
  • 首先優化可讀性。僅在有充分的理由時纔對運行時性能進行優化。 「過早優化是編程中所有邪惡的根源」
  • 有一個單獨的SequenceCollection類,因此您可以將域邏輯推送到它;您可以決定是否構成或繼承ArrayList。爲了簡單起見(我不知道其餘的代碼),我做了後者。但通常你應該贊成合作而不是互助。
  • 使用帶Lambda的上插功能以避免重複
  • 不要使用諸如mode之類的參數。這些是control couplings(這很糟糕)。
  • 將業務邏輯(例如序列號溢出)推送給設置者(Tell, don't Ask
  • 通常將單獨可理解的功能分解爲單獨的方法。

這是結果:

private Map<DN, SequenceCollection> sequences; 

class SequenceCollection extends ArrayList<ResyncNECountSequenceDescriptor> { 
    private static final long serialVersionUID = 1L; 

    public void upsert(long countDescriptorId, long seqNumber, 
      Consumer<ResyncNECountSequenceDescriptor> updateFunction) { 
     Optional<ResyncNECountSequenceDescriptor> sequence = findByCountDescriptorId(countDescriptorId); 
     if (sequence.isPresent()) { 
      updateFunction.accept(sequence.get()); 
     } else { 
      this.add(new ResyncNECountSequenceDescriptor(countDescriptorId, seqNumber)); 
     } 
    } 

    public Optional<ResyncNECountSequenceDescriptor> findByCountDescriptorId(long countDescriptorId) { 
     return this.stream() // 
       .filter(seq -> seq.getCountDescriptorId() == countDescriptorId) // 
       .findAny(); 
    } 
} 

class DN { 
} 

class ResyncNECountSequenceDescriptor { 
    private long seqNumber; 

    public ResyncNECountSequenceDescriptor(long countDescriptorId, long seq) { 
    } 

    public long getCountDescriptorId() { 
     return 0; 
    } 

    public void setLastCreatedDatfileSequence(long seq) { 
    } 

    public long getLastCreatedDatfileSequence() { 
     return 0; 
    } 

    public void setNextDatfileToProcessSequence(long seqNumber) { 
     if (seqNumber > getLastCreatedDatfileSequence()) { 
      seqNumber = 0; 
     } 
     this.seqNumber = seqNumber; 
    } 
} 

public void updateLstCreatedSequence(DN dn, long seqNumber, long countDescriptorId) { 
    SequenceCollection sequenceCollection = getSequenceCollection(dn); 
    sequenceCollection.upsert(countDescriptorId, seqNumber, seq -> seq.setLastCreatedDatfileSequence(seqNumber)); 
} 

private SequenceCollection getSequenceCollection(DN dn) { 
    return sequences.computeIfAbsent(dn, k -> new SequenceCollection()); 
} 

public void updateNextSequence(DN dn, long seqNumber, long countDescriptorId) { 
    SequenceCollection sequenceCollection = getSequenceCollection(dn); 
    sequenceCollection.upsert(countDescriptorId, seqNumber, seq -> seq.setNextDatfileToProcessSequence(seqNumber)); 
} 
相關問題