2016-10-05 2 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); 
    } 
} 

В этом методе, например, я хочу избавиться от параметра mode и вместо этого выполнить два метода. Дело только в том, что изменения - это внутреннее условие и логика, но все остальное одинаково. Как избежать или свести к минимуму дублирование кода в этом случае?

+0

Ну самый простой способ был бы сделать этот метод 'private', а затем сделать два новых' методы public', которые не используют 'mode'. Попросите каждый из этих двух методов использовать этот режим с правильным «режимом». Однако я не уверен, что это удовлетворяет вашим требованиям. – Zircon

+0

Пожалуйста, напишите минимальный пример, я едва могу прочитать код –

+0

Вы можете передать лямбда, чтобы определить, какую операцию выполнить. –

ответ

0
  • Сначала оптимизируйте читаемость. Оптимизируйте только производительность во время выполнения, только если есть веские основания. «преждевременная оптимизация - это корень всего зла в программировании»
  • У вас есть отдельный класс SequenceCollection, поэтому вы можете нажать на него логику домена; Вы можете решить, должен ли он составлять или наследовать от ArrayList. Ради простоты (я не знаю остального кода), я сделал последнее. Но, как правило, вы должны одобрять композицию над вмешательством.
  • Используйте функцию upsert, которая принимает Лямбду, чтобы избавиться от дублирования
  • Не используйте такие параметры, как 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)); 
} 
Смежные вопросы