有两个功能具有相同的结构,但细节不同.如何消除重复



所以,这里是我的函数:

  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());
    }
}

他们非常相似。问题是,在第一个函数中我有leftRecepientIdx+1,之后在第二个函数中leftRecepientIdx-1leftRecepientIdx-1leftRecepientIdx+1。我可以将两个函数合并为一个函数,并添加一个布尔参数。但是,有没有更好的方法来消除重复?

实现这一点的一种方法是进行重构:

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());
        }
    }
}

send方法封装了基于direction参数的逻辑:+1表示右侧,-1表示左侧。

它们出现的顺序很重要,我建议合并,但我不知道这会做什么。将它们分开,如果这是借来的,这是故意的。

这两个函数都是一些发送函数,其中发送方和接收方不同,可能会发生重置。所以我会尝试制作一个带有参数sender、receiver和boolean reset的函数。

最新更新