изменить внутреннюю часть цикла без тестирования - PullRequest
0 голосов
/ 10 октября 2011

допустим, у меня есть следующие циклы:

for(int i=left; i < right; i++) {
    for(int j=top; j < bottom; j++) {
        if(tilesMap[i][j])
            (tilesMap[i][j])->Draw(window) ;
    }
}

и

for(int i=left; i < right; i++) {
    for(int j=top; j < bottom; j++) {
        (tilesMap[i][j])->Draw(window) ;
    }
}

Есть ли какой-нибудь способ, которым я могу сделать это "универсальным", то есть, если какое-то логическое значение истинно, я назову первый сегмент кода, если нет, я назову второй сегмент кода. Я, очевидно, мог бы выполнить тест перед циклом и переходом в правом цикле, но затем я должен продублировать «заголовок» цикла и инструкцию внутри, а также менять его дважды каждый раз, когда я изменяю код внутри цикла. Другое решение состоит в том, чтобы делать тесты внутри lopp на каждой итерации, но это приведет к слишком большому количеству тестов во время выполнения. Есть ли другой способ сделать это? спасибо

РЕДАКТИРОВАТЬ: это просто вопрос, насколько мне известно, я прекрасно справляюсь с дублированием моего кода на такое небольшое количество

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Вы можете использовать указатель на функцию (i, j).

Или объект.Если вы используете C ++, вы можете сделать это объектно-ориентированным способом, то есть с помощью виртуального метода и наследования.Для этого потребуется много строк исходного кода, но это будет чистый код.: -)

1 голос
/ 10 октября 2011

Предсказатели ветвей работают достаточно хорошо.

Тем не менее, вы можете обернуть два тела цикла в объекты стратегии, выполнить тест вне цикла один раз, чтобы выбрать один, и поручить делегирование тела цикла методу стратегии.

1 голос
/ 10 октября 2011

IMO, этот код достаточно мал, чтобы просто дублировать цикл. Я бы согласился с незначительным дублированием кода, если оно сделает его более читабельным и повысит производительность.

Я бы сказал, что размещение теста внутри цикла может затруднить чтение, поскольку увеличивает глубину вложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...