2016-04-09 6 views
2

So, hier ist meine Funktionen:Es gibt zwei Funktionen mit der gleichen Struktur, aber verschiedenen Details. Wie man Doppelarbeit loswird?

private void sendLeft() { 
    leftSendersIndexes = newLeftSendersIndexes; 
    Agent rightRecepient; 
    int rightRecepientIdx = 0; 
    Agent leftSender; 
    for (int i = 0; i < leftSendersIndexes.size(); i++) { 
     rightRecepientIdx = leftSendersIndexes.get(i) + 1; 
     rightRecepient = list.get(rightRecepientIdx); 
     leftSender = list.get(rightRecepientIdx - 1); 
     rightRecepient.setNewLeftMsg(leftSender.getLeftMsg()); 
     rightRecepient.setLeftMsg(0); // reset left messages 
    } 
} 

private void sendRight() { 
    rightSendersIndexes = newRightSendersIndexes; 
    Agent leftRecepient; 
    int leftRecepientIdx = 0; 
    Agent rightSender; 
    for (int i = 0; i < rightSendersIndexes.size(); i++) { 
     leftRecepientIdx = rightSendersIndexes.get(i) - 1; 
     leftRecepient = list.get(leftRecepientIdx); 
     rightSender = list.get(leftRecepientIdx + 1); 
     leftRecepient.setNewRightMsg(rightSender.getRightMsg()); 
    } 
} 

Sie sind sehr ähnlich. Das Problem ist, dass ich in der ersten Funktion habe ich leftRecepientIdx+1 und danach leftRecepientIdx-1 und ich habe leftRecepientIdx-1 und leftRecepientIdx+1 in zweiter Funktion. Ich kann zwei Funktionen in einem kombinieren und einen booleschen Parameter hinzufügen. Aber gibt es einen besseren Weg, um Doppelarbeit loszuwerden?

+0

Sie sind sehr ähnlich. Sind sie ähnlich genug? –

+0

können Sie die Unterschiede vielleicht in verschiedenen Verhaltensklassen kodieren und Zusammensetzung verwenden, um das unterschiedliche Verhalten zu delegieren ... –

+0

Es ist eine Frage der Meinung, aber für mich sehen sie ausreichend anders aus, dass der Versuch, sie zu einem zu kombinieren, ein totales Durcheinander schaffen würde wenn's und ternäre Operatoren. –

Antwort

0

Die Reihenfolge, in der diese erscheinen, ist wichtig, ich würde vorschlagen, zu verschmelzen, aber, ich habe keine Ahnung, was das tun würde. Halten Sie sie getrennt, wenn dies ausgeliehen wurde, wurde dies absichtlich gemacht.

0

Beide Funktionen sind einige Sendefunktionen, bei denen Sender und Empfänger unterschiedlich sind und zurückgesetzt werden können. Also würde ich versuchen, eine Funktion mit den Argumenten Sender, Empfänger und Boolean Reset zu machen.

1

Eine Möglichkeit, das zu tun, ist mit diesem Refactoring:

private void sendLeft() { 
    leftSendersIndexes = newLeftSendersIndexes; 
    send(leftSendersIndexes, -1); 
} 

private void sendRight() { 
    rightSendersIndexes = newRightSendersIndexes; 
    send(rightSendersIndexes, +1); 
} 

private void send(List<Integer> indexes, int direction) { 
    for (int i = 0; i < indexes.size(); i++) { 
     int recipientIdx = indexes.get(i) - direction; 
     Agent recipient = list.get(recipientIdx); 
     Agent sender = list.get(recipientIdx + direction); 
     if (direction == -1) { 
      recipient.setNewLeftMsg(sender.getLeftMsg()); 
      recipient.setLeftMsg(0); // reset left messages 
     } 
     else { 
      recipient.setNewRightMsg(sender.getRightMsg()); 
     } 
    } 
} 

Die send Methode kapselt die Logik auf der Grundlage der direction Parameter: 1 für rechts, -1 für links.

Verwandte Themen