Простая функция в Java


Это вывод подтверждает для этой функции:

    assertEquals(0, obj.generateListSize(0));
    assertEquals(1, obj.generateListSize(1));
    assertEquals(1, obj.generateListSize(2));
    assertEquals(3, obj.generateListSize(3));
    assertEquals(3, obj.generateListSize(4));
    assertEquals(5, obj.generateListSize(5));
    assertEquals(5, obj.generateListSize(6));
    assertEquals(7, obj.generateListSize(7));
    assertEquals(7, obj.generateListSize(8));
    assertEquals(7, obj.generateListSize(9));
    assertEquals(10, obj.generateListSize(10));
    assertEquals(10, obj.generateListSize(11));
    assertEquals(10, obj.generateListSize(12));

и это моя реализация:

public int generateListSize(int listSize) {
        int result;
        if (listSize < 1) {
            result = 0;
        } else if (7 < listSize && listSize < 10) {
            result = 7;
        } else if (10 <= listSize) {
            result = 10;
        } else if (listSize % 2 == 0) {
            result = listSize - 1;
        } else {
            result = listSize;
        }
        return result;
    }

Эта функция используется для усечения списка 1,3,5,7,10 элементов. Когда список состоит из 8 элементов, затем вернуться на 7.



736
6
задан 27 сентября 2011 в 08:09 Источник Поделиться
Комментарии
5 ответов

Я бы не стал искать "правило", просто сохранить "усечении очков"

private final static int[] truncateSizes = {10,7,5,3,1,0};

public int generateListSize(int listSize) {
for(int truncateSize : truncateSizes) {
if (listSize >= truncateSize) {
return truncateSize;
}
}
throw new IllegalArgumentException("Negative list size");
}

16
ответ дан 27 сентября 2011 в 02:09 Источник Поделиться

Это выглядит как очень произвольная функция для меня.
Я опасаюсь длинных списков , еслизаявления, но если функция действительно является произвольным, я не знаю как улучшить.

Чистки рядов я бы переехал в другое, если (10 < listSize) , чтобы сделать его вторым условным. Таким образом, межевых дел распространяется в первую очередь. Модульные тесты еще пройти то.

Редактировать:
Мне удалось создать правило для диапазона [1,8]. Однако, это не меняет числа условные, так как значение, возвращаемое для listSize==9 остается "особым случаем". Кроме того, она опирается на сдвиг битов, которые я не считаю хорошей практикой программирования, при использовании правила. Для тех, кому интересно, я привожу его здесь:

int result = 0;
if (listSize < 1) {
result = 0;
} else if ( listSize < 9 ) {
result = ( ( ( 1 + listSize ) >> 1 ) << 1 ) - 1;
} else if ( listSize == 9 ) {
result = 7;
} else if (10 <= listSize) {
result = 10;
}

В данном случае я ставил Если (10 <= listSize) внизу. Таким образом, различных случаях сортируются по значению listSize , что они принимают.

2
ответ дан 27 сентября 2011 в 10:09 Источник Поделиться

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

public int generateListSize(int listSize) {
int result;
if (listSize < 1) {
result = 0;
} else if (listSize >= 10) {
result = 10;
} else if (listSize == 9) {
result = 7;
} else {
result = listSize - (1 - listSize % 2);
}
return result;
}

2
ответ дан 27 сентября 2011 в 11:09 Источник Поделиться

Я хотел бы написать метод испытания как:

// list sizes  = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int[] expected = { 0, 1, 1, 3, 3, 5, 5, 7, 7, 7, 10, 10, 10 };

for (int i = 0; i < results.length; ++i) {
assertEquals(expected[i], obj.generateListSize(i));
}

0
ответ дан 2 октября 2011 в 09:10 Источник Поделиться

Слишком много твердят в один тест дурной запах. Это утверждение рулетка и вы потеряли локализация дефекта. Если первый assertEquals бросает исключение, вы ничего не знаете о результатах других вызовов assert, которые могут быть важны, поскольку они могут помочь отладки и локализация дефекта.

Решение простое, использовать параметризованный тест:

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ClientTest {

private final int expected;
private final int input;

public ClientTest(final int expected, final int input) {
this.expected = expected;
this.input = input;

}

@Parameters
public static Collection<Object[]> data() {
final Object[][] data = new Object[][] {
{ 0, 0 }, { 1, 1 }, { 1, 2 }, { 3, 3 }, { 3, 4 }, { 5, 5 }, { 5, 6 },
{ 7, 7 }, { 7, 8 }, { 7, 9 }, { 10, 10 }, { 10, 11 }, { 10, 12 } };
return Arrays.asList(data);
}

@Test
public void testGenerateListSize() throws Exception {
final Client obj = new Client();
assertEquals(expected, obj.generateListSize(input));
}

}

0
ответ дан 16 декабря 2011 в 11:12 Источник Поделиться