Экстернализации функции


У меня есть следующий блок кода, который я хотел бы рефакторинг в метод, я просто не вижу хороший способ, чтобы получить следующий код в метод, который не имеет множество обязанностей. Вот код блока:

int maxResults = pageable.getMaxResults(userPrefs);
int firstResult;

if (pageData.isLastPage()) {
    int count = getCountFromDb(); //'Heavy' cost associated with this, so we only 
                                  //determine the count if they are on the last page...
    firstResult = getFirstResult(count, maxResults);
    if (count > 0) {
        boolean isFinalPageFull = (count % maxResults) == 0;
        int pageNum = count / maxResults;
        pageData.setPageNumber((isFinalPage) ? pageNum - 1 : pageNum;
    }
} else {
    firstResult = maxResults * pageNumber;
}

Я бы хотел перевести это в метод или два, но мне нужно сделать это только один раз. Это ограничение затуманивает мое видение, как я не могу думать о какой-либо функции, которая следует за один принцип ответственности. Что я могу сделать для достижения моей цели?



176
2
задан 22 июня 2011 в 06:06 Источник Поделиться
Комментарии
1 ответ

Вы могли бы сделать графу поле, то есть функция determineFirstResult(). Тогда setPageNumber блок может быть отделена.

if (pageData.isLastPage()) {
count = getCountFromDb();
if (count > 0) {
boolean isFinalPageFull = (count % maxResults) == 0;
int pageNum = count / maxResults;
pageData.setPageNumber((isFinalPage) ? pageNum - 1 : pageNum;
}
}
firstResult = determineFirstResult();

...

int determineFirstResult(int maxResults) {
if (pageData.isLastPage()) return getFirstResult(count, maxResults);
return maxResults * pageNumber;
}

Но теперь у вас есть зависимость; графа должна быть определена перед вызовом determineFirstResult() в качестве письменного. Так может сделать граф ленивый нагруженных местах; если она просила и нуль, тогда (и только тогда) вы getCountFromDb.

4
ответ дан 22 июня 2011 в 06:06 Источник Поделиться