Очистить код для оператора if else - PullRequest
0 голосов
/ 25 мая 2011

Вот пример кода, который я ищу, чтобы сделать его более эффективным. Я вижу множество if else операторов ,

Может ли кто-нибудь помочь мне сделать его простым и сократитьколичество строк кода

if(mmPageCounter.equalsIgnoreCase("trueNotFull")){
    if(whatPageNext.equalsIgnoreCase("first"))
        accountListSize = 5;
    else
        accountListSize = acctIdList.size();
}else if(mmPageCounter.equalsIgnoreCase("true")){
    if(whatPageNext.equalsIgnoreCase("first"))
        accountListSize = 5;
    else
        accountListSize = 10;
}else if(mmPageCounter.equalsIgnoreCase("false")){
    if(whatPageNext.equalsIgnoreCase("alwaysFirst"))    
        accountListSize = acctIdList.size();
}

В приведенном выше коде на основе mmPageCounter на основе значения я устанавливаю индекс цикла For либо на полную емкость, либо на фактическое значение

Полная емкость означает, что цикл for будет повторять только 10 элементов

ps: у меня работает код, и он в порядке, но я ищу только точную настройку

Если естьодин из них имеет какие-либо тонкие советы по настройке, пожалуйста, поделитесь ссылками.

Ответы [ 4 ]

1 голос
/ 25 мая 2011

Это не делает это быстрее, но уменьшает код, вы можете заменить:

if(whatPageNext.equalsIgnoreCase("first"))
    accountListSize = 5;
else
    accountListSize = 10;

на:

accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : 10;

и:

if(whatPageNext.equalsIgnoreCase("first"))
    accountListSize = 5;
else
    accountListSize = acctIdList.size();

на:

accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : acctIdList.size();

ОБНОВЛЕНИЕ:

Если mmPageCounter может быть только "trueNotNull", "true" или "false", то я думаю, что этот код эквивалентен:

int maxsize = mmPageCounter.equalsIgnoreCase("true") ? 10 : acctIdList.size();

if(mmPageCounter.equalsIgnoreCase("false")){
    if(whatPageNext.equalsIgnoreCase("alwaysFirst"))    
        accountListSize = accountListSize = acctIdList.size();
} else {
  accountListSize = whatPageNext.equalsIgnoreCase("first") ? 5 : maxsize
}

но вы должны написать тесты для текущего кода и проверить, что этот код ведет себя точно так же в крайних случаях.

1 голос
/ 25 мая 2011

Я бы написал это наоборот. Когда размер учетной записи должен быть установлен на 10? Когда размер учетной записи должен быть установлен на 5?

if(shouldBeFive()){
  accountListSize = 5;
} else if (shouldBeTen()){
  accountListSize = 10;
} else{
  accountListSize = acctIdList.size()
}

Также вы можете переключить кейс в java7.

0 голосов
/ 25 мая 2011

Мое предложение состоит не в том, чтобы сделать ваш код короче, а сделать его более расширяемым и простым в обслуживании. Это, однако, сделает код клиента намного короче.

Я бы выбрал enum, но без оператора switch, так как я могу определить стратегию здесь, и я бы предпочел инкапсулировать логику вне клиента. Кроме того, я бы предоставил абстракцию (интерфейс), которая позволила бы мне или другим в будущем предлагать альтернативные реализации, не добавляя новые константы в enum. Литеральные значения для ваших строк и чисел я бы определил как константы (в абстракции, если это имеет смысл)

Вот абстракция "стратегии":

interface PageCounter {
    String FIRST = "first";
    String ALWAYS_FIRST = "alwaysFirst";

    int FIRST_SIZE = 5;
    int DEFAULT_SIZE = 10;

    int getAccountListSize(String whatPageNext, List<?> acctIdList);
}

Вот enum, реализующий интерфейс PageCounter и предоставляющий реализации по умолчанию:

enum DefaultPageCounter implements PageCounter {
    TRUENOTFULL {
        @Override
        public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
            return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : acctIdList.size();
        }
    },
    TRUE {
        @Override
        public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
            return FIRST.equalsIgnoreCase(whatPageNext) ? FIRST_SIZE : DEFAULT_SIZE;
        }
    },
    FALSE {
        @Override
        public int getAccountListSize(String whatPageNext, List<?> acctIdList) {
            // some default (non)value is required here: -1 can be whatever.
            return ALWAYS_FIRST.equalsIgnoreCase(whatPageNext) ? acctIdList.size() : -1;
        }
    };
}

Вот ваш код (намного короче в клиенте и не знает о существующих возможностях)

PageCounter counter = DefaultPageCounter.valueOf(mmPageCounter.toUpperCase());
int accountListSize = counter.getAccountListSize(whatPageNext, acctIdList);

counter может быть предоставлен некоторым фабричным методом, чтобы вы могли переключать реализацию PageCounter для подклассов (поэтому я все-таки решил использовать интерфейс), но я не хотел усложнять это. чем это уже есть.

0 голосов
/ 25 мая 2011

Если вы заранее знаете все возможные значения mmPageCounter и whatPageNext, вы можете использовать HashMap.

Во время инициализации:

accountListSizes = new HashMap<String, Integer>();
accountListSizes.put("trueNotFull|first", 5);
accountListSizes.put("true|first", 5);
...

Во время вычисления:

String key = String.format("%s|%s", mmPageCounter, whatPageNext);
Integer value = accountListSizes.get(key);
if (value == null) {
    accountListSize = acctIdList.size();
} else {
    accountListSize = value;
}

Эта реализация немного медленнее, чем ваша, но ее намного легче читать и расширять.Вы можете изменить отображение даже во время выполнения.

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